From 5d1fbb6958bfab6fc09837bb60e2e4d41144d696 Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Fri, 15 Jul 2016 19:35:44 -0400 Subject: [PATCH] Initial file --- lexical-scoping-test.scm | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 lexical-scoping-test.scm diff --git a/lexical-scoping-test.scm b/lexical-scoping-test.scm new file mode 100644 index 00000000..94ca6ee2 --- /dev/null +++ b/lexical-scoping-test.scm @@ -0,0 +1,19 @@ +(import (scheme base) (scheme write)) + +;; Fails when compiling compiler benchmark: +(define (proper-length l) + (define (length l n) + (cond ((pair? l) (length (cdr l) (+ n 1))) ((null? l) n) (else #f))) + (length l 0)) + + +;; One possible idea, alpha conversion could maintain a local lexical environment, "locals" +;; and use that to rename identifiers that clash with primitives. +;; Might be able to use a list of hash tables (or alists) for this purpose. +;; Just load up a new list when a new scope is encountered, and add any +;; "define", "set!", or "lambda" variables to it. then if a ref is a +;; local, we need to rename it +;; TODO: can we use same environments as "eval" uses for this? makes +;; sense not to reinvent things + +(write (proper-length '(a b c)))