Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Add new ++ macro to core-macros.lfe.
  • Loading branch information
rvirding committed Mar 16, 2011
1 parent 0217bf5 commit 4597cc9
Showing 1 changed file with 16 additions and 4 deletions.
20 changes: 16 additions & 4 deletions examples/core-macros.lfe
Expand Up @@ -42,6 +42,17 @@
(defmacro cddr (x) `(cdr (cdr ,x)))

(defmacro ++
;; Cases with quoted lists.
((cons (list 'quote (cons a as)) es) `(cons ',a (++ ',as . ,es)))
((cons (list 'quote ()) es) `(++ . ,es))
;; Cases with explicit cons/list/list*.
((cons (list 'list* a) es) `(++ ,a . ,es))
((cons (cons 'list* (cons a as)) es) `(cons ,a (++ (list* . ,as) . ,es)))
((cons (cons 'list (cons a as)) es) `(cons ,a (++ (list . ,as) . ,es)))
((cons (list 'list) es) `(++ . ,es))
((cons (list 'cons h t) es) `(cons ,h (++ ,t . ,es)))
((cons () es) `(++ . ,es))
;; Default cases with unquoted arg.
((list e) e)
((cons e es) `(call 'erlang '++ ,e (++ . ,es)))
(() ()))
Expand Down Expand Up @@ -89,10 +100,11 @@
((cons e es) `(if ,e (andalso . ,es) 'false))
(() `'true))

(defmacro orelse
((list e) e)
((cons e es) `(if ,e 'true (orelse . ,es)))
(() `'false))
(defmacro orelse args ;Using single argument
(case args
((list e) e)
((cons e es) `(if ,e 'true (orelse . ,es)))
(() `'false)))

;; This version of backquote is almost an exact copy of a quasiquote
;; expander for Scheme by André van Tonder. It is very compact and
Expand Down

0 comments on commit 4597cc9

Please sign in to comment.