我有一个宏with-voice
(defmacro with-voice (tag body)
`(format nil "<span class=\"~a\">~%~a~%</span>" ',tag ,body))它会发出一些文本,这些文本被带有类的标记包围。我知道有很多很棒的图书馆,比如CL但我只需要一些小东西.
CL-USER> (with-voice narrator "foo")
"<span class=\"NARRATOR\">
foo
</span>"这是我们想要的结果
我希望能用字符串来做这件事
(let ((s (read-from-string "(with-voice narrator \"foo\")")))
(print (eval s)))这样做是可行的:
CL-USER> (let ((s (read-from-string "(with-voice narrator \"foo\")")))
(print (eval s)))
"<span class=\"NARRATOR\">
foo
</span>"
"<span class=\"NARRATOR\">
foo
</span>但它有着可怕的eval。我尝试过使用宏和lambda来实现这个功能,但是我无法让它工作。
我很感谢你的帮助
谢谢!
发布于 2021-08-17 12:02:23
您可以在阅读形式的某个位置使用您所期望的所有符号:
(destructuring-bind (operator class text)
(read-from-string "(with-voice narrator \"foo\")")
(funcall operator class text))甚至只是期望这些形式能够发挥作用:
(apply #'funcall (read-from-string "(with-voice narrator \"foo\")"))如果您有更多不同形状的数据,您可能需要匹配这些数据,例如使用optima,或者使用eql指定程序的分派。如果读取的输入可能包含有害的意图,这也有助于验证。
https://stackoverflow.com/questions/68814338
复制相似问题