In 1971,Jon L White (sic)changed the representation of the data structure that maps names (strings)to symbols from a list to a hash table [White,1969 1982 ];thus the traditional OBLIST (list of objects,that is,named atoms)of Lisp 1.5 was renamed the OBARRAY .
マニュアルに書いてあることも。 (スコア:1)
逆に私は Emacs Lisp しか知らないので、へええ普通の Lisp って違うんだ、と参考になりました。
「正規表現」に関しては、Perl との比較をしていますけど、PHP も Emacs Lisp と同じく「文字列」です。ややこしいですけど、実装を考えると一番素直というか馬鹿正直というか。Perl の方が変態的ではないでしょうか。
あとの項目は、ハマると時間をとられそうなところを説明してくださっているのでいいんじゃないですか。
Re:マニュアルに書いてあることも。 (スコア:2, 参考になる)
あとは,Emacs-Lispが動的スコープを採用していることも書いておいていただけるとうれしいですね(自分でやれといわれそうですが).SchemeもCommon-Lispも静的スコープを採用しているので,これこそ知らない人が多いのではないでしょうか.
ちなみにobarrayというのはobject arrayのことでしょう.昔のLispの実装では,アトム(シンボル)をハッシュ表でなくてリストで管理していたのですが,そのリストをoblist(object listの略)と呼んでいました.
動的スコープなくて実用可能? (スコア:1)
それにしても、「名前空間の分離」なんていう表現が出てくること自体、Lisp の本質を知らないんだなと言うのは間違っていますか。私も Lisp に詳しいというほどではありませんけど、Lisp は名前自体がオブジェクトであって、名前すら変更可能だった覚えがあるのですが、違いましたっけ。そんでもって、名前もといシンボルに対して関数なり値なり好きにバインドできるのが特徴だったはずです。
Scheme も Common Lisp も動的スコープが使えないのですか? サブルーチンはどうするのでしょう。Perl で言うと local() が使えないってことになりそうですけど。スコープという言葉が出てくると名前空間が複数存在するということになりますし…。うーん、私も Lisp がよくわかってないなあ…。
Re:動的スコープなくて実用可能? (スコア:4, 参考になる)
関数としての位置:Common-LispやEmacs-Lispなどでは,(a0 a1 a2 ... ak) という形の式において,a0(関数としての位置)にくるものは式ではなく,関数を表す表現のみです.これにたいして,Scheme(その他,MLやHaskellなど)ではa0にも式がきます.
名前とシンボル:名前の概念と(Lisp系言語におけるデータとしての)シンボルは区別して扱うべきです.例えばSchemeでは変数の値は名前とスコープから決まりますが,Lispの処理系の一部では,名前が表しているシンボルから決まるものもあります.
静的/動的スコープ:スコープが静的/動的であるとは,変数のとる値が,定義されている文脈できまるか,評価されている文脈できまるかを指しています.例えば
(let ((a 1)) (defun foo (x) (+ x a)))
と定義しておいて
(let ((a 2)) (foo 3))
という式を評価した結果は,Common-Lisp(静的スコープ)では4に,Emacs-Lisp(動的スコープ)では5になります.動的スコープはコンパイルするときにいろいろ面倒なことがあります.Common-Lispではspecial宣言で動的スコープを扱うこともできますが,Schemeでは基本的には静的スコープだけです.
Emacs-Lispが動的スコープを採用している理由ですが,動作環境をあらわす大域変数を多用するためだと,Stallman氏が何かのインタビューで答えていたと記憶しています.純粋な大域変数としての利用だけなら静的スコープでもいいのですが,letなどで部分的に動作環境を指定することができるのが便利なのかも知れません.
Re:動的スコープなくて実用可能? (スコア:2, 興味深い)
> 動作環境をあらわす大域変数を多用するためだと,
> Stallman氏が何かのインタビューで答えていたと記憶しています.
History of T [paulgraham.com]
によると、当時はdynamic scopeの方が速いと考えていたようです。
Common LISP の場合は (スコア:1)
Re:動的スコープなくて実用可能? (スコア:1)
「名前空間の分離」となんとなく話がずれているような。
「シンボル」という識別用オブジェクトと、それの表記(printname)が独立している、ということを言ってるんだと思いますが、それ自身はあまり重要なLISPの特色ではないです。(そんなのを駆使するのは、だいたいLISPプログラミングのパズルくらい。)
元ネタで「名前空間の分離」をいっているのは、おなじシンボルに対し、関数としての値と、変数としての値が別々に管理されている、ということで、これが、scheme や C でのシンボル(identifier)と異なる、ということが論点でしょう。
CやJavaも静的スコープですが、それほど問題ないですよね。それと同じですが、、、
動的/静的スコープとは、
で、(foo) の値が何になるか。静的なら 0、動的なら 1。
(もっと深遠な問題について議論しているのなら、失礼。)
Re:動的スコープなくて実用可能? (スコア:0)
最後の部分が肝です。(CommonLisp も含めて)Lisp ではトップレベルの定義はシンボルが値を保持します。つまり「関数なり値なり」はシンボルの属性なのです。で。一つのシンボル内に於いて関数と値は別
obarray の初出 (スコア:1)
The Evolution of Lisp (Guy L. Steel Jr. and Richard P. Gabriel) [dreamsongs.com]によれば、
とのことです。MacLispでのお話。
Re:マニュアルに書いてあることも。 (スコア:2, 参考になる)
タレコミ文に「ほかのLisp処理系と比べてEmacs Lispが異なる点」なんて書いてあったんで、ここにはバッファローカル変数がどうとか、そんな名前空間(?)とスコープの話が書いてあるかと思って読んだら、ちょっと拍子抜けしちゃいました。
ま、確かにEmacs Lispの(symbol-value SYMBOL)と(symbol-function SYMBOL)が独立しているってのも、Schemeなどと比べれば特徴と言えるのかもしれませんが、Emacs Lispならではの混乱させられる変数の話と言って私が真っ先に思い出したのは、make-variable-buffer-localとかmake-local-variableとかで指定される変数の振る舞いについてでした。いわゆるバッファローカル変数という奴ですが、Emacs Lispがエディタ用に作られているが故に導入された、まさにEmacs Lisp特有の機能と言えましょう(本当は、似たような拡張はこの種の処理系にはちょくちょく見られる気もしますが)。 これらバッファローカル変数と、letなどによる束縛と、さらにset-bufferによるバッファ切り替えが絡もうものなら、それはもう混乱させられること間違いなし。
まあ、こんなところまで踏み込む必要のある人は少ないと思いますが、自前のMajor Modeとか作る人は学んでおいて損はない部分なので、将来的に山本氏のドキュメントでも、その辺充実してくるといいですね。
なんていいつつ、実は上に書いたようなバッファローカル変数とlet, set-bufferの振る舞いについても、Emacs Lisp Reference Manualにしっかり書いてあったりします。かなりトリッキーな振る舞いになっちゃうんですが、さてどうなるのか、興味のある人はマニュアル読んでみてください。思わず「うーん、なるほどShallow Binding……」とかなんとか呟いてしまうことでしょう。:-)
Re:マニュアルに書いてあることも。 (スコア:1)
名前空間をわけないのは普通のLISPではなくてSchemeです。
Re:マニュアルに書いてあることも。 (スコア:0)
コンテンツが大量にあって…というならまだしも, /.に投稿するほどの内容では無いような気が…(あ, シャレじゃないですよ).
Re:マニュアルに書いてあることも。 (スコア:1, すばらしい洞察)
かじってない人向けなんじゃないの?
「かじった人に常識」で済むのなら、世の中のあらゆる doc は不要。
> /.に投稿するほどの内容では無いような気が…
ちょっとした内容だと投稿できないというほど、
/. は堅苦しいサイトでは無いような気が…
Re:マニュアルに書いてあることも。 (スコア:0)
>どれもEmacs-Lispをちょっとかじったコトのある人なら常識になってるコトじゃないのかな.
>
>かじってない人向けなんじゃないの?
>「かじった人に常識」で済むのなら、世の中のあらゆる doc は不要。
ええ, 僕もかじっていない人
Re:マニュアルに書いてあることも。 (スコア:0)
仕様として知ってることと、実装がどうなってるかを知るという ことは、ぜんぜん別のことがらですから。
Re:マニュアルに書いてあることも。 (スコア:0)