我必须编写一个面向对象的计数器。首先,函数 make-object 应该用内部状态 0 实例化对象 a 和 b。然后调用 'methods' :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))))))
这就是我想要的。