Special Operator LOCALLY
locally
declaration* form* => result*
declaration - 宣言式。評価されません。
form - 暗黙のprogn
result - formの返却値
与えられたdeclarationの効果があるレキシカル環境下で、 一連のformのボディ部を評価します。
defun sample-function (y) ;このyはspecialと見なされる
(declare (special y))
(let ((y t)) ;このyはレキシカルと見なされる
(list y
(locally (declare (special y))
(;; この次のyはspecialと見なされる
y))))=> SAMPLE-FUNCTION
nil) => (T NIL)
(sample-function setq x '(1 2 3) y '(4 . 5)) => (4 . 5)
(
;;; 下記の宣言は特に使いやすい指定ではありません。
;;; これらはただLOCALLYを使った正しい宣言の構文の例です。
locally (declare (inline floor) (notinline car cdr))
(declare (optimize space))
(floor (car x) (cdr y))) => 0, 1
(;;; この例はlocally定義による特定のOPTIMIZEの設定を持った
;;; 関数定義の例を示したものです。
locally (declare (optimize (safety 3) (space 3) (speed 0)))
(defun frob (w x y &optional (z (foo x y)))
(
(mumble x y z w)))=> FROB
;;; これは前回の例と同じですが、最適化の設定がその後に続く
;;; 同じコンパイルユニット内の定義に有効であることが違っています。
declaim (optimize (safety 3) (space 3) (speed 0)))
(defun frob (w x y &optional (z (foo x y)))
(
(mumble x y z w))=> FROB
なし。
なし。
なし。
locally
のspecial
宣言の使用は、 変数の束縛ではなく変数への参照に影響します。
もしlocally
フォームがトップレベルフォームであれば、 form本体もまたトップレベルフォームとして処理されます。 3.2.3. ファイルのコンパイルをご確認ください。