From 82519fdd0572b63a6b16f118669eb401221e3166 Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Thu, 28 May 2015 20:45:19 -0400 Subject: [PATCH] Added unquote --- parser.scm | 25 +++++++++++++++++++++++++ test.scm | 5 +---- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/parser.scm b/parser.scm index 46f668f0..da6c9225 100644 --- a/parser.scm +++ b/parser.scm @@ -216,6 +216,31 @@ (if all? (parse fp '() new-toks all? #f #f parens ptbl) (car new-toks)))))) + ((eq? c #\,) + (cond + ((and (not all?) (not quotes) (not (null? tok))) + ;; Reached a terminal char, read out previous token + (in-port:set-buf! ptbl c) + (car (add-tok (->tok tok) toks quotes))) + (else + + ;; TODO: this is not good enough for unquote-splicing as + ;; that construct requires reading two chars ,@ + ;; need a way of peeking at the next char here, either + ;; via peek-char, or perhaps better by having a larger buffer + ;; of input chars. + + ;; Read the next expression and wrap it in a quote + (let ((sub (parse fp '() '() #f #f #f 0 ptbl))) + (define new-toks + (add-tok + (list 'unquote sub) + (get-toks tok toks quotes) + quotes)) + ;; Keep going + (if all? + (parse fp '() new-toks all? #f #f parens ptbl) + (car new-toks)))))) ((eq? c #\() (cond ((and (not all?) (not (null? tok))) diff --git a/test.scm b/test.scm index 7895dd7a..a516da0e 100644 --- a/test.scm +++ b/test.scm @@ -1,8 +1,5 @@ (import (scheme base) (scheme read)) -'aa -(define (quoted? exp) - (tagged-list? exp 'quote)) -(write (read)) +(write `(read ,(+ 1 2 3)))