Skip to content

Instantly share code, notes, and snippets.

@SaitoAtsushi
Created November 14, 2014 02:58
Show Gist options
  • Save SaitoAtsushi/967e3fad2b136f3da3f3 to your computer and use it in GitHub Desktop.
Save SaitoAtsushi/967e3fad2b136f3da3f3 to your computer and use it in GitHub Desktop.
Gauche と Scheme で結果が異なる。 ネストしている箇所の処理に何か違いが…?
(define (traverse proc obj)
(let loop ((obj obj))
(cond ((or (identifier? obj) (symbol? obj))
(proc obj))
((pair? obj)
(cons (loop (car obj)) (loop (cdr obj))))
((vector? obj)
(vector-map loop obj))
(else obj))))
(define-syntax let/scope
(er-macro-transformer
(lambda(form rename _)
(let ((scope (cadr form))
(body (cddr form)))
`(let-syntax ((,scope
(,(rename 'er-macro-transformer)
(,(rename 'lambda) (f r _)
(,(rename 'let) ((form2 (,(rename 'cdr) f)))
(,(rename 'cons)
',(rename 'begin)
(,(rename 'traverse) r form2)))))))
,@body)))))
(let ((x 1))
(let/scope scope-1
(let ((x 2))
(let/scope scope-2
(let ((x 3))
(let/scope scope-1
(let ((x 4))
(display (scope-2 (scope-1 x)))
(display (scope-2 x))
(display (scope-1 x))
(display x))))))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment