summaryrefslogtreecommitdiffstats
path: root/brackets.scm
diff options
context:
space:
mode:
authorbnewbold <bnewbold@robocracy.org>2011-06-24 17:21:45 -0400
committerbnewbold <bnewbold@robocracy.org>2011-06-24 17:21:45 -0400
commit421dc8c7141ecb6297996f7370d96e7e99894683 (patch)
tree50b8bcf931c4dc204f74b8721de9244ab4977056 /brackets.scm
downloadslackernews-421dc8c7141ecb6297996f7370d96e7e99894683.tar.gz
slackernews-421dc8c7141ecb6297996f7370d96e7e99894683.zip
arc3.1.tar
Diffstat (limited to 'brackets.scm')
-rw-r--r--brackets.scm48
1 files changed, 48 insertions, 0 deletions
diff --git a/brackets.scm b/brackets.scm
new file mode 100644
index 0000000..fa52a53
--- /dev/null
+++ b/brackets.scm
@@ -0,0 +1,48 @@
+; From Eli Barzilay, eli@barzilay.org
+
+;> (require "brackets.scm")
+;> (use-bracket-readtable)
+;> ([+ _ 1] 10)
+;11
+
+(module brackets mzscheme
+
+; main reader function for []s
+; recursive read starts with default readtable's [ parser,
+; but nested reads still use the curent readtable:
+
+(define (read-square-brackets ch port src line col pos)
+ `(fn (_)
+ ,(read/recursive port #\[ #f)))
+
+; a readtable that is just like the builtin except for []s
+
+(define bracket-readtable
+ (make-readtable #f #\[ 'terminating-macro read-square-brackets))
+
+; call this to set the global readtable
+
+(provide use-bracket-readtable)
+
+(define (use-bracket-readtable)
+ (current-readtable bracket-readtable))
+
+; these two implement the required functionality for #reader
+
+;(define (*read inp)
+; (parameterize ((current-readtable bracket-readtable))
+; (read inp)))
+
+(define (*read . args)
+ (parameterize ((current-readtable bracket-readtable))
+ (read (if (null? args) (current-input-port) (car args)))))
+
+(define (*read-syntax src port)
+ (parameterize ((current-readtable bracket-readtable))
+ (read-syntax src port)))
+
+; and the need to be provided as `read' and `read-syntax'
+
+(provide (rename *read read) (rename *read-syntax read-syntax))
+
+)