5

autolisp / visual lispの次の機能の背後にある設計の理論的根拠を誰かが説明できるでしょうか?私には、彼らは受け入れられたソフトウェアの練習に直面して飛んでいるように見えます...私は何かが欠けていますか?

  • すべての変数はデフォルトでグローバルです(つまり/、関数の引数のaの後に配置されていない限り)
  • AutoCADからデータを読み書きするには、多くのマジックナンバーを含む関連付けリストにデータを入れる必要があります。 10はx/y座標、90は座標リストの長さ、63は色などを意味します。これらをいくつかの定数に格納できますが、それはさらに多くのグローバルを意味します。ドキュメントでは、マジックナンバーを直接使用することを推奨しています。
  • Lispは機能的なスタイルの言語であり、反復による再帰によるプログラミングを促進しますが、末尾再帰は視覚的なLispで最適化されておらず、恐ろしい呼び出しスタックにつながります。もちろん、反復しない限り。ただし、ループ構文は非常に制限されています。たとえば、終了条件に何らかのフラグを設定しない限り、ループから抜けたり、ループから値を返したりすることはできません。結果、醜いコード。
  • 一般に、関数型プログラミングに直面するあらゆる場所で変数を宣言する必要があります。それでは、なぜ関数型(-ish)言語を使用するのでしょうか。
4

3 に答える 3

6

Lispは言語ではなく、時には驚くほど異なる言語のグループですSchemeClojureは、ファミリーの機能的なメンバーです。Common Lisp、およびElispのようなより特殊な品種は、特に機能的ではなく、関数型プログラミングまたは再帰を本質的に奨励しません。CLには、実際には非常に柔軟なオブジェクトシステム非常に柔軟な反復DSLが含まれており、最適化された末尾呼び出しを保証しません(Scheme方言はそうしますが、一般的にLispはそうではありません。これは、「Lisp」を単一言語として考える際の落とし穴です)。

これで問題が解決したので、AutoLispは、XLISPの初期バージョン(最も古いバージョンは1983年に公開された)に基づいた1986年からの実装です。

現在受け入れられているプログラミングの実践に直面して飛ぶ可能性がある理由は、現在受け入れられているプログラミングの実践よりも前のものであるためです。もう1つ覚えておくべきことは、今日入手できる最も安価なネットブックは、プログラマーが80年代半ばにアクセスできると期待できるものよりも数百倍強力であるということです。つまり、特定の機能が優れていると認められたとしても、CPUまたはメモリの制約により、商用言語での実装が妨げられている可能性があります。

私は特にAutolisp/Visual Lispでプログラミングしたことはなく、あなたが引用するものは血まみれの迷惑に聞こえますが、当時それを正当化するパフォーマンス/メモリの利点があったかもしれません。

于 2012-02-02T18:03:23.840 に答える
3

私の記憶が正しければ、AutoLispはXLispの初期バージョンからのフォークです(一部の情報源は、XLisp 1.0であると主張しています(このC2の記事を参照)。

XLisp 1.0は1セルのLisp(関数と変数は同じ名前空間を共有します)であり、奇妙な点がいくつかあります。

于 2012-02-02T17:41:17.957 に答える
2

ダイナミックスコープをミックスに追加することができます。それが何であるかわからない場合は、自分自身を幸運だと考えてください。しかし、実際には、4つのポイントすべてがそれほど大きなIMOではありません。

  • 「宣言されていない変数は、グローバルとして自動的に作成されます。」CLと同じですが(経由setq)ではありませんか?もう1つのオプションは失敗することですが、これは、quick-n-dirtyスクリプトに使用されることになっている言語にとってはあまり魅力的ではありません。

  • 「魔法数」はDXFコードです。これは、ACADバージョンの変更に伴って変更される傾向があるため(ありがたいことに、めったにありません)、大きな不便です。それがまさにその通りです。それを修正するには、大規模なオーバーホールが必要であり、いくつかの「スキーマ」とそうでないものが導入されます。なぜ「それら」が気になるのでしょうか。AutoLISPは、およそ1992年の時点でその状態のままであり、それ以降は気になりませんでした。Visual LISP自体は完全に異なり、はるかに高性能なシステムですが、通常のユーザーにはすべてロックアウトされており、古いAutoLISPを可能な限り忠実にエミュレートするという1つの目標のみを果たすように作られています(新しいVBA関連の機能が追加された場合を除く) 1990年代後半に、それ以来ロックされていました)。

  • (while (not done) ...)それほど醜いではありません。CLとHaskellにテール最適化の保証はありません(最後のものは本当に私をつまずかせます-モナドなしで一定の空間でHaskellのループをエンコードする保証された方法はありません-それはどうですか?)

  • 「あなたはあちこちでvarsを宣言することを余儀なくされています」ここで私はあなたをフォローしません。関数の内部引数リストで、それらを宣言することになっていることを宣言します。他にどんな場所を意味しますか?何も知りません。

実際、AutoLISPの最大の障害は、動的な名前解決IMOですが、Schemeが最初にリリースされてからわずか数年後のXlispではそのようになりました。また、不変のデータストアでもありますが、これは主に実装を簡素化するため、およびユーザーベースからの混乱や質問が多すぎるのを防ぐために行われたと思います。

于 2012-02-05T00:17:53.480 に答える