2014-06-18 27 views
12

每個Common Lisp程序員都知道宏是一個強大的工具。除此之外,Common Lisp宏已用於在Lisp 之上添加對象方向,而不更改語言規範;讀宏是另一種具有思維彎曲能力的構造。Common Lisp宏與Forth元編程功能的比較

允許元編程的另一個程序是Forth。用一個稍微不同的方式來使用'單詞'和'生成單詞'。

我想從使用兩種語言的人那裏知道,如果通用的lisp宏和前面的構造在寬度/力量上是可比的:你能用前者做些什麼,而後者則不能用後者來做?或相反亦然?

當然,我不是在談論兩種語言的圖靈完備性:我說的是metaprogramming的能力。 C是圖靈完備的,但只有一個傻瓜會說明C宏與Common Lisp的宏相當。

+2

這比以前的版本,[Lisp和第四的宏\ [暫停\](http://stackoverflow.com/q/24272856/1281433),這是很好的更爲具體。當然,現在*這個問題已經重新打開了投票,而且這個投票結果很接近,所以對於哪些問題應該保持開放存在一些混淆。在這個問題中你要找的東西要清楚得多,但是它仍然可能是主題,因爲[「比較問題不適合\ [Stack Overflow \],因爲沒有可以發佈到的答案的界限它們。「](http://meta.stackoverflow.com/q/251328/1281433)。 –

+3

關閉原因**過於寬泛**適用於此處:「有太多可能的答案*,或者對於此格式,答案太好。」這根本不是一個**不好的問題;它不適合堆棧溢出。例如,這個問題在comp.lang.lisp中可能很好。 –

+1

這個特定的問題,「你能用前者做些什麼,後者不能做什麼,反之亦然?」可能是這裏最具體的。它仍然可能會承認太多的答案,但是如果有一件事可以做到,另一件做不到,那麼可能會給出一個相對規範的答案。 –

回答

7

在我看來,Common Lisp宏與Forth相似立即文字。 (實際上,它們與Lisp閱讀器宏最相似。)

  • 它們都是過程宏,即可以使用該語言的全部功能。

  • 他們都有權訪問源代碼輸入。

  • 它們都可以輸出任何可以用語言表達的東西。 (例如,面向對象的擴展在Lisp中,或者在第四基本控制流結構。)

的主要區別,也許將是第四「宏」輸入是字符串,而Lisp的宏上的操作解析樹。

+3

Lisp宏在S表達式上工作,我認爲它可能看起來像對非Lispers分析樹,但仍然如此。我提到這種區別,因爲在幾乎任何Lisp方言中,閱讀階段都出現在編譯階段之前,所以Lispers在編寫宏時會看到代碼_as_數據。 Yay homoiconicity! (你清楚地知道所有這些,因爲[common-lisp]是你的首選標籤,但是我覺得這裏的其他讀者也應該明白其中的差別。) –

2

對不起,如果下面的討論可能看起來有點模糊,但有太多的話要說。

我只有Lisp的理論知識,而不是動手。另一方面,Forth可能(但正常的Forth還沒有)在語言內部完成一個元編程。但元編程是可行的,但沒有一致的語法。我認爲Lisp也是如此。

我已經實現了一個非常乾淨的解決方案,在Forth的一個小范例中包含這種可能性,就像語言一樣。爲了進行元編程,我們應該能夠參考我們寫的內容。因此,當我們編寫一個程序來進行的immediatelly執行:

bread eat 

我們應該能夠太指同一短語的意圖,而不是執行它,保持它供以後參考。這可以寫成例如

{ bread eat } 

上面的短語可能會導致將創建的對象留在堆棧上。但是,由於我們創建了一個新詞,如{},我們也有權參考這一點。

所以,我們可以想提及:

{ 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和各方面都元編程的可能性,但都缺乏這種可能性作爲語言的集成部分。

我對napl.wikispaces.com有更多的細節。

+1

我只有Lisp的理論知識,而不是動手。 ...我認爲Lisp也是如此。 –

5

我是第四代實施者,在Forth有六十多種實施方案,有幾百個項目問題。我也做了一個小的面向對象的擴展(小的,即十幾行)。 我在LISP方面的經驗遠遠超過了課程級別,但我認爲LISP的元編程設施更加系統化,實際上更加強大是公平的。

在LISP的抽象之上構建抽象是比較容易的。第四,如果我想定義一個線性空間的矩陣,由具有非平凡定義的對象定義..我切換到Python。

原因也很明顯,至少對我而言。數學家LISP的創造者,而查克摩爾是實際程序員的終極典範,他從不浪費時間理論上的問題。