抱歉如果下面的讨论似乎有些含糊不清,但需要说的东西太多了。
我只有Lisp的理论知识,没有实际操作经验。
另一方面,Forth可能(但通常情况下不会)在语言内部具有完整的元编程功能。但元编程是可以考虑和实现的,只是缺少一个连贯的语法。我认为在Lisp中也存在同样的情况。
我已经用包含在类似Forth语言的小范式中的非常干净的解决方案实现了这个可能性。为了使用元编程,我们应该能够引用我们所写的内容。因此,当我们编写一个立即执行的程序时:
bread eat
我们应该能够只是引用同一句话的意图而不必立即执行它,以便将来可以参考。可以通过写例如来实现这一点。
{ bread eat }
上述短语可能会导致在堆栈上留下创建的对象。但是,由于我们创建了一个新词作为“{”和“}”,我们也有权引用它们。
因此,我们可以参考:
{ bread
我们应该如何称呼它?一种尝试性的语法是:
{{ { bread }}
。
如果我们给前面的短语命名为
XXX
,我们可以将初始短语写成:
XXX eat }
上面的短语应该正确地将其留在堆栈上。
{ bread eat }
由于我不知道我说的话是否完全符合您的要求,因此简单地说,通过上述推理及其在Forth中的实现,每个单词都会获得执行级别,这定义了单词的元编程级别。
显然,我们有第一个无限级和每个连续级。因此,执行级别基于数学无限大。
我已经在某种Forth中实现了上述内容,在第一级别(低于无限大)中一切顺利。例如,我能够更改以下语法:
{ bread eat } { tomatos eat } x 3 = if
into:
{ bread eat | tomatos eat } x 3 = if
这是通过将
|
定义为
} {
来完成的,如下所示:
{{ } { }} "|" define
或者,如果你更喜欢这样说:
2{ } { 2} "|" define
上述方法将元语言插入到具有正确语法的语言中,并使其成为语言。
因此,在我看来,Lisp和Forth都具有元编程的可能性,但都缺乏将其作为语言集成部分的可能性。
我在
napl.wikispaces.com上有更多详细信息。
LANG1
中,您无法实现已在LANG2
中实现的foo
,因为您缺少LANG1
具有而LANG2
没有的bar
。” 在为什么有些问题被标记为“暂停”?中没有提到“答案过多”作为关闭问题的原因。 - user3750103