如何在Racket中评估字符串

14
我想了解如何让eval函数读取一个字符串并计算其中的内容。

目前我知道

> (eval '(+ 1 2))
   3

但我对 racket 的使用并不是很了解。所以目前我正在尝试做到这一点:

> (eval "(+ 1 2)")
   3
任何建议或有用资源的链接都将不胜感激。

1
我认为这就是你想要的:https://dev59.com/OEXRa4cB1Zd3GeqPvN23 - Scott Hunter
4
大多数惯用的 Racket 代码避免使用 eval。也许你有必须要用到它的例子,但你可能需要阅读这篇关于在 Racket 中使用 eval 的文章。 - Asumu Takikawa
1个回答

22
你想要使用 open-input-stringread 进行协作。像这样:

-> (eval (read (open-input-string "(+ 1 2)")))
3

您还可以使用with-input-from-string

-> (with-input-from-string "(+ 1 2)"
     (lambda () (eval (read))))
3

9
我更喜欢使用(eval (call-with-input-string "(+ 1 2)" read))。为什么呢?1.在eval之前,字符串端口会自动关闭(不像open-input-string的解决方案;好吧,对于字符串端口,这可能并不太重要(除非你使用的是Guile ;-)), 但还是存在这个问题); 2.它不使用fluids/parameters(不像with-input-from-string的解决方案)。 - C. K. Young
@ChrisJester-Young 有没有一些情况,我们会想要使用这个来修改代码而不是宏?我能想到一些,但我不太了解宏,不能确定。 - Nathan majicvr.com
1
@frank 个人而言,我会在我能想到的所有这种情况下使用宏,但是如果您有更好地使用eval的例子,请随时发布,我会告诉您。 :-D - C. K. Young
@ChrisJester-Young 我正在编写代码,从人体的体素表示中生成三角网格皮肤,而两个代码部分之间唯一的区别是某些变量名称中的“top”与“bottom”。我可以稍后在某个地方发布它,但整个源代码可能对SO来说太长了。不过,我总是可以发布最相关的部分。我想如果我将其标记为“Racket”,你很可能会看到它;我在这个网站上看到你在Racket问题上到处都有贡献。感谢您的所有贡献! - Nathan majicvr.com
1
@frank 你可以把你的代码放在Gist里,然后在这里链接它。而且,我很高兴能够帮助你。 :-) - C. K. Young

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接