Gauche > Archives > 2014/11/05

2014/11/05 16:01:34 UTCshiro
#
srfi-18とsrfi-34の例外ハンドリングの違い、with-exception-handlerを変えれば良いと思い込んでいたんだけど、むしろ違うのはraiseの方か。
2014/11/05 22:05:26 UTCkaki
#
(define-module foo
  (use gauche.record)
  (export foo)
  (define-syntax foo
    (syntax-rules ()
      ((_)
       (define-record-type <foo>
           (make-foo)
           foo?)))))

(import foo)
(foo)
;; *** ERROR: unbound variable: <foo>
;;     While loading "./foo.scm" at line 12
;; Stack Trace:
;; _______________________________________
;;   0  <foo>

;;   1  (rtd-constructor <foo> #())
;;         [unknown location]
#
これってバグですよね
#
(define-library (bar)
  (import (scheme base))
  (export bar)
  (begin
    (define-syntax bar
      (syntax-rules ()
        ((_ g)
         (begin
           (define x 42)
           (define (g) x)))))))

(import (bar)
        (scheme write))
(bar f)
(display (f))
;; *** ERROR: unbound variable: x
;;     While loading "./bar.scm" at line 15
;; Stack Trace:
;; _______________________________________
;;   0  x

;;   1  (f)
;;         At line 15 of "./bar.scm"
2014/11/05 22:11:58 UTCkaki
#
こんなのもエラーになりましたがR7RS的にどうなるのかよく分かりませんでした。
#
R5RS 5.2.1節にあったトップレベルの束縛がどうとかって文言がR7RSではなくなってるぽくてなんか変わったのかなあと思ったんですが
2014/11/05 22:22:21 UTCshiro
#
んん、バグっぽいですね。後者については、議論があるのは、barが生成するトップレベルのxへの束縛が外から見えるべきか (barを呼び出した環境のxと同じになるか、マクロ展開時に生成されるユニークなxになるべきか)ってとこで、同じ展開に含まれる関数定義から参照されてるxは42にdefineされたxと同じでなければならんです。
2014/11/05 22:49:47 UTCshiro
#
ああ、直接の理由はわかった。これが現実に問題として出てきたってことだな。 https://github.com/shirok/Gauche/blob/7a7fdc76fa04ff6d140b5e4cc1bdc1dc5046167a/src/compile.scm#L1825
#
一律にrenameするのが実装としては綺麗だけど、これまでに「マクロが新たに挿入するトップレベル識別子の束縛がmacro useしてるモジュールから見えること」に依存したコードが無かったかどうか自信ない…
2014/11/05 23:40:37 UTCshiro
#
とりあえず直してみました。https://github.com/shirok/Gauche/commit/2be701e75c569ad039016959c6ee1d02751db9cb