Skip to content

Instantly share code, notes, and snippets.

@ashiato45
Created January 21, 2024 14:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ashiato45/1c9091f421f43931fe3a31055b9c27f6 to your computer and use it in GitHub Desktop.
Save ashiato45/1c9091f421f43931fe3a31055b9c27f6 to your computer and use it in GitHub Desktop.
#lang slideshow
(require racket/control)
;; http://pllab.is.ocha.ac.jp/~asai/cw2011tutorial/main-j.pdf
;; ツリーは空リストか(left, int, right)のトリプレット
(define (walk tree)
(if (null? tree)
'()
(let ((t1 (car tree)) (n (cadr tree)) (t2 (caddr tree)))
(walk t1)
(print n)
(walk t2))))
(walk (list (list '() 2 '()) 1 '()))
(define (yield n)
(shift k (list n k)))
(define (walk2 tree)
(if (null? tree)
'()
(let ((t1 (car tree)) (n (cadr tree)) (t2 (caddr tree)))
(walk2 t1)
(yield n)
(walk2 t2))))
(let ((hoge (reset (walk2 (list (list '() 2 '()) 1 '())))))
(print (car hoge))
(let ((fuga ((cadr hoge) '())))
(print (car fuga))))
(print 'hoge)
;; treeの値と継続のペアをかえす
(define (start tree)
(reset (walk2 tree)))
(define (print_nodes tree)
(define (loop r)
(if (null? r)
'()
(let ((n (car r)) (k (cadr r)))
(print n)
(loop (k '())))))
(loop (start tree)))
(print_nodes (list (list '() 2 '()) 1 '()))
(define (same_fringe t1 t2)
(define (loop r s)
(cond
[(and (null? r) (null? s)) 'True]
[(and (not (null? r)) (not (null? s)))
(let ((rn (car r)) (rk (cadr r)) (sn (car s)) (sk (cadr s)))
(if (= rn sn)
(loop (rk '()) (sk '()))
'False))]
[else 'False]))
(loop (start t1) (start t2)))
(let ((tree1 (list (list '() 2 '()) 1 '()))
(tree2 (list (list '() 3 '()) 1 '())))
(print (same_fringe tree1 tree1))
(print (same_fringe tree1 tree2)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment