関数を他のシンボルに束縛することができますか?
例えば、SchemeのREPLに以下を入力すると期待通り4
が表示されます。
Scheme
1 (let ((x *)) 2 (x 2 2)) 34
同じことをSBCLで試すと、"illegal function call"というエラーになります。そこで、x
をinspect
してみると束縛されていないようです。
LISP
1CL-USER> (let ((x *)) 2 (inspect x)) 3 4The object is a SYMBOL. 50. Name: "NIL" 61. Package: #<PACKAGE "COMMON-LISP"> 72. Value: NIL 83. Function: "unbound" ;; <------ 束縛されていない 94. Plist: NIL 10>
グローバル変数でも同じ結果になります。
LISP
1CL-USER> (defparameter y *) 2Y 3CL-USER> (inspect 'y) 4 5The object is a SYMBOL. 60. Name: "NIL" 71. Package: #<PACKAGE "COMMON-LISP"> 82. Value: NIL 93. Function: "unbound" ;; <------ 束縛されていない 104. Plist: NIL 11> q 12; No values
Common Lispでは関数をシンボルに束縛することはできないのでしょうか?
よろしく、お願いします。
(let ((x '*)) (funcall x 2 2))
か、
(let ((x '*)) (apply x '(2 2)))
でしょう。
Common Lispの処理系が手元に無いですが、Emacs-Lispだと、letでは無理ですが、
(fset 'x '*)
(x 2 2)
=> 4
melianさん、otnさん、
お返事ありがとうございます。'funcall`と`apply`をつかったら、出来ました。`fset`はcommon-lispでは"undefined function"になりました。`setf`で試してみましたができませんでした。
お2人の知恵を貸していただいて、ありがとうございます。
「関数」でなく「関数名(のシンボル)」をセットすれば良いのであれば、funcallで良いかと思います。
ありがとうございます。 (慣れないせいか、funcall の表記のほうが、見やすいです)
参考までに、setf の場合は、
(setf (fdefinition 'x) #'*)
とします。
Lisp-1 と Lisp-2 の違いの話し?
https://scrapbox.io/zenwerk/Lisp1_%E3%81%A8_Lisp-2

あなたの回答
tips
プレビュー