首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从字符串读取窗体时计算宏

从字符串读取窗体时计算宏
EN

Stack Overflow用户
提问于 2021-08-17 08:47:27
回答 1查看 52关注 0票数 0

我有一个宏with-voice

代码语言:javascript
复制
(defmacro with-voice (tag body)
  `(format nil "<span class=\"~a\">~%~a~%</span>" ',tag ,body))

它会发出一些文本,这些文本被带有类的标记包围。我知道有很多很棒的图书馆,比如CL但我只需要一些小东西.

代码语言:javascript
复制
CL-USER> (with-voice narrator "foo")
"<span class=\"NARRATOR\">
foo
</span>"

这是我们想要的结果

我希望能用字符串来做这件事

代码语言:javascript
复制
(let ((s (read-from-string "(with-voice narrator \"foo\")")))
  (print (eval s)))

这样做是可行的:

代码语言:javascript
复制
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来实现这个功能,但是我无法让它工作。

我很感谢你的帮助

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-17 12:02:23

您可以在阅读形式的某个位置使用您所期望的所有符号:

代码语言:javascript
复制
(destructuring-bind (operator class text)
    (read-from-string "(with-voice narrator \"foo\")")
  (funcall operator class text))

甚至只是期望这些形式能够发挥作用:

代码语言:javascript
复制
(apply #'funcall (read-from-string "(with-voice narrator \"foo\")"))

如果您有更多不同形状的数据,您可能需要匹配这些数据,例如使用optima,或者使用eql指定程序的分派。如果读取的输入可能包含有害的意图,这也有助于验证。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68814338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档