Lisp-funcall函数接收的参数太少?

Lisp-funcall函数接收的参数太少?,lisp,common-lisp,Lisp,Common Lisp,我正在试图找出funcall的正确用法。我有这个功能: (defun frame-add-slot (frame slot) (push (list slot) (rest (assoc frame *frames*)))) 我试图让另一个函数调用它 (defun frame-add-subframe (superframe subframe) (let ((res (push (list subframe) (rest *frames*)))) (funcall (frame

我正在试图找出
funcall
的正确用法。我有这个功能:

(defun frame-add-slot (frame slot)
  (push (list slot) (rest (assoc frame *frames*))))
我试图让另一个函数调用它

(defun frame-add-subframe (superframe subframe)
  (let ((res (push (list subframe) (rest *frames*))))
    (funcall (frame-add-slot) subframe 'ako))))
但是,当我尝试以这种方式传递两个参数时,clisp告诉我被调用的函数接收的参数太少。我做错了什么<代码>*框架*是我的知识库。看起来是这样的:

(setf *frames* '((mammal
                  (eats 
                   (:value meat)
                   (:if-needed (food))))
                 (4-legged-animal
                  (ako
                   (:type mammal)
                   (:default beings))
                  (blood
                   (:type warm-blooded)))
                 (husky
                  (ako
                   (:type dog))
                  (origin
                   (:value alaska)
                   (:default north-america))
                  (roots
                   (:value unknown)))
                 (dog 
                  (ako 
                   (:type 4-legged-animal))
                  (exterior 
                   (:value furry)
                   (:default skin)))
                 (abner
                  (isa 
                   (:type husky)
                   (:default dog))
                  (shape 
                   (:weight 40-lbs)
                   (:height 20-inches)
                   (:color brown))
                  (acts
                   (:demeanor friendly)
                   (:sometimes rough)))
                 (gypsy
                  (isa 
                   (:default dog))
                  (acts
                   (:demeanor unpredictable))
                  (shapes
                   (:weight 45-lbs)
                   (:color black-and-brown)))))
(funcall(frame add slot)子帧“ako”)
中,通过在其周围放置paren来调用frame add slot


请尝试
(funcall#“frame-add-slot subframe”ako)

您的
frame add subframe
功能有几个问题:

(defun frame-add-slot (frame slot)
  (push (list slot) (rest (assoc frame *frames*))))
  • 在这种情况下,为什么要使用
    funcall
    ?您应该能够直接调用
    frame add slot
    (frame add slot subframe'ako)
  • 如果
    funcall
    的用法是值得的,那么您可以这样使用它:
    (funcall#'frame-add-slot subframe'ako)
  • 我假设您不是指定“ako”硬编码,而是想以某种方式使用
    res
    ?该变量未使用

  • 您能解释一下为什么需要
    FUNCALL

    FRAME-ADD-SLOT
    是一个正常命名的函数,您可以这样调用它,而无需
    FUNCALL

    (defun frame-add-subframe (superframe subframe)
      (let ((res (push (list subframe) (rest *frames*))))
        (frame-add-slot subframe 'ako))))
    
    文字数据


    稍后在代码中将
    *帧*
    设置为常量文字数据。在函数中,您正在修改此常量数据。在标准通用Lisp中,这些修改的效果是未定义的。您需要新分配的数据结构-可以毫无问题地修改这些数据结构。例如,请参见函数
    COPY-TREE
    ,以递归方式创建深度嵌套列表的新副本。复制树的结果可以修改。

    顺便问一下,这是家庭作业问题吗?