ProgrammingのTipなど

クォート

クォート
Schemeでは全ての構造はS式です
関数もデータも同じ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に代入されます

バッククォートとコンマと@
バッククォートもクォートと同じ働きをしますが
コンマや@と併用することでより細かい制御ができます

クォートと同じ使い方
(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)
@
バッククォートの中で@を使わない場合は(1 2 3)というリストになります
(define l3 `(2 900 ,(map abs (list -1 -2 3)) 5 9))
(print l3)
>'(2 900 (1 2 3) 5 9)
バッククォートの中で@を使うと(1 2 3)を融合させます
(define l3 `(2 900 ,@(map abs (list -1 -2 3)) 5 9))
(print l3)
>'(2 900 1 2 3 5 9)

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu

メニュー2

開くメニュー

閉じるメニュー

  • アイテム
  • アイテム
  • アイテム
【メニュー編集】

管理人/副管理人のみ編集できます