[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [bep] learning lisp



 高橋玲子@少し長いです。

Reply Mitsugu SAKAMOTO <mitsugu@...>'s message:

} 私が紹介したProgramming Emacs-lispによると、
} 
} アトムやリストを表示したものを"シンボリック式(symbolic expressions)"、
} あるいは、より簡素には"S式(s-expressions)"と呼ぶ。用語「"式
} (expression)"」そのものでは、表示したアトムやリスト、あるいは、コンピュー
} タ内部に格納したアトムやリストを意味する。しばしば、これらを区別せずに用
} 語「"式(expression)"」を使う(さらに、多くの書籍では式の同義語として用
} 語「"フォーム(form)"」を使う)。
} 
} だそうです。この"アトム"は"setq" "if" などの単語(?っといってはいけないの
} かな?>識者の皆さん)のことだと思います.

 ありがとうございます。いろいろな用語があるんですね……。
「リスト」というのは何ですか?
(今説明してくださってもわからないかな……)


Reply TAKAHASHI Naoto <ntakahas@...>'s message:

} (progn (setq x 1)
}        (setq y 2)
}        (setq z 3))
} 
} とすると、(setq x 1) と (setq y 2) はそれぞれ1と2という値を返しますが、
} これらの値は誰に利用されることもなく消えて行きます。最後の (setq z 3)
} が返す3という値は progn に引き継がれ、(progn ...) 全体の値となります。

 そして、xに1、yに2、zに3が束縛された、という結果(副作用)はしっかり残
るんですね。
 # (progn ...)の意味は、例の『やさしいEmacs-Lisp講座』の本で拾い読み
 # しながら調べてみました。複数のS式を一つにまとめる関数(?)なんですね。

} この (progn ...) 全体を呼び出した関数が、その返された3という値を使うか
} どうかは、その呼び出し方に依存します。上の (setq x 1) や (setq y 2) の
} ように単に捨てられてしまうかもしれませんし、あるいは何かに使われるかも
} しれません。

 べつに「評価結果」が使われなくても、プログラムとして、「副作用」が利用
できたり、なにか他の役割(?)を果たしていればいいんだということ……ですよね
?

} x や y のような単純なシンボルを評価すると、そのシンボルに束縛された値
} が返されます。数値や文字列を評価すると、評価された数値や文字列そのもの
} が返されます。

 「変数」と「文字列」の違いは、どのように判断されますか?
1文字なのが変数で、2文字以上が文字列……でしょうか?

} setq はちょっと特別で、第1引数を評価しません。setq とほとんど同じこと
} をする関数に set というのもあり、こっちは第1引数も評価します。評価結果
} を→で書くことにすると、
} 
} (setq x 'y) → y
} (set x 10) → 10
} x → y
} y → 10
} 
} となります。ちなみに 'y は (quote y) の略記法で、quote というのは与え
} られた引数そのものを評価せずに返す関数です。もし一番上で (setq x y) と
} すると、y を評した結果を x に束縛することになってしまいます。

 これ、とても難しかったのですが、以下のように考えてみました……。

(setq x 'y) → y

 変数xそのものに、yという変数と同じ意味を持たせる。
なので、全体の評価結果はy(という変数)。

(set x 10) → 10

 xを評価した結果(y)に10を束縛する。
束縛された値が10なので、このS式全体の評価結果は10。

x → y

 1行目でxをyと見なして(?)いるので、xの評価結果はy。

y → 10

 2行目で、yと見なされた(評価された)xに10を束縛しているので、yの評価結
果は10。

} > 単なる「用語」なのかもしれませんが、どうして「束縛」なのでしょう……?
} 
} 単なる用語だと思っていいと思います。ただそれぞれの変数(シンボル)にはス
} コープ(範囲)というものがあって、束縛はその範囲内だけで有効です。

 ……今回、勝手に、せっかく何にでもなり得る変数なのに、特定の数値を入れ
て固定してしまうので、「束縛」っていうのかな……なんて考えたりしました(^
^;;;)。

} (setq a 10) → 10
} (let (a) (setq a 20)) → 20
} a → 10
} 
} となります。2行目の setq で使われている a は let の中だけで有効です。
} ですから let を抜けた後の3行目で a を評価すると、1行目の結果が再び使わ
} れます。

 なぜ、(let (a) (setq a 20))の最初のaが括弧でくくられているのでしょう?

 # (let ...)も例の本で調べてみたのですが、こちらは、拾い読みでは全然
 # わかりませんでした。括弧の中だけで有効なsetq関数みたいなもの、と
 # 考えていいでしょうか?

} ここで問題です。2行目の a は let の内側だけで有効なのに、なぜ2行目全体
} を評価した結果が 20 になるのでしょうか。

 ……2行目の中でいちばん右の関数に当たる
(setq a 20)
から返される値が20なので、(let ...)は、その値を、全体の評価結果としてその
まま返しているのかな……と思ったのですが……???

 # なんだか、おそろしくごちゃごちゃしてしまってすみません。
もっとすっきり書けるといいのですが……。


**-***-***-***-***-***-***-***-***-***-***-***-**
           Reiko TAKAHASHI  (高橋玲子)
         E-mail:  HFC03614@...
         ICQ UIN: 85924121  (Twinkle)
**-***-***-***-***-***-***-***-***-***-***-***-**