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-add-slot) subframe 'ako))))

但是,当我尝试以这种方式向它传递两个参数时,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)))))

最佳答案

你能解释一下为什么你需要 FUNCALL 吗?

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

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

文字数据

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

关于Lisp - 函数的函数调用接收的参数太少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7398104/

相关文章:

lisp - Common Lisp 存在哪些后台作业处理解决方案?

recursion - 第 i 个和第 i+1 个元素循环的惯用 clojure

list - 如何在 Common Lisp 中创建等价函数?

macros - Racket 中的宏定义宏?

lisp - 如何使用 Quicklisp 安装软件包

output - LISP - 字节数组的快速输出

lisp - 访问方案中高阶过程的输入

garbage-collection - 如何完成 lisp :struct containing a pointer?

lisp - 如何将平面列表转换为嵌套的树状结构?

common-lisp - 如何在仅限 IPv6 的网络上使用 Clozure CL?