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 は引数を評価しませんでしたね。通常の関数は引数を評価するが、シンタックス形式は関数によって違うことに注意して下さい。

式と文,リテラル,評価あたりはよく考えると分からなくなってくることがある.以下のページが参考になる.


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)

トップ «前の日(11-11) 最新 次の日(11-13)» 追記 設定
2006|01|06|12|
2007|06|09|
2008|01|03|04|06|07|08|09|10|12|
2009|01|02|05|06|07|08|10|11|12|
2010|03|04|05|06|07|08|09|10|11|
2011|01|02|03|04|05|06|07|08|09|11|12|
2012|01|02|04|06|07|08|10|11|12|
2013|01|02|03|07|08|10|11|12|
2014|01|02|04|05|06|07|08|09|10|11|
2015|01|02|07|11|12|
2016|01|03|05|07|08|09|