Lisp 在运行时按名称调用函数

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

我意识到可以使用#的PRINT引用函数来引用PRINT函数。如果我们有一个列表S,其中第一个元素是“PRINT”,我们可以使用#(car S)引用它吗

假设我在看一个列表,列表中的元素是原子,它们是一些函数的名称。目前,我可以这样做:

(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
定义全局变量。