2008年12月30日火曜日

【ELp入門】1 リスト処理


  • 1.1 Lispのリスト

    • うーん。強引な導入。
    • C-M-\ にてリージョンをインデント。

  • 1.2 プログラムの実行

    • GNU Emacsの内部にはlispインタープリタがあるんだ。なるほど。

  • 1.3 エラーメッセージの生成

    • 執筆時にはなかったようだが、今はデバッガが立ち上がる。qで抜けられる。

  • 1.4 シンボル名と関数定義

    • わかりやすい説明だ。

  • 1.5 Lispインタープリタ

    • シンボルについて、変数の前に関数をやるのはいい感じ。
    • バイトコンパイルすると実行が速くなる。

  • 1.6 評価

    • 副作用の説明。Elispは副作用がおおそうだ。。。

  • 1.7 変数

    • 変数に関数定義を束縛することもできる。

  • 1.8 引数

    • えっと、Emacs 22では、

      (concat "The " (+ 2 fill-column) " red foxes.")

      これはエラー。昔は大丈夫だったようだ。今はnumber-to-stringを使うのだろう。ちなみにCLだと、

      (concatenate 'string "abc" "def")

    • Elispにおいてもdefunの背後にlambdaがいるとすると(いないかもしれないが)、引数にlispオブジェクトを与えると、そのlispオブジェクトを評価した結果が、環境に登録されるということだろう。(elispが環境をもっているかどうはまだわからない)
    • messageってもしかして値を返さないのか??? と思ったら、文字列を返すのね。*scratch*便利。
    • messageってformatみたいなんだな。

  • 1.9 変数への値の設定

    • うーん。。。変数は難しい。ここの記述は確かに間違いではないのだが、変数をちゃんとわかっていないと、ちゃんと理解できない。
    • 変数は、シンボルによる実現と、環境による実現がある。変数への値の束縛については、CLではsetはシンボル専用、setqは両用、lambdaは環境の生成とともに環境用というのが基本だと思う。(ただし、elispに環境があるのかどうかはしらないので、環境が無いならばまた違うかもしれない)
    • CLでは「setqは、setの第一引数のquoteを省略できる版」ではない。elispではそうなのか? ためす。

      ;; CL
      CL-USER(19): (setq hoge 1)
      1
      CL-USER(20): (let ((hoge 10))
      (set 'hoge 2)
      (symbol-value 'hoge))
      2
      CL-USER(21): hoge
      2
      CL-USER(23): (setq hoge 1)
      1
      CL-USER(24): (let ((hoge 10))
      (setq hoge 2)
      (symbol-value 'hoge))
      1
      CL-USER(25):hoge
      1


      ;; EL (*scratch*)
      (setq hoge 1)
      1
      (let ((hoge 10))
      (set 'hoge 2)
      (symbol-value 'hoge))
      2
      hoge
      1
      (let ((hoge 10))
      (setq hoge 2)
      (symbol-value 'hoge))
      2
      hoge
      1

    • ええっと。あまりいい例じゃないけど、ELの方は、setにしろsetqにしろ、letのhogeをみてるんだなきっと。とするとsetqはsetの便利版でいいんだろね。


一章はけっこう長かった。
こつこつ。

0 件のコメント: