Common Lispでのお助け変数達

Common Lispで使えるちょっと便利な変数達です。
CLHS: Section The Environment Dictionaryに記載されているのをguicho2.71828さんに教えて頂きました)


-

現在評価している式を値として持つ。
但し評価が終われば値は無くなる。
デバック目的でprintと組み合わせて使うと便利なのかな。

* (progn (print (+ 1 1)) (print -))

2 ;<--(print (+ 1 1))
(PROGN (PRINT (+ 1 1)) (PRINT -)) ;<--(print -)
(PROGN (PRINT (+ 1 1)) (PRINT -)) ;REPLが表示した返値(print -)

+、++、+++

直前に評価した式を値として持っている。
(+は一つ前、++は二つ前、+++は三つ前)

* (print "3つ前")

"3つ前"
"3つ前"
* (print "2つ前")

"2つ前"
"2つ前"
* (print "1つ前")

"1つ前"
"1つ前"
* +++

(PRINT "3つ前")
* +++

(PRINT "2つ前") ;一つ前に+++を実行したので値が変わっている

*、**、***


上記の+と似ていて、*は評価された結果を値として持っている。
(*が一つ前、**が二つ前、***が三つ前」)
返値が多値の場合は一つめのみを保持。

* (values 1 2)

1
2
* *

1

以下は上記リンク先にあった例です。

(defun cube-root (x) (expt x 1/3)) =>  CUBE-ROOT
(compile *) =>  CUBE-ROOT

(setq a (cube-root 27.0)) =>  3.0
(* * 9.0) =>  27.0

/、//、///

*と似ているが、/はリストとして評価された値を持つ。

* (+ 1 1)

2
* /

(2)

評価された値が多値の場合はリストで全ての値を持つ(*との決定的な違い)

* (values 1 2)

1
2
* /

(1 2)