如何在没有Rebol评估的情况下打印块

时间:2014-01-03 21:05:23

标签: reflection code-generation rebol homoiconicity

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

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

2 个答案:

答案 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