Quasiquote/unquote/unquote-splicing macro working
authorTim Vaughan <tgvaughan@gmail.com>
Sat, 24 Jun 2017 10:16:32 +0000 (22:16 +1200)
committerTim Vaughan <tgvaughan@gmail.com>
Sat, 24 Jun 2017 10:16:32 +0000 (22:16 +1200)
src/testing-library.scm [new file with mode: 0644]

diff --git a/src/testing-library.scm b/src/testing-library.scm
new file mode 100644 (file)
index 0000000..fa4fb08
--- /dev/null
@@ -0,0 +1,50 @@
+(define list (lambda args args))
+
+(define join-lists
+  (lambda (l1 l2)
+    (if (null? l1)
+      l2
+      (cons (car l1) (join-lists (cdr l1) l2)))))
+
+(define-macro (cadr x) (list 'car (list 'cdr x)))
+
+(define-macro (define args . body)
+              (if (pair? args)
+                (list 'define (car args) (join-lists (list 'lambda (cdr args)) body))
+                'no-match))
+
+(define (map proc l)
+  (if (null? l)
+    '()
+    (cons (proc (car l)) (map proc (cdr l)))))
+
+
+(define-macro (not x)
+              (list 'if x #f #t))
+
+(define-macro (let args . body)
+              (join-lists
+                (list (join-lists (list 'lambda (map (lambda (x) (car x)) args)) body))
+                (map (lambda (x) (cadr x)) args)))
+
+((lambda ()
+   (define (qqhelper l)
+     (if (null? l)
+       l
+       (let ((head (car l))
+             (tail (cdr l)))
+
+         (if (pair? head)
+             (if (eq? (car head) 'unquote)
+                 (list 'cons (cadr head) (qqhelper tail))
+                 (if (eq? (car head) 'unquote-splicing)
+                     (list 'join-lists (cadr head) (qqhelper tail))
+                     (list 'cons (list 'quasiquote head) (qqhelper tail))))
+             (if (symbol? head)
+                 (list 'cons (list 'quote head) (qqhelper tail))
+                 (list 'cons head (qqhelper tail)))))))
+
+   (define-macro (quasiquote arg)
+                 (if (not (pair? arg))
+                   (list 'quote arg)
+                   (qqhelper arg)))))