2012-02-02 5 views
5

誰かがautolisp/visual lispの以下の機能の背後にある設計の根拠を説明できるのだろうか?私には、受け入れられたソフトウェアの練習に直面して飛ぶように見えます...私は何かを逃していますか?誰でもAutolisp/visual lispの背後にある設計上の決定を私に説明できますか?

  • (関数の引数で/後に置かない限り、すなわち)すべての変数は、デフォルトではグローバルで
  • のAutoCADから
  • 読み取り/書き込みデータは、マジックナンバーのたくさんの連想リストにものを置くことが必要です。 10はx/y座標を意味し、90は座標リストの長さを意味し、63は色などを意味します。これらの値はいくつかの定数に格納できますが、これはさらに多くのグローバルを意味し、ドキュメントはマジックナンバーを直接使用することを奨励します。
  • Lispは関数スタイルの言語であり、反復による再帰によるプログラミングを奨励していますが、tail re recursionはビジュアルlispでは最適化されていないので、恐ろしい呼び出しスタックにつながります。しかし、ループ構文は非常に制限的です。例えば終了条件に何らかのフラグを立てない限り、ループから値を抜けたり、ループから値を返すことはできません。結果、醜いコード。
  • 一般的に、関数型プログラミングでは、どこにでも変数を宣言する必要があります。なぜ機能(-ish)言語を使うのですか?

答えて

6

Lispはそれはgroup of sometimes surprisingly different languagesだ、言語ではありません。それにはいくつかの奇妙奇妙で)同じ名前空間を共有し、のような、より専門的な品種Elispは特に機能的ではなく、本質的に機能プログラミングや再帰を奨励しません。実際にはvery flexible object systemextremely flexible iteration DSLが含まれており、最適化されたテールコールは保証されません(Schemeの方言は一般的にLispsではなく、Schemeの方言です。それは単一言語としての "Lisp"を考える際の落とし穴です)。

これで、AutoLispは、XLISPの初期バージョン(1983年の最初のバージョンは1983で公開されました)に基づいて実装されました。

現在受け入れられているプログラミングの練習で、飛行する可能性がある理由は、より前には、現在受け入れられているプログラミングです。心に留めておくべきもう一つは、現在入手可能な最も安いネットブックは、プログラマは80年代半ばにバックアップするためのアクセス権を持っていることを期待することができるものよりもseveral hundred timesより強力であるということです。ある機能が優れていると受け入れられたとしても、CPUやメモリの制約が商用言語での実装を妨げている可能性があることを意味します。

私はAutolisp/Visual Lispで特別にプログラムしたことはありませんでした。あなたが挙げたものは厄介なように聞こえますが、パフォーマンス/メモリのメリットがあったかもしれません。

+0

"これは、著者が許可なく、そのまま"取った "もので、後方互換性がないことを恐れて改善することを心配することはありませんでした。 @Will - Man。 –

+0

私はそれがそれを説明すると思います。元のXLISPは、彼が真剣に推進していたものではなく、作家のおもちゃプロジェクトでした。 – Inaimathi

+0

1983年から1986年の日付はLispの優れた習慣に先立つものではありません。 1986年までに、Common Lispはすでに存在し、1994年に標準化されたものとほぼ同じものでした。それは前景のケースではありませんが、ヒントを持っていないケースです。 AutoLispは1960年代にいくつかのLispsよりも悪かった。 – Kaz

3

私の記憶が正しければ、AutoLISPのは、(いくつかのソースは、それがXLisp 1.0(this C2 articleを参照)であったXLispの初期バージョンからフォーク主張している。

XLisp 1.0は、1セルのlisp(関数や変数でありますCommon Lispの。SchemeClojureは、家族の機能的メンバーである。

2

あなたはところでミックスにdynamic scopingを追加することができ、そしてあなたはそれが自分が幸運を検討しているかわからない場合。すべての4点が取引の大きなIMOということです。しかし、実際にはない:

  • 「宣言されていないVARSは、グローバルとして自動的に作成されます。」 CLと同じです(setq経由)?もう1つの選択肢は失敗することです。これは、クイックダーティスクリプトに使用されるはずの言語にとって非常に魅力的なものではありません。

  • 「マジックナンバー」はDXFコードなので、ACADバージョンの変更に伴い変更される傾向があります(ごくまれにしかありません)。それがまさにそれです。それを修正するには、いくつかの「スキーマ」を導入し、何を導入しないのか、そしてなぜ「彼ら」が気になるのでしょうか? AutoLISPはおよそ1992年の時点で残っていて、以来ずっと心配していませんでした。ビジュアルLISP自体はまったく違ったものですが、一般的なユーザにはロックアウトされていますが、1つの目標を達成するためにのみ作成されています。古いAutoLISPを可能な限り忠実にエミュレートします(新しいVBA関連機能1990年代後半には、それ以来ロックされていた)。

  • (while (not done) ...)は、であり、 uglyではありません。 CLやHaskellにはないように、尾部の最適化の保証はありません(最後のものは本当に私を抱きしめます - Haskellのループをモナドなしで一定の空間にエンコードする方法はありません)。

  • 「あなたはどこでもヴァルスを宣言しなければなりません」ここでは私はあなたに従いません。関数の内部引数のリストで宣言したと宣言しています。それ以外の場所は何ですか?私は何も知らない。実際には

のAutoLISPの最大の障害とは、IMOそのダイナミック名前解決であるが、それはそれはスキームが最初に出てきただけで、数年後、Xlispにあった方法です。それから、それは不変のデータストアですが、それは主に実装の簡略化のために、そしてあまりにも多くの混乱とそれによる疑問をユーザーベースから防ぐために行われました。

+1

実際、Haskellは、厳密な関数アプリケーションを使ってアキュムレータを設定している限り、末尾呼び出しをサポートしています。私はこの点を自分自身と[この回答](http://stackoverflow.com/a/4286283/190887)で解決しました。 – Inaimathi

関連する問題