COMMON LISP JP > Archives > 2011/05/22

2011/05/22 07:11:28 UTCPocket
#
Lispでニューロンモデルでも作成してみようとおもいましてlambdaを返す、マクロを書いてみたのですが、帰ってきた関数の実行方法はどのようにすれば良いのでしょうか
#
(defmacro create-neuron (inputs weights threshold)
  (let ((gen-i (gensym))
	(gen-j (gensym))
	(gen-inputs (mapcar #'(lambda (x) (gensym)) inputs)))
  `(lambda ,gen-inputs
     (if (>= ,threshold (loop for ,gen-i in (list ,@gen-inputs) for ,gen-j in ',weights sum (* ,gen-i ,gen-j)))
	 1
	 0))))
#
このようなマクロを作成して
#
(macroexpand-1 '(create-neuron (i j k) (1 1 1) 2))
(LAMBDA (#:G1055 #:G1056 #:G1057)
  (IF (>= 2
          (LOOP FOR #:G1053 IN (LIST #:G1055 #:G1056 #:G1057)
                FOR #:G1054 IN '(1 1 1)
                SUM (* #:G1053 #:G1054)))
      1
      0))
#
のようにgensymされた関数がかえってきているのですが、
#
このマクロが返す関数を呼びだすにはどのようにするのでしょうか。
#
((create-neuron (i j k) (1 1 1) 2) 1 1 1)
#
と単純にするとillegal function formエラーが発生します。おそらく初歩だとおもうのですが、
#
どうも全くおもいだせなくなってしまっています。
2011/05/22 07:17:45 UTCsnmsts
#
funcall
2011/05/22 07:18:49 UTCPocket
#
なるほど、(funcall (create~~) arg)のようにすれば良いのですね。
#
ありがとうございます。
#
初歩的な質問をしてしまい、もうしわけありませんでした。
2011/05/22 07:20:12 UTCsnmsts
#
繰り返しですが、初歩的な質問歓迎です。
#
lambda式はfuncall無しで通るのになんでlambdaに書き替えされるマクロは駄目なのか問題と一緒に嵌るところのような気がします。