【问题标题】:How to eval strings in racket如何评估球拍中的琴弦
【发布时间】:2012-05-11 01:48:34
【问题描述】:

我正在尝试了解如何让 eval 函数读取字符串并评估字符串中的内容。

目前我知道

> (eval '(+ 1 2))
   3

但我对球拍的使用不是很了解。所以目前我正在尝试获取它以便我可以这样做:

> (eval "(+ 1 2)")
   3

我们将不胜感激任何建议或有用资源的链接。

【问题讨论】:

  • 我想这就是你想要的:stackoverflow.com/q/318952/535275
  • 此外,大多数惯用的 Racket 代码都避免使用 eval。也许你有一个你真正需要的例子,但你可能想阅读this article关于在 Racket 中使用 eval 的信息。

标签: string eval racket


【解决方案1】:

您想将readopen-input-string 一起使用。像这样:

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

你也可以使用with-input-from-string:

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

【讨论】:

  • 我更喜欢使用(eval (call-with-input-string "(+ 1 2)" read))。为什么? 1. 字符串端口在eval 之前自动关闭(与open-input-string 解决方案不同;好的,所以对于字符串端口,它可能并不重要(除非你使用Guile ;-)),但仍然) ; 2. 它不使用流体/参数(与with-input-from-string 解决方案不同)。
  • @ChrisJester-Young 是否存在想要使用它来更改代码而不是宏的情况?我能想到一些,但我对宏的了解还不足以肯定地说
  • @frank 就我个人而言,我会在我能想到的所有此类情况下使用宏,但请随时发布您认为eval 更好地服务的示例,我会让您知道。 :-D
  • @ChrisJester-Young 我正在编写代码以从人体的体素表示生成三角形网格皮肤,两段代码之间的唯一区别是“顶部”与“底部”一些变量名。我可以稍后在某个地方发布它,但是整个源代码对于 SO 来说可能太长了。但是,我总是可以发布最相关的部分。我想如果我将其标记为“球拍”,您将很有可能看到它;我在这个网站上看到过你所有的球拍问题。感谢您的所有贡献!
  • @frank 您可以随时将您的代码放在 Gist 中,然后在此处链接到它。而且,永远是我的荣幸;我很高兴能帮上忙。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
  • 2018-05-31
相关资源
最近更新 更多