Macro DO-SYMBOLS, DO-EXTERNAL-SYMBOLS, DO-ALL-SYMBOLS

UP


Macro DO-SYMBOLS, DO-EXTERNAL-SYMBOLS, DO-ALL-SYMBOLS

Macro DO-SYMBOLS, DO-EXTERNAL-SYMBOLS, DO-ALL-SYMBOLS

構文

do-symbols (var [package [result-form]]) declaration* {tag | statement}* => result*

do-external-symbols (var [package [result-form]]) declaration* {tag | statement}* => result*

do-all-symbols (var [result-form]) declaration* {tag | statement}* => result*

引数と戻り値

var - 変数名。評価されません。
package - パッケージ指定子。評価されます。 do-symbolsdo-external-symbolsの デフォルトは現在のパッケージ。
result-form - フォーム。下記の説明に従って評価されます。 デフォルトはnil
declaration - 宣言式。評価されません。
tag - goタグ。評価されません。
statement - compound-form。下記の説明に従って評価されます。
result - 通常の返却が生じたときはreturn-fromの返却値であり、 例外的な返却が生じたときは遷移が生じた値が返却されます。

定義

do-symbols, do-external-symbols, do-all-symbolsは、 パッケージのシンボルに対して繰り返しを行います。 選択されたパッケージの集合内の各シンボルについて、 varにシンボルが束縛されて、 ボディ部のstatementが実行されます。 全てのシンボルが処理されたとき、 result-formが評価されてマクロの値として返却されます。

do-symbolsは、packageでアクセス可能な シンボルに対して繰り返しを行います。 複数のパッケージから継承されているシンボルは、 statementが一回以上実行されるでしょう。

do-all-symbolsは、 全ての登録されているパッケージで繰り返しを行います。 do-all-symbolsは、どの登録されたパッケージに対しても アクセス可能ではないシンボルは処理されないので、 全てのシンボルが何であれ実行するわけではありません。 do-all-symbolsは、 いくつかのパッケージに現れるシンボルは 複数回処理されるかもしれません。

do-external-symbolsは、 packageの外部シンボルに対して繰り返しを行います。

result-formが評価されるとき、 varは束縛されておりnilの値を持っています。

nilという名前の暗黙のblockdo-symbols, do-external-symbols, do-all-symbolsフォーム全体を囲みます。 returnreturn-fromは 繰り返しを早期に終わらせるときに使用されます。

もしボディ部の実行が、 uninternの使用によって varの現在の値からシンボルを取り除く以外に、 繰り返しが行われているパッケージの 集合に含まれるシンボルに影響を与えるのであれば、 その結果は未定義です。

それぞれのマクロについて、 名前が束縛されているスコープは、 初期値フォームは含まれませんが、 しかしオプションの結果のフォームは含まれます。

ボディ部のどんなtagも、tagbodyとものとして扱われます。

例文

(make-package 'temp :use nil) =>  #<PACKAGE "TEMP">
(intern "SHY" 'temp) =>  TEMP::SHY, NIL ;SHY will be an internal symbol
                                        ;in the package TEMP
(export (intern "BOLD" 'temp) 'temp)  =>  T  ;BOLD will be external  
(let ((lst ()))
  (do-symbols (s (find-package 'temp)) (push s lst))
  lst)
=>  (TEMP::SHY TEMP:BOLD)
OR=>  (TEMP:BOLD TEMP::SHY)
(let ((lst ()))
  (do-external-symbols (s (find-package 'temp) lst) (push s lst))
  lst) 
=>  (TEMP:BOLD)
(let ((lst ()))                                                     
  (do-all-symbols (s lst)
    (when (eq (find-package 'temp) (symbol-package s)) (push s lst)))
  lst)
=>  (TEMP::SHY TEMP:BOLD)
OR=>  (TEMP:BOLD TEMP::SHY)

副作用

なし。

影響

なし。

例外

なし。

参考

intern, export, 3.6. 横断の規則と副作用

備考

なし。


TOP, Github