对不起,如果下面的讨论可能看起来有点模糊,但要说的太多了。
我只有 Lisp 的理论知识,没有动手。
另一方面,Forth 可以(但普通的 Forth 没有)语言内部的完整元编程。但是元编程是可以考虑和可能的,但没有连贯的语法。我认为在 Lisp 中也会发生同样的情况。
我已经实现了一个非常干净的解决方案,其中包括在类似 Forth 的小型语言范式中的可能性。为了进行元编程,我们应该能够参考我们所写的内容。因此,当我们编写要立即执行的程序时:
bread eat
我们也应该能够在意图中引用相同的短语,而不是执行它以保留它以供以后参考。这可以通过写作来完成,例如
{ bread eat }
上面的短语可能会导致将创建的对象留在堆栈上。但是,当我们创造了一个新词 as 时{
,}
我们也有权引用它。
所以,我们可以参考:
{ bread
我们怎么能提到那个?暂定语法是:{{ { bread }}
.
如果我们给XXX
前一个短语命名,我们可以将初始短语写成:
XXX eat }
并且上面的短语应该可以正确地留在堆栈上
{ bread eat }
因为我不知道我所说的是否正是您要寻找的内容,所以只要说通过上述推理及其在 Forth 中的实现就足够了,每个单词都有一个执行级别,并定义了哪个是该单词的元编程级别.
显然,我们有第一个无穷级别和每个后续级别。所以执行级别是基于数学无穷大的。
我已经在一种 Forth 中实现了上述内容,并且在第一级(无限远)一切正常。因此,例如,我能够更改以下语法:
{ bread eat } { tomatos eat } x 3 = if
进入:
{ bread eat | tomatos eat } x 3 = if
这是通过定义|
如下来完成的} {
:
{{ } { }} "|" define
或者如果你更喜欢它:
2{ } { 2} "|" define
上面的方法以正确的语法将元语言纳入语言并将其变成语言。
所以在我看来,Lisp 和 Forth 都有元编程的可能性,但都缺乏作为语言集成部分的可能性。
我在napl.wikispaces.com上有更多详细信息。