17

すべての Common Lisp プログラマーは、マクロが強力なツールであることを知っています。Common Lisp マクロは、とりわけ、言語仕様を変更せずに Lisp の上にオブジェクト指向を追加するために使用されてきました。read-macros は、マインド ベンディング機能を備えた別の構成要素です。

メタプログラミングを可能にする別のプログラムは Forth です。Forth は、'words' と 'generate words' を使用して、少し異なる方法でそれを行います。

両方の言語に手を出した人から、一般的な Lisp マクロと forth 構造が幅/力で匹敵するかどうかを知りたいです:前者でできて後者ではできないことはありますか? それともその逆?

もちろん、私は 2 つの言語のチューリング完全性について話しているのではありません。メタプログラミング機能について話しているのです。C はチューリング完全ですが、C マクロの能力が Common Lisp マクロに匹敵すると言うのは愚か者だけです。

4

3 に答える 3

9

私の見解では、Common Lisp マクロは Forthの即時語に似ています。(実際、それらは Lisp リーダー マクロに最も似ています。)

  • どちらも手続き型マクロです。つまり、言語の全機能を使用できます。

  • どちらもソースコード入力にアクセスできます。

  • どちらも言語で表現できるものなら何でも出力できます。(例えば、Lisp でのオブジェクト指向の拡張、または Forth での基本的な制御フロー構造。)

おそらく、主な違いは、Forth の「マクロ」入力が文字列であるのに対し、Lisp マクロは解析ツリーで動作することです。

于 2014-06-18T09:54:37.647 に答える
9

私は Forth の実装者であり、Forth での幅広い経験、半ダースの実装、数百の Projecteuler の問題があります。また、小さなオブジェクト指向の拡張も行いました (小さい、つまり数十行程度)。私の LISP での経験はコース レベルにとどまりませんが、LISP のメタ プログラミング機能はより体系的で、実際にはより強力であると言っても過言ではありません。

LISP では、抽象化の上に抽象化を構築するのは比較的簡単です。Forth で、自明ではない定義を持つオブジェクトによって定義された線形空間で行列を定義したい場合.. Python に切り替えます。

その理由は、少なくとも私には明らかです。数学者である LISP の作成者であり、Chuck Moore は理論的な問題に決して時間を無駄にしない、実践的なプログラマーの究極の例です。

これは、次のようにこの質問に拡張されます。Lisp マクロは、Lisp のコンテキストで構造を持ち、少なくとも一般的な Lisp の原則に沿った意味を示唆します。Forth の即時の単語は単なる別のプログラムであり、それを使って犬の夕食を作るなど、あらゆることを意味し、行うことができます。

于 2015-02-09T22:38:36.250 に答える