yuu_nkjm blog
2012-11-12(Mon) 編集
[Scheme][Ruby] Schemeのお勉強 (S式と評価,式と文,リテラル)
SchemeのS式(アトム,シンボル,リスト)を評価をする際の振る舞いが簡潔にまとまっていたページがあったのでメモ.特に重要と思うところを赤くした.
S 式 ─┬─ アトム ─┬─ 整数値 │ │ │ ├─ 文字列 │ │ │ └─ シンボル │ └─ リスト 図 : Scheme の基本的なデータ型いままで使ってきたデータの種類には、リスト (list)、整数値 (integer)、文字列 (string)、シンボル (symbol) があります。データの種類を「型 (type) 」といいます。このほかにも、「ベクタ (vector) 」や「文字 (character) 」など重要なデータ型 (data type) がいくつかあります。 すべてのデータをまとめて「S 式 (symbolic expression) 」または「フォーム (form) 」と呼びます。S 式は「アトム (atom) 」と「リスト (list) 」に分けられます。アトムとは、リスト以外のデータすべてのことを意味します。したがって、整数値や文字列やシンボルはアトムになります。 Scheme (Lisp) は、S 式の値を計算することで動作します。値を計算することを「評価 (evaluation) 」するといいます。評価規則はデータ型によって決められています。1. リスト リストの先頭要素を評価し、その値が関数であればそれを実行して結果を返す。たとえばシンボルの場合、その値 (関数) を取り出して実行し、その結果を返す。ほかの要素は引数として関数に渡される。 2. シンボル そのシンボルに格納されている値を返す。 3. その他 自分自身を返す。たとえば、(+ 1 2 3) を実行する場合、関数 + を実行する前に、引数の 1, 2, 3 を「評価」します。この場合、引数がリストやシンボルでないので、そのまま関数に渡されるのです。評価しても自分自身になるデータ型を「自己評価フォーム」といいます。通常の関数では、引数は必ず評価されることを覚えておいて下さい。 ただし、シンタックス形式の場合は引数を評価しないことがあります。define は引数を評価しませんでしたね。通常の関数は引数を評価するが、シンタックス形式は関数によって違うことに注意して下さい。
式と文,リテラル,評価あたりはよく考えると分からなくなってくることがある.以下のページが参考になる.
- Rubyist Magazine - 式と文、評価と実行、そして副作用 ―― プログラムはいかにして動くのか【前編】
RubyとPythonを比較しながら,式と文の説明をする解説記事. - Ruby Summary
Rubyにおいて,文とか式ってなんだっけって時に. - newが嫌いな理由 -- リテラル好き好き - 檜山正幸のキマイラ飼育記
リテラルの便利さを思い出したいときに.
2015-11-12(Thu) 編集
[Scheme][apply] Schemeのapply
#|kawa:11|# (apply list 1 2 3) ;; 引数がリストじゃないからだめ ERROR #|kawa:12|# (apply list '(1 2 3)) ;; もちろんOK (1 2 3) #|kawa:13|# (apply list 1 2 3 '()) ;; これが許されるのか (1 2 3) #|kawa:20|# (apply list 1 2 3 '(3 4 5)) ;; ※ (1 2 3 3 4 5) #|kawa:21|# (apply list (append '(1 2 3) '(3 4 5))) ;; applyの第2引数は必ずリストでないとダメだと思っていたので,こう書いていたけど※でOK (1 2 3 3 4 5) #|kawa:22|# (apply list 1 2 3 '(3 4 5) '()) ;; ↑と違うことに注意 (1 2 3 (3 4 5))可変長引数をラップ
#|kawa:29|# ((lambda(. e) (apply list 1 2 3 e)) 3 4 5) ※と同じになる. (1 2 3 3 4 5) #|kawa:29|# ((lambda(. e) (apply list (append '(1 2 3) e))) 3 4 5) ;; appendしてた (1 2 3 3 4 5) #|kawa:48|# ((cut list 1 2 3 <...>) 3 4 5) (1 2 3 3 4 5)