Schemeでは全ての構造はS式です
関数もデータも同じS式(リスト構造)で表されます
そしてS式がインタプリタに渡されるとS式の第一引数を常に関数として評価しようとします
しかしデータとしてそのまま渡したいときも多くあります
ではデータとしてS式(リスト)を渡したい場合はどうすればよいでしょうか
そのようなときはquoteまたは'をつけて渡すとそれは評価されずにリストのデータとして渡されます
例えばデータとしてのリストをar1として作りたい場合
リストにquoteまたは'をつけて渡さないといけません
通常は'記号がよく使われます
これでデータとしてのリストができます
例
l1には7が代入(束縛)されます
データとしてそのままl1に代入されます
関数もデータも同じS式(リスト構造)で表されます
そしてS式がインタプリタに渡されるとS式の第一引数を常に関数として評価しようとします
しかしデータとしてそのまま渡したいときも多くあります
ではデータとしてS式(リスト)を渡したい場合はどうすればよいでしょうか
そのようなときはquoteまたは'をつけて渡すとそれは評価されずにリストのデータとして渡されます
例えばデータとしてのリストをar1として作りたい場合
(define ar1 (1 2))これだとリストの先頭を評価してしまいエラーとなります
リストにquoteまたは'をつけて渡さないといけません
通常は'記号がよく使われます
(define ar1 '(1 2))または
(define ar1 (quote (1 2)))と書きます
これでデータとしてのリストができます
例
(define l1 (+ 2 5)) (print l1) >7上の例はS式の+が関数として評価され2+5が計算されて
l1には7が代入(束縛)されます
(define l1 '(+ 2 5)) (print l1) >'(+ 2 5)この例では'によって(+ 2 5)は評価されず
データとしてそのままl1に代入されます
バッククォートもクォートと同じ働きをしますが
コンマや@と併用することでより細かい制御ができます
クォートと同じ使い方
コンマ直後のS式だけを関数として評価させるよう働きます
バッククォートだけだと(+ 5 100)は評価されずリストのデータとなります
コンマや@と併用することでより細かい制御ができます
クォートと同じ使い方
(define l3 `(2 5 9)) (print l3) >`(2 5 9)バッククォートの中でコンマを使うと
コンマ直後のS式だけを関数として評価させるよう働きます
バッククォートだけだと(+ 5 100)は評価されずリストのデータとなります
(define l3 `(2 900 (+ 5 100) 5 9)) (print l3) >`(2 900 (+ 5 100) 5 9)コンマを(+ 5 100)の前につけると評価され計算されて105となります
(define l3 `(2 900 ,(+ 5 100) 5 9)) (print l3) >`(2 900 105 5 9)
コメントをかく