なんとなく流行の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の !と同じ意味なの?