2010/04/25
Schemeã®ãã¯ã
ããã¯ããã³ããèªã£ã¦ããã®ã㪠:-) ã¾ããSchemeã®ãã¯ãã«ã¤ãã¦ã¯ä»æ§æ¸ã ããè¦ã¦ãããããããã®ã¯ 確ããªã®ã§ãã¡ãã£ã¨è§£èª¬ãã¦ã¿ããå¼ç¨ã¯å ¨ã¦ä¸ã®ãªã³ã¯ããã
ã¾ãããè¡ççãã¯ã (å¥å ¨ãªãã¯ã)ãã¨ãR5RS/R6RSã®ãã¯ãããæ··åããªãããã« æ°ãã¤ããããè¡ççãã¯ãã¯ä½ããã®æ¹æ³ã§ååã®è¡çªã®åé¿ããã¯ãå´ããµãã¼ããã ããã¿ã§ãsyntax-rulesãsyntax-caseã¯ãã®ä¸ã¤ã®å®è£ ã«ãããªãã
ä¸ã®ãªã³ã¯å ã®æç« ä¸ã®ãSchemeã®è¡ççãã¯ãã¯â¦ãã®é¨åã¯ã»ã¼å ¨ã¦ã ãSchemeã®syntax-rulesã¯â¦ãã¨ç½®ãæãã¦èªãã®ãè¯ãã ããã
åã«ANSI Common Lispã®ãã¯ãã¯è¡ççãã¯ãããå¼·åã ãã£ã¦ã ãã®è©±ã§ãã
CLã®ãã¯ãã¯syntax-rulesãããå¼·åãã§ãä»ã®è¡ççãã¯ãããã¯éåã
ãªãR5RSã®ãã¯ãã¨ãã¦syntax-rulesããå ¥ã£ã¦ããªããã¨ããã¨ã ããã¯syntax-rulesãè¡ççãã¯ãã¨ãã¦æè¯ã ã£ããããã§ã¯ãªãã syntax-rulesããå¼·åãªè¡ççãã¯ãã¨ãã¦ããã¤ãããåè£ã®ã©ããæ¡ç¨ãããã§æè¦ãä¸è´ããªãã£ãããã ã¨ããã®ãçç¸ã ã£ããããã
è¡ççãã¯ãã®(syntax-rules () ...)ã«é¢ãã¦è¨ãã¨ãåããããä½ã®çºã«ãããã ãã ã¶ã£ã¡ããåãããªãã§ã(ç¬)ããããããªããã ã£ããã æç¤ºããã§ãã¨ã¨ãã¡ããã®?ã¨ãæã£ã¦ããã§ãã (å®éã¯ãR6RSã«ã¯syntax-caseã¨è¨ããã®ããã)ã ã¾ããæãããSchemeã®Î»å¼ã«ããæç¶ãå®ç¾©ã¨å¯¾å¿ãããããã ãã«å ¥ã£ã¦ããã§ããããã©ãã
ä¸ã§æ¸ããããã«ãsyntax-rules以å¤ã«ãè¡ççãã¯ãã¯ããã¤ãããå¾ãã syntax-rulesãã©ã¼ã ã¯ãããèªä½ããããä½ã¬ãã«ãªãã¯ãå±éã«ã¼ãã³ãã¸ã¨å±éããã ãã¯ãã§ãããã¨ãæå³ãã¦ããã
å®éãR4RSã®ä»é²ã«ã¯ãsyntax-rulesã®ä»ã«é常ã®lambdaå¼ã§ãã¯ãã¨ãã¹ãã³ãã æ¸ãããã¯ããæç¤ºããã¦ãããã¤ã¾ãããã¿ã¼ã³è¨èªãªã©ã§ã¯ãªãSchemeèªä½ã§ ãã¯ããæ¸ãããsyntax-rulesãåãªããã¯ãã§ãå±éãããã¨ãã¯ãã¨ãã¹ãã³ãæç¶ãã« ãªãã¨ãã寸æ³ã ã
ãã ãR4RSã®ä½ã¬ãã«ãã¯ãã¯ãã¾ãã¡çãæªãã£ãã ä¾ãã°whenãã¯ãã¯ãããªæãã
;; R4RSä»é²ã®low-levelãã¯ã (define-syntax when (lambda (form) (let* ((args (unwrap-syntax (cdr (unwrap-syntax form)))) (test (car args)) (body (cdr args))) `(,(sytnax if) ,test (,(syntax begin) ,@body) #f))))
CLã®ãã¯ãã¨éãã®ã¯ä»¥ä¸ã®3ç¹ã
- 弿°ã«å ã®å¼ã丸ãã¨æ¸¡ã£ã¦ããã®ã§ãtestã¨bodyãåè§£ãã¦ãããªãã¨ãªããªãã
- ããã«ã弿°ã«æ¸¡ã£ã¦ããå¼ã«ã¯ã¬ãã·ã«ã«ãªç°å¢æ å ±ããã£ã¤ãã¦ããã®ã§ã ãã¡ãã¡unwrap-syntaxã§ããã¤ãã¨ã£ã±ãã£ã¦ããå¿ è¦ãããã
- ãã¯ãã®åºåã«ãçã®ãã·ã³ãã«ãæ¿å ¥ããã¨ã¨ã©ã¼ã«ãªãã ãã¡ãã¡syntaxã§æ§ææ å ±ãã¤ãã¦ãããªãã¨ãªããªãã
ããã¯ãããã«é¢åãããããã®ãããã R5RSã§ãã¯ããæ£å¼ã«æ¡ç¨ããã«ããã£ã¦å´ä¸ããã¦ãã¾ã£ãã
(R6RSã§å ¥ã£ãsyntax-caseã¯ä¸ã®1,2ããã¿ã¼ã³ãããã³ã°ã§ã 3ãquasisyntaxã§è§£æ±ºãã¦ããã¨è¨ããã)
ããããããããè¡ççãã¯ãã®ä¾ã¨ãã¦ã¯ãexplicit renamingã¨ããã®ãããã ããå¦çç³»ã®ãã¤ãã£ãã®ãã¯ãã·ã¹ãã ãexplicit renamingãªãã°ã ä¸å¥å ¨ãªwhenãã¯ãã¯ããæ¸ããã ããã
(define-syntax when (lambda (form rename compare) (let ((test (cadr form)) (body (cddr form))) `(if ,test (begin ,@body)))))
formã«ãã¯ããã©ã¼ã å ¨ä½ã渡ã£ã¦ããã®ã§èªåã§testã¨bodyã«åè§£ã㦠ãããªãã¨ãªããªããããªã¹ããçµã¿ç«ã¦ã¦è¿ãã°ããã®ã¯CLã®ãã¯ãã¨åãã ã
(Gaucheã¯explicit renamingãã¯ãããµãã¼ããã¦ãªãã®ã§ãä¸ã®å¼ã¯å®è¡ã§ããªãã ã¾ããå¦çç³»ã«ãã£ã¦ã¯ãã¤ãã£ãã®ä½ã¬ãã«ãã¯ããexplicit renamingã§ããã¨ã¯ éããªãã®ã§ã䏿®µãã©ã¼ã ãåã¾ãã¦ãããã¨ãå¤ã (ããããã°ä»ã®å½¢å¼ã¸ã¨ 夿ã§ããã®ã§)ãMIT-Schemeã§ã¯ãããªæãã
(define-syntax when (er-macro-transformer (lambda (form rename compare) ...)))
)
ãã¦ãä¸ã®explicit renamingãã¯ãã¯ä¸å¥å ¨ã§ããã¨æ¸ããã ãªããã¨ããã¨ããã¯ãã使ãããç°å¢ã§ãã'if'ã'begin'ãæç¸ããã¦ãã㨠誤åä½ããããã ã
(let ((if list)) (when #f (write "oops") 'a)) â whenãå±é (let ((if list)) (if #f (begin (write "oops") 'a))) â ãã®ifã¯ã¬ãã·ã«ã«ã«æç¸ããã¦ããï¼ (list #f (begin (write "oops") 'a)) ã¨åããã¨ãªã®ã§ã "oops" ãåºåããã¦ã(#f a) ã帰ãã
å®ã¯ãããã¯CLã®ãã¯ãã§ãåãã§ããã
(defmacro %when (test &body body) `(if ,test (progn ,@body))) (macrolet ((if (&body xs) `(list ,@xs))) (%when nil (write "oops") 'a)) => "oops" ãåºåãã㦠(nil a) ã帰ãã
ã¤ã¾ããCLã§ã¯å¤æ°è¡çªãå®å ¨ã«é¿ãããã¯ããæ¸ããã¨ã¯ã§ããªãã åã«ããmacroletã§ifãªãã¦ç´ãããããã¼ã«ã«ãã¯ãå®ç¾©ãããã¤ãããã ããã ã¨ãããã¨ããã¦ã«ãã¦ããã ããªã®ã ã (Allegro CLã ã¨ä¸ã®ãããªå¼ãã³ã³ãã¤ã«ãããè¦åã ãã¦ããããã©ã)
ã¾ããããã§ãCLã§ã¯å°ã£ã¦ãªãããã§ãå®ç¨ä¸ãifã ã®lambdaã ã®ã ã·ã£ãã¦ãããå±éºã£ã¦ã®ã¯ç¡è¦ãã¦ãã ããã大ä¸å¤«ãªã®ãããããªãã ãã£ã¨ãSchemeã®å ´åãLisp-1ã§ããããã§ãCLã«ã¯ãªãã ãã¼ã«ã«å¤æ°ãæ¨æºé¢æ°ãã·ã£ãã¦ãã¡ããå±éºãããããã¯ãã颿°listã¸ã® å¼ã³åºããåãè¾¼ãã§ã¦ã使ãããç°å¢ã§listãªãã¦ãããã¼ã«ã«æç¸ããã㨠ã¾ããããã ã
ä¸ã®explicit renaming macroã«ããå®ç¾©ã次ã®ããã«å¤ããã¨ã å¥å ¨(è¡çç)ãªãã¯ãã«ãªãã
(define-syntax when (lambda (form rename compare) (let ((test (cadr form)) (body (cddr form))) `(,(rename 'if) ,test (,(rename 'begin) ,@body)))))
renameã«ã¯ã·ã³ãã«ãåãæç¶ããæ¸¡ã£ã¦ãããrenameã®è¿ãå¤ã¯ã ããã®ãã¯ããå®ç¾©ãããæç¹ã§ã®ãifãbeginãæããã®ã¨åããã®ãæããå¥ã®èå¥åãã ã ä»ã¨è¡çªããªãå¥åãèªåçã«ã¤ãããããã¨æãã°ããã ããã å ·ä½çã«ãããä½ããã¯å¦çç³»ãæä¾ããã¡ã«ããºã ã«ããã®ã§ä½ã¨ãè¨ããªããã©ã
å ãã¦ãquasiquoteã¯R5RSã§ãå®ç¾©ããã¦ãããããã¯ããè¡ççãã¯ãããå®ç¾©ããã¦ãªãã®ã§ã仿§æ¸ç¯å²å ã§ã¯ä½ã®ããã«åå¨ãã¦ããã ããµãããªãã§ãããåç´ã«ããããlistã®ä»£ç¨ã¨ãã¦ãã使ãéããªãã仿§æ¸ã®ç¯å²å ã§ã¯ã
æ´å²çã«ã¯backquoteã¯ãã¯ãã®ããã«å°å ¥ãããã®ãããããªããã©ã ç¾ä»£ã®Lispã§ã¯backquoteã¯ãã¯ãã¨ç¬ç«ãã åãªããã³ãã¬ã¼ãã®ä»çµã¿ã¨èãããã¦ãããããªãããªãã ã ããå¥ã«R5RSã«ãã£ã¦ããããããªãã ãã¨ãã°Gaucheã®ã½ã¼ã¹ãè¦ã¦ãããã°ããã¯ã以å¤ã§ãquasiquoteã¯å¤§é㫠使ããã¦ãã®ããããã¨æãã ç§ãLispãç¥ããã£ããã¨ãªã£ããCããã°ã©ã ããã¯III Lispå¦çç³»ã®ä½æã ã§ãã確ããçç·´ããLispããã°ã©ãã¯listãªãã¦ä½¿ãã¾ããã ãªã¹ããä½ãæã¯backquoteã使ãã¾ããã£ã¦èª¬æããã£ããããªæ°ãããã
æå¾ã«å®è£ ä¾åã§ããã
ããã£ã±Schemeããããªãï½ï½ããã¨è¨ã人ã®çºã«ãããã¤ãã®Schemeå¦çç³»ã§ã®ä¼çµ±çãã¯ãã®ä½¿ãæ¹ãç´¹ä»ãã¦ããã¾ãã
- Gauche: ããã©ã«ãã§define-macroã¨è¨ãå½¢å¼ã§å©ç¨å¯è½ã§ãã
- PLT Scheme: (require mzlib/defmacro)ãè©ä¾¡ããå¾ãdefine-macroã¨è¨ãå½¢å¼ã§å©ç¨å¯è½ã§ãã
- Guile: ããã©ã«ãã§define-macroã¨è¨ãå½¢å¼ã§å©ç¨å¯è½ã§ãã
syntax-rulesã¯ä¸èªç±ãããã®ã ããã©ããã以å¤ã®è¡ççãã¯ãã syntax-caseãexplicit renamingçã¯ã©ããåã®ä¸ã§ã¯åãã§ãããã¨ãããã£ã¦ãã¦ã ã²ã¨ã¤ãããã°å¥ã®ãã¤ã¯ãã¼ã¿ãã«ã«å®è£ ã§ãããã¨ãããã£ã¦ããã ããã«ãã©ããã²ã¨ã¤ãããã°ä¼çµ±çãã¯ãããã¼ã¿ãã«ã«å®è£ ã§ãããã¨ãããã£ã¦ããã
ãªã®ã§ãåççã«è¨ãã°Schemeã®ä¼çµ±çãã¯ãã¯(ç¹å®ã®å®è£ ã«ãããªã ç¹æ®ãªã¡ã«ããºã ã«ä¾åããã¨ããæå³ã§ã®)å®è£ ä¾åã§ã¯ãªãã 確ãã«ä»æ§ã®ç¯å²å ã§ã¯ãªãããã©ãR6RSã®ä»æ§ã ãã§æ¸ããå¦çã§ã¯ããã
Post a comment