パスワードを忘れた? アカウント作成
3793 story

Emacs Lispあれこれ 38

ストーリー by wakatono
Emacs-Lispマニア必見 部門より

brake-handle曰く、"mew-dist mailing listに流れたmailより。山本和彦さんが、Emacs Lisp特有の問題を中心に取り上げたEmacs Lispあれこれを公開した。Lispに関する文書は数あれど、ほかのLisp処理系と比べてEmacs Lispが異なる点や注意が必要なことを取り立てて書いてあるのは一見に値するであろう。Emacs Lispで遊ぶ際には手元に置いておきたい文書である。"

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by kr (10950) on 2002年09月02日 20時19分 (#158477) 日記

    むしろLispを知らない人向けにEmacs Lispを説明する文書ぽいですね。

    数年前に山本和彦さんが話しているのを聞いたんですが、本人はLispが嫌いで、自分はむしろCプログラマなんだとか言ってました。確かにMewなどのコードを見ると、いかにもCプログラマらしい書き方(mapが使えるところでもwhileループを多用するとか、閉じ括弧のインデントがC言語風とか、他多数)が散見されたので、なるほどねと思った覚えがあります。

    しかし世の中、Lispを知らない/嫌いな人でも、GNU Emacsは手放せない、なんて人は多そうですから、そんな人のためのEmacs Lisp入門になれば良いんぢゃないでしょうか。

    逆に、Lisp好きの立場から言わせてもらえば、Lispを学ぶことをメインに考えている人に、正直山本氏の文書はお勧めしないです。LISP的な考え方で書かれていないのですよね。なので、「リスト遊び」でLISP覚えた [srad.jp]人がいるというのはちょっと複雑な心境。個人的には、そういう人には「はじめての人のためのLISP」 [yfcbookshelf.com]などをお勧めしたいのだけど:-)、 もう売ってないみたいですね……。(;_;)残念。

  • はずかしながら、ぼくは
    山本和彦著『リスト遊び』ASCII
    を読んではじめてLISPというかリストが何なのか少しわかりました。

    リストがどういうものか解るとRubyについての理解も深まりました。

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

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

    「正規表現」に関しては、Perl との比較をしていますけど、PHP も Emacs 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でのお話。

        親コメント
    • by kr (10950) on 2002年09月02日 21時00分 (#158495) 日記
      > 最初の「変数と関数の名前空間」なんてのは、

      タレコミ文に「ほかの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……」とかなんとか呟いてしまうことでしょう。:-)

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

      名前空間をわけないのは普通のLISPではなくてSchemeです。
      親コメント
    • 僕も同感です. どれもEmacs-Lispをちょっとかじったコトのある人なら常識になってるコトじゃないのかな.
      コンテンツが大量にあって…というならまだしも, /.に投稿するほどの内容では無いような気が…(あ, シャレじゃないですよ).
      • by Anonymous Coward on 2002年09月02日 14時17分 (#158228)
        > どれもEmacs-Lispをちょっとかじったコトのある人なら常識になってるコトじゃないのかな.

        かじってない人向けなんじゃないの?
        「かじった人に常識」で済むのなら、世の中のあらゆる doc は不要。

        > /.に投稿するほどの内容では無いような気が…

        ちょっとした内容だと投稿できないというほど、
        /. は堅苦しいサイトでは無いような気が…
        親コメント
        • #158213のACです.
          >どれもEmacs-Lispをちょっとかじったコトのある人なら常識になってるコトじゃないのかな.
          >
          >かじってない人向けなんじゃないの?
          >「かじった人に常識」で済むのなら、世の中のあらゆる doc は不要。
          ええ, 僕もかじっていない人
    • 僕は楽しく読ませていただきましたよ。
      仕様として知ってることと、実装がどうなってるかを知るという ことは、ぜんぜん別のことがらですから。
    • お互いを尊重しあうような語り口でレスをしたいものですね(:b
  • by yasushi (789) on 2002年09月02日 16時28分 (#158314)
    タレコミ文を読んで、他のlispとemacslispの比較、という
    文書を予想していたんですが、違いましたね。

    あくまでもemacslispを解説するために、ところどころ他のlispの話題が
    出てくるだけでした。
  • Emacs Lisp を本気で勉強したければ、この文章の頭にもあるように、GNU Emacs Lisp Reference Manual を読むのが一番でしょう。日本語訳として eljman という Texinfo 形式のものが流れていて、それを texi2html という変換ツールで html にしたものが ここ [uec.ac.jp] にあります。

    「変数と関数の名前空間」についての説明はこれですかね。
    シンボルタイプ [uec.ac.jp]

    このようなシンボルってのは実装上の話なんですね。Lisp 全部がそうなのかと私は勘違いしていました。

    「ハッシュ」の中の「連想リスト」はこれ?
    連想リスト [uec.ac.jp]

    でもって効率の悪い連想リストを使うのではなくて、Emacs Lisp がシンボル自体を処理する下位のしくみ [uec.ac.jp]を使って高速なハッシュを実現する方法が山本さんの文章には書かれているようです。Emacs 21 だと不要なので Emacs 20 以下限定で。パフォーマンス稼ぎと下位互換が必要な一部のプログラマ向けですね。
  • by Anonymous Coward on 2002年09月02日 14時58分 (#158247)
    Lispに関する文書は数あれど、ほかのLisp処理系と比べてEmacs Lispが異なる点や注意が必要なことを取り立てて書いてあるのは一見に値するであろう。

    普通「...は数あれど」と来たら「これこれなのはこの文書だけである」とか受けると思うぜ。あるいは、「...は数ある中で、これこれこういう理由でこの文章は一読に値する」とかね。

    君たち(タレコミ人も編集者も)、一生、文章が上達することはないであろう。戦後日本の貧しい国語教育が招いた悲劇。

    • s/馬事東風/馬耳東風/

      # エサか? エサなのか?
      • しまった、「馬事東風」という言葉が「馬耳東風」とは別にあるのかなと思って 必死で検索かけたりしているあいだに先を越されてしまった。

        google で 41 件も出てくるんですよね。「予想される検索キーワード: 馬耳東風」って出たら笑っちゃうところだったんだけど、出なかった。

        • ところで、こういうのってかな漢字変換での選択ミスだと思ってるんですが、何を使ってるんでしょう?
          #スラッシュ投票ネタになるかしらんw

          Windows2000のMS-IMEでは「ばじとうふう」で「馬耳東風」しか候補がないのにどうして間違えるのか予想がつかない。

          ああ、「ばじ」で「馬事」なのか。「とうふう
          --

          本当かい♪本当かい♪
    • ACでつっかかって来たわりには、 「戦後日本の貧しい国語教育が招いた悲劇。」という天声人語的 落し方がそもそも貧しいよな。馬「耳」東風と文章内容との関係のなさとか。 「練習しなさい」じゃなくて「上達することはない」と決めつけてみたのも空砲だし。

      • 「戦後日本の貧しい国語教育が招いた悲劇。」という天声人語的落し方がそもそも貧しいよな。

        「天声人語的」、「貧しい」などと貶めることは簡単だけれど、今の場合それも現実と受け止める必要があると思います(ところで朝日新聞お嫌いなんですか?)。日本の場合、大学の水準

        • もう話題は完全にずれますが、朝日新聞が嫌いなのではなくて、 天声人語が、より正確に言うと「天声人語の文章を良文の見本」とする 国語教育が嫌いなのでした。

          もちろん現状の国語教育が貧しいのは受け止めますが、 タレコミ文が悪文である事がどう「悲劇」なのか、 戦後国語教育の欠陥と果して結びつくのか、 その辺あんまり考えてなさそうなのがいかにも「天声人語」的だなぁと 思った次第です。

          親コメント
        • > 日本の場合、大学の水準が欧米と比べて低すぎるのも一因かと。

          アメリカの大学もピンからキリまであるんですけど。
          平均値は日本の方が遥かに上だと思いますがね。

          「隣の芝生は青い」ってことですよ。
          • 平均値は日本の方が遥かに上だと思いますがね。
            日本の教育システムは、根拠も示さずに「こちらの方が上」というような発言をする人間を輩出しているように思えます。
  • by Anonymous Coward on 2002年09月02日 19時34分 (#158459)
    俺としては EmacsLisp (つーか古い Lisp) から入ったので、 schemeで名前空間が統一されていることや、static scopeに かっこいいと思った物で。

    それより (lambda...) って quoteしないでいい (というかしちゃだめ) なことにと惑ったな。CommonLispの (function..) は もっと理解不能でした。ま、compilerつくることを 考えれば理解できたけど。

typodupeerror

コンピュータは旧約聖書の神に似ている、規則は多く、慈悲は無い -- Joseph Campbell

読み込み中...