gpt4 book ai didi

object - Lisp:基本的面向对象计数器

转载 作者:太空宇宙 更新时间:2023-11-03 18:40:27 28 4
gpt4 key购买 nike

我必须编写一个面向对象的计数器。首先,函数 make-object 应该实例化内部状态为 0 的对象 a 和 b。然后调用“方法”:inc、:dec 和 :res(增加、减少、重置)。它应该看起来像这样:

> (setq a (make-object) b (make-object))
...
> (funcall a :inc)
1
> (funcall a :inc)
2
> (funcall a :res)
0
> (funcall a :dec)
-1
> (funcall b :inc)
1

目前我的解决方案是这样的:

(defun make-object ()
(let ((counter 0))
(list #'(lambda () (incf counter))
#'(lambda () (setf counter 0))
#'(lambda () (decf counter)))))

(setq a (make-object) b (make-object))

我可以实例化 a 和 b 并调用这些方法

(funcall (first a))
(funcall (second b))
(funcall (third a))

我尝试了以下方法来使用“:inc”而不是“first”来调用方法:

(defun myfuncall (var fun) 
(funcall ((cond ((equal fun ":inc") first)
((equal fun ":res") second)
((equal fun ":dec") third))
var)))

但是有错误

While compiling MYFUNCALL :
In the form (#1=(COND ((EQUAL FUN ":inc") FIRST)
((EQUAL FUN ":res") SECOND)
((EQUAL FUN ":dec") THIRD))
VAR), #1# is not a symbol or lambda expression.
[Condition of type CCL::COMPILE-TIME-PROGRAM-ERROR]

谁能帮帮我?如何让 funcall 为我做正确的事?


找到解决方案。

(defun make-object () 
(let ((count 0))
(lambda (msg)
(case msg
((:inc) (incf count))
((:dec) (decf count))
((:res) (setq count 0))))))

这就是我想要的。

最佳答案

这几乎是可行的。

(defun myfuncall (var fun) 
(funcall ((cond ((equal fun ":inc") first)
((equal fun ":res") second)
((equal fun ":dec") third))
var)))

CONDvar 形式周围有一个额外的 ( ... )。你需要删除它。

此外,first(等)将是一个变量引用。您需要调用 (first var)

一旦你开始工作,你可能想以不同的方式编写你的代码。如果 MAKE-OBJECT 将返回单个函数而不是三个函数的列表会怎么样。这怎么行?

下一个问题

((equal fun ":inc") 'first var)

以上没有任何意义。您想对 var 的结果调用函数 FIRST。然后这将返回一个函数,然后通过 FUNCALL 调用该函数。

关于object - Lisp:基本的面向对象计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17487720/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com