パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

Emacs Lispあれこれ」記事へのコメント

  • 最初の「変数と関数の名前空間」なんてのは、マニュアル読めば書いてあることですし、Emacs Lisp 使っている人なら常識的なことです。わざわざコード読んで調べたみたいですけど、マニュアルをちゃんと読まなかったんですかね。

    逆に私は Emacs Lisp しか知らないので、へええ普通の Lisp って違うんだ、と参考になりました。

    「正規表現」に関しては、Perl との比
    • by moonbear (4602) on 2002年09月02日 14時07分 (#158225)
      関数と値の名前空間の分離は,古典的なLispを知っている人には今さらなのは確かですが,最近は大学などでSchemeを使って教育することが多いので,こうやって書いておいていただけるとありがたいです.シンボルの属性リスト(plist)なども含めて,Schemeで育った学生は案外知らないようですし.

      あとは,Emacs-Lispが動的スコープを採用していることも書いておいていただけるとうれしいですね(自分でやれといわれそうですが).SchemeもCommon-Lispも静的スコープを採用しているので,これこそ知らない人が多いのではないでしょうか.

      ちなみにobarrayというのはobject arrayのことでしょう.昔のLispの実装では,アトム(シンボル)をハッシュ表でなくてリストで管理していたのですが,そのリストをoblist(object listの略)と呼んでいました.
      親コメント
      • 関数としての解釈と値としての解釈が同一なのは Scheme だけなのですか。知りませんでした。

        それにしても、「名前空間の分離」なんていう表現が出てくること自体、Lisp の本質を知らないんだなと言うのは間違っていますか。私も Lisp に詳しいというほどではありませんけど、Lisp は名前自体がオブジェクトであって、名前すら変更可能だった覚えがあるのですが、違いましたっけ。そんでもって、名前もといシンボルに対して関数なり値なり好きにバインドできるのが特徴だったはずです。

        Scheme も Common Lisp も動的スコープが使えないのですか? サブルーチンはどうするのでしょう。Perl で言うと local() が使えないってことになりそうですけど。スコープという言葉が出てくると名前空間が複数存在するということになりますし…。うーん、私も Lisp がよくわかってないなあ…。
        親コメント
        • by moonbear (4602) on 2002年09月02日 17時22分 (#158366)
          名前空間:一般に名前空間とは,名前に対してどのような値(解釈)を取るかを決める割り当て表のことです.ここで話題になっている,(Common-LispやEmacs-Lispなどで)同じ名前が関数としての位置に出現するか,式として出現するかによって解釈のされかたが異なるという現象ですが,これは式の位置と式で名前空間が異なることを意味しています.

          関数としての位置: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などで部分的に動作環境を指定することができるのが便利なのかも知れません.
          親コメント
        • by picard (4667) on 2002年09月02日 16時35分 (#158320) 日記
          (declare special ...) で可能だったと思います。嘘だったらごめんなさい。
          親コメント

        • それにしても、「名前空間の分離」なんていう表現が出てくること自体、Lisp の本質を知らないんだなと言うのは間違っていますか。私も Lisp に詳しいというほどではありませんけど、Lisp は名前自体がオブジェクトであって、名前すら変更可能だった覚えがあるのですが、違いましたっけ。そんでもって、名前もといシンボルに対して関数なり値なり好きにバインドできるのが特徴だったはずです。

          「名前空間の分離」となんとなく話がずれているような。
          「シンボル」という識別用オブジェクトと、それの表記(printname)が独立している、ということを言ってるんだと思いますが、それ自身はあまり重要なLISPの特色ではないです。(そんなのを駆使するのは、だいたいLISPプログラミングのパズルくらい。)
          元ネタで「名前空間の分離」をいっているのは、おなじシンボルに対し、関数としての値と、変数としての値が別々に管理されている、ということで、これが、scheme や C でのシンボル(identifier)と異なる、ということが論点でしょう。


          Scheme も Common Lisp も動的スコープが使えないのですか? サブルーチンはどうするのでしょう。Perl で言うと local() が使えないってことになりそうですけど。スコープという言葉が出てくると名前空間が複数存在するということになりますし…。うーん、私も Lisp がよくわかってないなあ…。

          CやJavaも静的スコープですが、それほど問題ないですよね。それと同じですが、、、
          動的/静的スコープとは、

          (setq x 0)
          (defun bar () x)
          (defun foo () (let ((x 1)) (bar)))

          で、(foo) の値が何になるか。静的なら 0、動的なら 1。

          (もっと深遠な問題について議論しているのなら、失礼。)
          親コメント
        • 「名前空間の分離」なんていう表現が出てくること自体、Lisp の本質を知らないんだなと言うのは間違っていますか。私も Lisp に詳しいというほどではありませんけど、Lisp は名前自体がオブジェクトであって、名前すら変更可能だった覚えがあるのですが、違いましたっけ。そんでもって、名前もといシンボルに対して関数なり値なり好きにバインドできるのが特徴だったはずです。

           最後の部分が肝です。(CommonLisp も含めて)Lisp ではトップレベルの定義はシンボルが値を保持します。つまり「関数なり値なり」はシンボルの属性なのです。で。一つのシンボル内に於いて関数と値は別

      • The Evolution of Lisp (Guy L. Steel Jr. and Richard P. Gabriel) [dreamsongs.com]によれば、

        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 .

        とのことです。MacLispでのお話。

        親コメント

UNIXはただ死んだだけでなく、本当にひどい臭いを放ち始めている -- あるソフトウェアエンジニア

処理中...