私は Common Lisp を勉強していて、Lisp と Web 開発で遊んでみたいと思っています。私の現在の問題は、含めたいすべてのJavaScriptファイルを反復処理するという単純なアイデアから来ています。私は高速起動のために SBCL と Quicklisp を使用しています。問題は、cl-who
使用しているパッケージに関連している可能性があります。
だから私は自分のパッケージを宣言し、次のように始めました:
(defpackage :0xcb0
(:use :cl :cl-who :hunchentoot :parenscript))
(in-package :0xcb0)
シンプルにするために、問題関数を減らしました。だから私はこのpage
機能を持っています:
(defun page (test)
(with-html-output-to-string
(*standard-output* nil :prologue nil :indent t)
(:script
(:script :type "text/javascript" :href test))))
これにより、目的の出力が生成されます
*(0xcb0::page "foo")
<script>
<script type='text/javascript' href='foo'></script>
</script>
:script
これで、タグを生成するマクロを作成できました。
(defmacro js-source-file (filename)
`(:script :type "text/javascript" :href ,filename)))
これは期待どおりに機能します。
*(macroexpand-1 '(0XCB0::js-source-file "foo"))
(:SCRIPT :TYPE "text/javascript" :HREF "foo")
page
ただし、これを関数に含めると:
(defun page (test)
(with-html-output-to-string
(*standard-output* nil :prologue nil :indent t)
(:script
(js-source-file "foo"))))
...新しい関数undefined function: :SCRIPT
を定義するときに、スタイル警告 ( ) が表示されます。page
また、page
関数を実行すると、次のエラーが発生します。
*(0xcb0::page "foo")
The function :SCRIPT is undefined.
[Condition of type UNDEFINED-FUNCTION]
埋め込みマクロjs-source-file
は、目的の出力を生成するという点で期待どおりに動作しますが、別の関数内で呼び出されると失敗するのはなぜですか?
PS Lisp でのマクロのトピックは、私のような初心者にとってはかなり疲れる可能性があることを知っています。しかし、現在、これが機能するはずなのに機能しないという事実に頭を悩ませることはできません!