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