2

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

编辑 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
4

2 回答 2

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 的事情,以将 Ruby 代码“刺穿”到 Rebol 的模型中作为一种“Ruby DOM”......然后用 a 强制它退出ruby-mold(这可能很酷,我支持它)。或者你必须使用一个字符串。

于 2014-01-03T21:15:38.130 回答
0

使用探针。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 
于 2014-01-03T21:36:04.280 回答