Lisp 在运行时按名称调用函数
我意识到可以使用#的PRINT引用函数来引用PRINT函数。如果我们有一个列表S,其中第一个元素是“PRINT”,我们可以使用#(car S)引用它吗 假设我在看一个列表,列表中的元素是原子,它们是一些函数的名称。目前,我可以这样做:Lisp 在运行时按名称调用函数,lisp,common-lisp,Lisp,Common Lisp,我意识到可以使用#的PRINT引用函数来引用PRINT函数。如果我们有一个列表S,其中第一个元素是“PRINT”,我们可以使用#(car S)引用它吗 假设我在看一个列表,列表中的元素是原子,它们是一些函数的名称。目前,我可以这样做: (defun aritheval (S) (funcall (cond ((eq '+ (car S)) #'+) ((eq '- (car S)) #'-) ((eq
(defun aritheval (S)
(funcall
(cond
((eq '+ (car S)) #'+)
((eq '- (car S)) #'-)
((eq '* (car S)) #'*)
((eq '/ (car S)) #'/)
)
'2
'3
)
)
此函数将根据列表S中的第一个元素计算2+3、2-3、2*3或2/3。S包含这些函数的名称。#(car S)没有意义。语法存在,但表示带有符号CAR和S的向量
使用
或
您的函数是非Lispy格式的
正确的Lisp代码中未使用尾随括号。您也不需要引用数字。数字是自我评估的,它们对自己进行评估。此外,我们现在可能更喜欢先车后车,休息后CDR。函数的作用相同,但名称更好。每当我们处理简单的列表时,第一、第二、第三。。。其余的都用上了
(defun aritheval (S)
(funcall (cond ((eq '+ (car S)) #'+)
((eq '- (car S)) #'-)
((eq '* (car S)) #'*)
((eq '/ (car S)) #'/))
2 3)))
因为符号可以用作全局函数的名称,所以不需要上面的内容
鉴于符号到函数的映射是相同的,下面的函数也会这样做
(defun aritheval (s)
(funcall (first s) 2 3)))
#(汽车)毫无意义。语法存在,但表示带有符号CAR和S的向量
使用
或
您的函数是非Lispy格式的
正确的Lisp代码中未使用尾随括号。您也不需要引用数字。数字是自我评估的,它们对自己进行评估。此外,我们现在可能更喜欢先车后车,休息后CDR。函数的作用相同,但名称更好。每当我们处理简单的列表时,第一、第二、第三。。。其余的都用上了
(defun aritheval (S)
(funcall (cond ((eq '+ (car S)) #'+)
((eq '- (car S)) #'-)
((eq '* (car S)) #'*)
((eq '/ (car S)) #'/))
2 3)))
因为符号可以用作全局函数的名称,所以不需要上面的内容
鉴于符号到函数的映射是相同的,下面的函数也会这样做
(defun aritheval (s)
(funcall (first s) 2 3)))
如何引用函数名存储在列表中的函数?假设列表S已由(setq S'(打印还原))定义,并且
apply
和funcall
都使用a,因此具有与其关联的函数定义的符号是有效参数。另外,setq
没有定义任何内容,它只设置现有绑定。使用defparameter
或defvar
定义全局变量。如何引用函数名存储在列表中的函数?假设列表S已由(setq S'(打印还原))定义,并且apply
和funcall
都使用a,因此具有与其关联的函数定义的符号是有效参数。另外,setq
没有定义任何内容,它只设置现有绑定。使用defparameter
或defvar
定义全局变量。