私は入力ストリームを受け取り、最初の行の内容に応じて異なる処理を行い、さらに入力を読み込むマクロを作成しようとしています。私は入力ストリームを受け取り、そこからいくつかの値を読み込むマクロを持つだけでは問題があります。入力ストリームを取るマクロを定義する
不自然な例:
(defmacro read-and-print (&optional in)
`(print
,(if (string= (read-line in) "greet")
`(concatenate 'string "hello" (read-line ,in))
`(read-line ,in))))
(with-input-from-string (in "greet
bob") (read-and-print in))
それでもそれは次のエラー
There is no applicable method for the generic function
#<STANDARD-GENERIC-FUNCTION SB-GRAY:STREAM-READ-LINE (1)>
when called with arguments
(IN).
[Condition of type SB-INT:COMPILED-PROGRAM-ERROR]
本当に私も最初の行のISNのための文字列を取るために機能を変更している不可解だものを生産しています作業中:
(defmacro read-and-print (command &optional in)
`(print
,(if (string= command "greet")
`(concatenate 'string "hello " (read-line ,in))
`(read-line ,in))))
(with-input-from-string (in "greet
bob")
(read-and-print (read-string in) in))
これは私に
を与えますThe value
(READ-LINE IN)
is not of type
(OR (VECTOR CHARACTER) (VECTOR NIL) BASE-STRING SYMBOL CHARACTER)
when binding SB-IMPL::STRING1
[Condition of type SB-INT:COMPILED-PROGRAM-ERROR]
これは完全に罰金を実行中:
(with-input-from-string (in "greet
bob")
(read-and-print "greet" in))
は私が欠けているwith-input-from-string
マクロについて特別な何かがありますか?私はマクロについて非常に明白な何かを見逃していると思うが、グーグルでは私はどこにもいない。
マクロへの入力はシンボルであり、ストリームではありません。あなたはストリームを受け取り、マクロで(まだ)それを実行しない*コードを生成しています。 – wvxvw
あなたのマクロは狂っています。マクロ展開時にストリーム*オブジェクト*が渡されることを望みます。私たち(ab)が 'eval'を使わない限り、これは起こりません。もしそれが起こるなら、マクロはマクロ展開時にストリームから読み込みたいと思っています。ストリームが特定の文字列を生成する場合、マクロはコード自体にリテラルとして埋め込まれた同じストリームオブジェクトを持つコードを生成したい。 – Kaz