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

Sea*_*ver 4 lisp common-lisp

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

(defun frame-add-slot (frame slot)
  (push (list slot) (rest (assoc frame *frames*))))
Run Code Online (Sandbox Code Playgroud)

而我正试图让其他功能调用它.

(defun frame-add-subframe (superframe subframe)
  (let ((res (push (list subframe) (rest *frames*))))
    (funcall (frame-add-slot) subframe 'ako))))
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试以这种方式传递两个参数时,clisp告诉我被调用的函数接收的参数太少.我究竟做错了什么?*Frames*是我的知识基础.它看起来像这样:

(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)))))
Run Code Online (Sandbox Code Playgroud)

Rai*_*wig 8

你能解释一下你需要的原因FUNCALL吗?

FRAME-ADD-SLOT是一个普通的命名函数,你可以这样称呼它 - 没有FUNCALL.

(defun frame-add-subframe (superframe subframe)
  (let ((res (push (list subframe) (rest *frames*))))
    (frame-add-slot subframe 'ako))))
Run Code Online (Sandbox Code Playgroud)

文字数据

稍后在代码中设置*frames*为常量文字数据.在您的函数中,您正在修改此常量数据.在标准的Common Lisp中,这些修改的效果是不确定的.您需要新分配的数据结构 - 可以毫无问题地修改这些数据结构.例如,请参阅COPY-TREE递归创建深层嵌套列表的新副本的函数.结果COPY-TREE可以修改.


Pau*_*han 5

在 中(funcall (frame-add-slot) subframe 'ako)))),您通过在其周围放置括号来调用 frame-add-slot。

试试(funcall #'frame-add-slot subframe 'ako)


Chr*_*ung 5

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

  1. 你为什么funcall在这个例子中使用?你应该可以直接打电话frame-add-slot:(frame-add-slot subframe 'ako)
  2. 如果funcall使用是值得的,那么你可以像这样使用它:(funcall #'frame-add-slot subframe 'ako)
  3. 我认为不是指定'ako硬编码,而是意味着以res某种方式使用?该变量未使用.