【问题标题】:How do I print a block without it being evaluated in Rebol如何打印一个块而不在 Rebol 中对其进行评估
【发布时间】:2014-01-21 15:43:40
【问题描述】:

我正在尝试组装一个代码生成器,并且需要打印一个块(其中包含一些目标语言的代码),而不对其(即块)进行评估。我该怎么做呢?

编辑 1 -- 我知道如果我将 Ruby 代码嵌入为字符串,这很容易实现,但由于 Rebol 解析器似乎不介意,我想为什么不呢?

rebol []

x: [
    [sym0 [(1..10).map{|n| puts n}]]
    [sym1 [foo << [1, 2, 3]]]
]

print x/1/1 ;prints sym0
print x/1/2 ;fails as print tries to evaluate the block

【问题讨论】:

  • 我想补充一点,我在块中嵌入了 Ruby 代码,当我尝试塑造或探测块时,Rebol 会删除所有大括号并弄乱其中包含的任何字符串和数字跨度>
  • 你能在问题中更明确地列出你的场景吗? (有一个“编辑”按钮。)我不太确定你在这里的意思,但是 Ruby 代码通常与 Rebol 解析器不兼容。因此,在一般情况下,Ruby 必须位于字符串常量中,除非您只是使用该语言的某个子集。
  • 查看下面的更新答案。

标签: reflection code-generation rebol homoiconicity


【解决方案1】:

试试模具。它从 Rebol 数据生成一个字符串:

>> mold [1 + abc + 12-Dec-2012]
== "[1 + abc + 12-Dec-2012]"

请注意,MOLD 并不是 LOAD 的完美对应物。在上述情况下,您可以将该结构从字符串中加载回来……但在一般情况下,一些绑定信息会丢失。


编辑 1:嗯,你正在尝试做的事情很古怪。你从模具中得到的是:

>> mold x/1/2
== {[(1.0.10) .map "|n| puts n"]}

这说明了 Rebol 的好奇天性,即很多东西都是合法的,以至于其他语言会产生语法错误。这就是使它成为编写 DSL 的适应性强的类英语系统的部分原因。

但是... Rebol 根本不是 Ruby。符号的词汇解释是完全不同的。这意味着您要么必须做一些事情 Rubol-like 将 Ruby 代码“塞进” Rebol 的模型中作为一种“Ruby DOM”......然后用 ruby-mold 强制它退出(这可能很酷,我'米为它)。或者你必须使用一个字符串。

【讨论】:

  • 感谢 HostileFork,我知道 Rebol 不是 Ruby,反之亦然,这就是为什么我想打印未评估的块。对不起,你认为这很古怪!我不知道Rubol,谢谢,我会去看看。
【解决方案2】:

使用探针。 PROBE 不评估它打印的数据。它还会返回您提供给它的相同数据,因此您可以将 PROBE 放在代码中的任何位置以检查您的值,这非常适合调试。

MY-FUNC MY-DATA
MY-FUNC PROBE MY-DATA ; will print unevaluated MY-DATA to console
PROBE MY-FUNC MY-DATA ; will print unevaluated output of MY-FUNC to console 

【讨论】:

  • 谢谢,但我担心它在我的情况下不起作用。请参阅我对这个问题的评论。
猜你喜欢
  • 1970-01-01
  • 2020-06-11
  • 2012-11-01
  • 1970-01-01
  • 2017-05-26
  • 1970-01-01
  • 2020-09-06
  • 2023-02-08
  • 2013-03-14
相关资源
最近更新 更多