Gauche:部分継続と動的環境の実験

Gauche:部分継続と動的環境の実験

既知の問題点

;(require racket/control)      ; for Racket
;(use-modules (ice-9 control)) ; for Guile
(use gauche.partcont)         ; for Gauche
(define k1 #f)
(define k2 #f)
(let ()
  (reset
   (display "[r01]")
   (shift k (set! k1 k))
   (display "[s01]")
   (call/cc (lambda (k) (set! k2 k)))
   (display "[s02]"))
  (k1)
  (reset (reset (reset (reset (reset (k2)
                                     (display "[r11]"))
                              (display "[r21]"))
                       (display "[r31]"))
                (display "[r41]"))
         (display "[r51]"))
  (display "[end]"))
;; ==> [r01][s01][s02][s02][end]#<undef>

hamayama(2019/12/18 12:39:01 UTC)

(require racket/control)      ; for Racket
;(use-modules (ice-9 control)) ; for Guile
;(use gauche.partcont)         ; for Gauche
(define k1 #f)
(let ()
  (call/cc (lambda (k) (set! k1 k)))
  (reset (reset (reset (reset (reset (k1)))))))

hamayama(2019/12/18 12:54:24 UTC)

Shiro(2019/12/18 14:11:21 UTC): もともとのフル継続の意味論なら、「フル継続は戻らない」で正解だと 思うんですよね。Racketの設計を把握してないですが、全ては部分継続であり、 フル継続もどこかの地点からの部分継続と扱う、みたいな意味論ならあり得るかもしれないですが。


成果物

現状の最新の成果物は、以下の通りです。

部分継続と動的環境の学習の起点としては、
このページの一番下にある「参考情報リスト」の [文献A] がお勧めです。

hamayama(2019/11/17 02:57:05 UTC)(2019/11/27 08:45:11 UTC)


dynamic-test v5

hamayama(2019/11/12 13:11:59 UTC)(2019/11/13 03:23:04 UTC)


検討1 (部分継続とフル継続の組み合わせについて)

(define k1 #f)
(define (f1) (call/cc (lambda (k) (set! k1 k))) 1000)
(let () (f1) (k1))
;; ==> 無限ループ
;(require racket/control)      ; for Racket
;(use-modules (ice-9 control)) ; for Guile
(use gauche.partcont)         ; for Gauche
(define k1 #f)
(define k2 #f)
(reset
 (shift k (set! k1 k))
 (call/cc (lambda (k) (set! k2 k)))
 1000)
(let () (k1) (reset (k2)))
;; ==> 1000

hamayama(2019/11/09 08:15:22 UTC)(2019/11/10 09:28:04 UTC)


気になる例4 (shift をスキップして部分継続に侵入)

;(require racket/control)      ; for Racket
;(use-modules (ice-9 control)) ; for Guile
(use gauche.partcont)         ; for Gauche
(define k1 #f)
(define k2 #f)
(reset
 (display "[r01]")
 (call/cc (lambda (k)
            (set! k1 k)
            (shift k (set! k2 k))))
 (display "[s01]"))
;; ==> [r01]#<closure ((call/pc #f #f) . args)>
(k2)
;; ==> [s01]#<undef>
(reset (k1))
;; ==> [s01]SEGV

hamayama(2019/11/07 15:00:07 UTC)(2019/11/07 23:59:56 UTC)


気になる例3 (部分継続の内部にフル継続 (call/cc) でジャンプ)

;(require racket/control)      ; for Racket
;(use-modules (ice-9 control)) ; for Guile
(use gauche.partcont)         ; for Gauche
(define k1 #f)
(define k2 #f)
(reset
 (display "[r01]")
 (shift k (set! k1 k))
 (display "[s01]")
 (call/cc (lambda (k) (set! k2 k)))
 (display "[s02]"))
;; ==> [r01]#<closure ((call/pc #f #f) . args)>
(k1)
;; ==> [s01][s02]#<subr "continuation">
(reset (reset (k2)))
;; ==> "vm.c", line 2692 (Scm_VMReset): Assertion failed: SCM_PAIRP(vm->resetChain)

hamayama(2019/11/07 15:00:07 UTC)


気になる例2 (dynamic-wind の before 内に shift があるケース)

(require racket/control)      ; for Racket
;(use-modules (ice-9 control)) ; for Guile
;(use gauche.partcont)         ; for Gauche
(define k1 #f)
(define k2 #f)
(reset
 (dynamic-wind
  (lambda () (display "[d01]")
             (shift k (set! k1 k))
             (display "[+s01+]"))
  (lambda () (display "[d02]")
             (shift k (set! k2 k))
             (display "[*s02*]"))
  (lambda () (display "[d03]"))))
;; ==> [d01]
(k1)
;; ==> [+s01+][d02][d03]
(k2)
;; ==> [d01]
(k2)
;; ==> [d01]
(k1)
;; ==> [+s01+][*s02*][d03]

hamayama(2019/09/04 13:06:12 UTC)


気になる例1 (shift の中に shift があるケース)

(require racket/control)      ; for Racket
;(use-modules (ice-9 control)) ; for Guile
;(use gauche.partcont)         ; for Gauche
(define k1 #f)
(define k2 #f)
(reset
 (dynamic-wind
  (lambda () (display "[d01]"))
  (lambda ()
    (reset
     (dynamic-wind
      (lambda () (display "[d11]"))
      (lambda ()
        (shift k (set! k1 k)
                 (display "[s01]")
                 (shift k (set! k2 k)
                          (display "[s02]"))
                 (display "[s03]")
                 1000)
        (display "[s04]"))
      (lambda () (display "[d12]")))
     2000))
  (lambda () (display "[d02]")))
  3000)
;; ==> [d01][d11][d12][s01][s02][d02]3000
(k1)
;; ==> [d11][s04][d12]2000
(k2)
;; ==> [s03]1000

hamayama(2019/09/01 11:00:49 UTC)(2019/09/05 00:50:40 UTC)


dynamic-test v4 (没)

hamayama(2019/08/29 09:03:35 UTC)(2019/08/29 20:05:41 UTC)
(2019/08/31 09:11:49 UTC)


dynamic-test v3 (broken) (没)

(define (leak-test1 identity-thunk)
  (let loop ((id (lambda (x) x)))
    (loop (id (identity-thunk)))))
(leak-test1 (lambda () (emu-reset (emu-shift k k))))

hamayama(2019/08/12 07:06:14 UTC)(2019/08/12 11:17:16 UTC)
(2019/08/13 01:41:09 UTC)(2019/08/13 12:52:35 UTC)


dynamic-test v1 (broken) (没)

hamayama(2019/07/15 15:42:40 UTC)


Gauche-effects

https://github.com/Hamayama/Gauche-effects

hamayama(2019/08/17 11:29:19 UTC)(2019/08/29 09:03:35 UTC)


参考情報リスト

hamayama(2019/08/22 13:31:07 UTC)(2019/10/15 12:07:11 UTC)

More ...