Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parameters 在lisp中按值传递参数_Parameters_Lisp_Common Lisp_Pass By Value - Fatal编程技术网

Parameters 在lisp中按值传递参数

Parameters 在lisp中按值传递参数,parameters,lisp,common-lisp,pass-by-value,Parameters,Lisp,Common Lisp,Pass By Value,我遇到的问题是,我无法回避lisp通过值而不是引用传递数组的事实 当我研究这个问题时,其他人问题的解决方案分为四类 使用闭包 功能性思考 使用宏 使用全局变量,即defparameter 1和2)我看不出前两种解决方案有什么用处。也许我不明白闭包是如何工作的,或者如何从功能上思考 3) 我制作了宏而不是函数,但是当函数在自身上递归时它们就不起作用了(除非它们起作用,而我只是没有正确地编写它们) 4) 我不喜欢全球化的想法 我写的很多函数都有这个问题。我获得的最大成功是在函数返回时返回数组。但是当

我遇到的问题是,我无法回避lisp通过值而不是引用传递数组的事实

当我研究这个问题时,其他人问题的解决方案分为四类

  • 使用闭包
  • 功能性思考
  • 使用宏
  • 使用全局变量,即defparameter
  • 1和2)我看不出前两种解决方案有什么用处。也许我不明白闭包是如何工作的,或者如何从功能上思考

    3) 我制作了宏而不是函数,但是当函数在自身上递归时它们就不起作用了(除非它们起作用,而我只是没有正确地编写它们)

    4) 我不喜欢全球化的想法

    我写的很多函数都有这个问题。我获得的最大成功是在函数返回时返回数组。但是当函数在数组的子集上递归时,我就卡住了

    我想要一个通用的解决方案,如何以不同的方式思考这些问题,而不是这里提交的代码的解决方案

    如果您想引用我试图编写的一段特定代码,请看这里

    我正在尝试用Lisp为HackerRank编写一些代码

    我需要一筛埃拉托斯烯(以得到素数)

    我写了以下内容,但由于上述原因,它不起作用。(我的逻辑可能也错了。)

    ;筛号是一个数组,初始元素为nil
    ;筛号仅表示从3开始的奇数
    ;i、 e.,(aref筛号n)表示值3+n+n
    ;如果(+3 n)为素数,则完成筛选时(aref筛号n)为零
    ;removed是筛号数组中从前面截断的值数
    (除筛爆震(筛号n)
    去掉第n个值,然后使用缺少前n个元素的筛号数组递归,直到(长度筛号)n(长度筛数))完成)
    (t(setf(aref筛号(1-n))t)
    (格式t“筛子爆震筛号~a~%”筛号)
    (筛击(水下筛号n)n)
    (卸下筛(筛号已移除)
    “筛子”
    (格式t“筛号~a,移除~a~%”筛号移除)
    (续)
    (=0(长度筛数))'完成)
    ((aref筛号0)(筛号1)(1+移除)))
    (t;找到一个质数!
    (筛爆震(1号水下筛)(+3已移除))
    (筛(1号水下筛)(1+移除()())))
    
    Lisp对数组使用引用。将数组传递给函数时,函数通过参数具有新引用。传递参数时,不会以任何方式复制或更改数组

    您可以使用递归:

    • 传递数组,不要一直复制新数组
    • 通过索引
    • 返回数组
    例如:

    (defun rknock (sieve-vector pos step)
      (if (>= pos (length sieve-vector))
          sieve-vector
        (progn
          (setf (aref sieve-vector pos) t)
          (rknock sieve-vector (+ pos step) step))))
    
    但简单的基于循环的迭代似乎更容易:

    (defun knock (sieve-vector start step)
      (loop for pos from start below (length sieve-vector) by step 
            do (setf (aref sieve-vector pos) t))
      sieve-vector)
    

    Lisp使用数组的引用。将数组传递给函数时,函数通过参数具有新引用。传递参数时,不会以任何方式复制或更改数组

    您可以使用递归:

    • 传递数组,不要一直复制新数组
    • 通过索引
    • 返回数组
    例如:

    (defun rknock (sieve-vector pos step)
      (if (>= pos (length sieve-vector))
          sieve-vector
        (progn
          (setf (aref sieve-vector pos) t)
          (rknock sieve-vector (+ pos step) step))))
    
    但简单的基于循环的迭代似乎更容易:

    (defun knock (sieve-vector start step)
      (loop for pos from start below (length sieve-vector) by step 
            do (setf (aref sieve-vector pos) t))
      sieve-vector)
    

    公共Lisp通过引用传递数组。问题是
    SUBSEQ
    创建了一个新数组。如果需要只传递数组的一个片段,可以使用置换数组,也可以只传递开始/结束索引。问题是
    SUBSEQ
    创建了一个新数组。如果需要只传递数组的一部分,可以使用置换数组,也可以只传递开始/结束索引。