我试图找出正确的用法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)
你能解释一下你需要的原因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可以修改.
在 中(funcall (frame-add-slot) subframe 'ako)))),您通过在其周围放置括号来调用 frame-add-slot。
试试(funcall #'frame-add-slot subframe 'ako)。
您的frame-add-subframe功能有几个问题:
funcall在这个例子中使用?你应该可以直接打电话frame-add-slot:(frame-add-slot subframe 'ako)funcall使用是值得的,那么你可以像这样使用它:(funcall #'frame-add-slot subframe 'ako)'ako硬编码,而是意味着以res某种方式使用?该变量未使用.| 归档时间: |
|
| 查看次数: |
1742 次 |
| 最近记录: |