オブジェクト指向カウンターをプログラムする必要があります。最初に、関数 make-object はオブジェクト a と b を内部状態 0 でインスタンス化する必要があります。次に、「メソッド」: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))
「first」の代わりに「:inc」を使用してメソッドを呼び出すために、次のことを試みました。
(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))))))
これは私が望んでいたことをします。