翻訳と辞書
Words near each other
・ 健保連
・ 健保連のすこやかさん
・ 健側
・ 健児
・ 健児の制
・ 健児制
・ 健全
・ 健全 安全 好青年
・ 健全なる精神は健全なる身体に宿る
・ 健全なネットワークビジネスを育てる議員連盟
健全なマクロ
・ 健全な法治国家のために声をあげる市民の会
・ 健全ロボ ダイミダラー
・ 健全ロボ ダイミダラー (曲)
・ 健全性
・ 健全性検査
・ 健全歯
・ 健全醗酵
・ 健全食品
・ 健勝


Dictionary Lists
翻訳と辞書 辞書検索 [ 開発暫定版 ]
スポンサード リンク

健全なマクロ : ミニ英和和英辞書
健全なマクロ[けんぜんなまくろ]
=====================================
〔語彙分解〕的な部分一致の検索結果は以下の通りです。

: [けん]
 【名詞】 1. health 2. strength 3. stick-to-itiveness 
健全 : [けんぜん]
  1. (adj-na,n) health 2. soundness 3. wholesome 
: [ぜん]
  1. (n,pref) all 2. whole 3. entire 4. complete 5. overall 6. pan 

健全なマクロ : ウィキペディア日本語版
健全なマクロ[けんぜんなまくろ]

健全なマクロHygienic macros)とは、識別子が誤って捕捉されてしまう問題が起こらないことが保証されているマクロである。SchemeDylanなどのプログラミング言語はこの機能を持っている。識別子の誤捕捉という問題は、健全なマクロが導入される以前からLispコミュニティで広く知られていた。マクロの作者は、ユニークな識別子を生成するgensymなどの言語機能を使ったり、通常使用されないような複雑な識別子を用いることで、この問題を回避してきた。健全なマクロは、誤捕捉の問題を解決する方法をマクロの展開機能に組み込むことで、問題をプログラマティックに解決している。「健全な」と意味する"hygiene"という語は、Kohlbeckerらが1986年に書いた健全なマクロの展開を導入した論文で、数学の用語の影響を受けて初めて使用された。
== マクロの問題 ==
健全なマクロの機能を持たないプログラミング言語では、マクロの展開中に作成された変数の束縛によって、すでに存在する変数の束縛が隠されてしまう可能性がある。C言語では、次のようなコードによってこの問題を説明できる。
#define INCI(i)
int main(void)
C言語のプリプロセッサで上のコードを変換すると、次のコードが生成される。
int main(void)
トップのスコープで宣言された変数 a は、マクロの中にある変数 a によって隠されてしまっている。その結果、プログラムを実行しても変数の値は変化せず、コンパイルされたプログラムは次のように出力する。
a is now 0, b is now 1
この問題を解決する最も簡単な方法は、現在のプログラムに含まれるどんな変数とも衝突しない名前を、マクロ変数に与えることである。
#define INCI(i)
int main(void)
INCIa という名前の変数が作られないかぎり、この解決方法によって正しい出力が得られる。
a is now 1, b is now 1
現在のプログラムでは問題が解決されたが、この解決策は十分頑強であるとはいえない。プログラマは、マクロの内部で使用された変数と、残りのプログラムで使われる変数とを、常に衝突しないように気をつけなければらない。たとえば、変数 INCIa についてマクロ INCI を使おうとすれば、以前のマクロで変数 a について問題が起きたのと同じように問題が起こることになる。
「健全な問題」は、変数の束縛に拡張を加える。次のようなCommon Lispのマクロを考えてみる。
(defmacro my-unless (condition &body body)
`(if (not ,condition)
(progn
,@body)))
このマクロには、変数への参照が含まれていないので、シンボル"if"、"not"、"progn" は、すべて普通の定義に束縛される。しかし、上のマクロが次のように使用された場合、
(flet ((not (x) x))
(my-unless t
(format t "This should not be printed!")))
"not"の定義はローカルな定義に置き換えられ、my-unless の展開結果が変化する。(標準の関数やオペレータのグローバルまたはローカルな再定義は、ANSI
 Common Lispによれば、不確定な振る舞いを起こすとされている。そのため、上のような使い方をしても、実際には実装によってエラーと判断される可能性がある。)

一方、健全なマクロは、すべての識別子("if"や"not")のレキシカルスコープが自動的に保存される。この性質は、「参照透過性」と呼ばれている。
しかし、プログラム内で定義した関数は同じようには保護されていないので、次のようなコードでは問題が起こることがある。
(defmacro my-unless (condition &body body)
`(if (user-defined-operator ,condition)
(progn
,@body)))
(flet ((user-defined-operator (x) x))
(my-unless t
(format t "This should not be printed!")))
この問題のCommon Lispでの解決策は、パッケージを利用することである。 パッケージの中に置かれた my-unless マクロでは、user-defined-operator はそのパッケージ内のプライペートなシンボルである。そして、ユーザーコード内の user-defined-operator は異なるシンボルとなり、マクロ内のシンボルとは無関係なものになる。
しかし、健全なマクロを使用しているSchemeなどの言語は、マクロ展開の処理の一部として自動的に参照透過性を保証することで、識別子の誤捕捉を防いでいる。ただし、識別子を意図的に補足するために、健全なマクロのメカニズムを明示的に無視できるようにしている実装もある。
たとえば、次のSchemeによるmy-unless の実装は、期待通りの振る舞いをする。
(define-syntax my-unless
(syntax-rules ()
condition body)
(if (not condition)
body
(void))
))
(let ((lambda (x) x) )
(my-unless #t
(displayln "This should not be printed!")))


抄文引用元・出典: フリー百科事典『 ウィキペディア(Wikipedia)
ウィキペディアで「健全なマクロ」の詳細全文を読む




スポンサード リンク
翻訳と辞書 : 翻訳のためのインターネットリソース

Copyright(C) kotoba.ne.jp 1997-2016. All Rights Reserved.