Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/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
List 从lisp中的列表计算函数_List_Function_Functional Programming_Lisp - Fatal编程技术网

List 从lisp中的列表计算函数

List 从lisp中的列表计算函数,list,function,functional-programming,lisp,List,Function,Functional Programming,Lisp,我需要用lisp编写一个带有两个参数的函数-无参数函数列表和整数列表。 我需要按照第二个列表给出的顺序计算第一个列表中的函数,即(fun’(#a#b#c)-(2 0 1))应该计算c,a,b。 我试过这样的功能: (defun z4(funs kols) (funcall (nth (first kols) funs)) (z4 funs (rest kols)) ) 但总的来说,我犯了一个错误 NIL不是CONS类型 这意味着什么?我只是简单地打电话,也会犯同样的错误 (fu

我需要用lisp编写一个带有两个参数的函数-无参数函数列表和整数列表。 我需要按照第二个列表给出的顺序计算第一个列表中的函数,即(fun’(#a#b#c)-(2 0 1))应该计算c,a,b。 我试过这样的功能:

(defun z4(funs kols)
    (funcall (nth (first kols) funs))
    (z4 funs (rest kols))
)
但总的来说,我犯了一个错误

NIL不是CONS类型

这意味着什么?我只是简单地打电话,也会犯同样的错误

(funcall (first funs))

所以我假设它是从函数列表中获取函数的。如何计算从函数列表中获取的函数?

每次递归调用都会减少
kols
参数,直到它变为
nil
。当
kols
变为
nil
时,应终止递归,因此应添加终止条件的测试(即空列表):

我建议使用一种更具可读性的解决方案(由于ANSI Common Lisp标准不强制实现执行尾部调用优化,因此更可取):

在前面的示例中,我假设您运行函数是为了它们的副作用,而不是为了返回值


编辑1

正如Vatine所指出的,使用
n
和列表来提供随机访问的集合对性能不好,因此将函数存储在
向量(即一维
数组
)中可能比存储在列表中更有价值。因此,假设
funcs
是函数的
vector
,函数可以定义如下:

(defun foo (funcs order)
  (loop for n in order do (funcall (aref funcs n))))
此外,如果函数数组是
简单向量
(),我们可以用
svref
替换
aref
。前者更一般,但后者在某些实现中可能更快

可以使用以下任一方法创建函数的
简单向量

(vector #'func-a #'func-b ...)

也可以使用
生成数组
函数创建函数的
简单向量
,但前提是
:可调
:填充指针
关键字参数未指定或
为零

'(#'a #'b #'c)
不是功能a、B、C的列表。它是:

((FUNCTION A) (FUNCTION B) (FUNCTION C))
以上不是函数,但列出了第一个符号
函数
,然后是另一个符号

使用其中一个

(list #'a #'b #'c)

请注意,列表中的N是O(N),因此将函数列表转换为函数数组可能是一种速度优势。
'(#'a #'b #'c)
((FUNCTION A) (FUNCTION B) (FUNCTION C))
(list #'a #'b #'c)
'(a b c)