なんとなく流行のGaucheに手を出す。
ちなみに自分は、lispはEmacsLispをかじった程度。したがって初歩的な内容しか書けません。
set!, push!, pop!
なんでビックリマーク付いてるんだ? Ruby?
まず変数への代入。commonLisp では、いきなり
> (setq a "hoge") "hoge"
と変数束縛できるが、Gaucheではあらかじめ defineしとかないとだめみたい。というか、set使わず define使ってればいいのかな。
gosh> (set! a 100) #|これだとエラー|# *** ERROR: symbol not defined: #<identifier user#a> gosh> (define a 0) #|あらかじめ defineで変数宣言(?)しとく|# a gosh> (set! a "hoge") #|それ以降は自由にset!できる|# "hoge"
次はリストへのpush。commonLispだと。
> (setq a '(1 2 3 4)) (1 2 3 4) > (push 10 a) (10 1 2 3 4) > (pop a) 10 > a (1 2 3 4)
Gaucheの場合。
gosh> (set! a '(1 2 3 4)) (1 2 3 4) gosh> (push! a 10) (10 1 2 3 4) gosh> (pop! a) 10 gosh> a (1 2 3 4)
push の引数の順序が逆。でも結果を見るとcommonLisp同様リスト先頭に追加されてる。なんか気持ち悪いけどそういう仕様。
リストへの要素挿入もpushでできる。
gosh> (push! (cdr a) 100) #<undef> gosh> a (1 100 2 3 4)
自分の少ないlisp経験からすると、こういう場合リストをサブシーケンスに分解して組みなおすイメージがあったけど、Gaucheでは直接破壊的操作がしやすい印象。やっぱり ! は rubyの !と同じ意味なの?