我正在尝试组合一个代码生成器,并且需要打印一个块(包含一些目标语言的代码),而不需要它(即块)进行评估。我应该怎么做呢?
编辑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
答案 0 :(得分: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
强制它(可能是很酷,我是为了它。或者你必须使用一个字符串。
答案 1 :(得分:0)
使用PROBE。 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