首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lisp - funcall of function收到的参数太少了?

Lisp - funcall of function收到的参数太少了?
EN

Stack Overflow用户
提问于 2011-09-13 15:12:41
回答 3查看 2.2K关注 0票数 5

我正在尝试找出funcall的正确用法。我有这个函数:

代码语言:javascript
复制
(defun frame-add-slot (frame slot)
  (push (list slot) (rest (assoc frame *frames*))))

我正在尝试让另一个函数调用它。

代码语言:javascript
复制
(defun frame-add-subframe (superframe subframe)
  (let ((res (push (list subframe) (rest *frames*))))
    (funcall (frame-add-slot) subframe 'ako))))

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

代码语言:javascript
复制
(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)))))
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-09-13 15:42:44

(funcall (frame-add-slot) subframe 'ako))))中,通过将括号括起来来调用frame-add-slot。

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

票数 5
EN

Stack Overflow用户

发布于 2011-09-13 16:08:40

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

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

代码语言:javascript
复制
(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的结果可以修改。

票数 8
EN

Stack Overflow用户

发布于 2011-09-13 15:46:19

您的frame-add-subframe函数有几个问题:

  1. 为什么要在这种情况下使用funcall?您应该能够直接调用frame-add-slot(frame-add-slot subframe 'ako)
  2. If funcall的用法是值得的,然后您可以这样使用它:(funcall #'frame-add-slot subframe 'ako)
  3. I假定您并没有指定硬编码的res,而是打算以某种方式使用res?该变量未使用。
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7398104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档