application/octet-stream
•
1.79 KB
•
38 lines
; Nujel - Copyright (C) 2020-2021 - Benjamin Vincent Schulenburg
; This project uses the MIT license, a copy should be included under /LICENSE
[defun quasiquote-real [l depth]
[if [nil? l] #nil
[if [pair? l]
[if [== [caar l] 'unquote-splicing]
[if [zero? depth]
[list 'append
[cadr [car l]]
[quasiquote-real [cdr l] depth]]
[list 'unquote-splicing
[quasiquote-real [cadr l] [+ -1 depth]]]]
[if [== [car l] 'unquote]
[if [zero? depth]
[cadr l]
[list 'unquote
[quasiquote-real [cadr l] [+ -1 depth]]]]
[if [== [car l] 'quasiquote]
[quasiquote-real [quasiquote-real [cadr l] [+ 1 depth]] depth]
[if [zero? depth]
[list 'cons
[quasiquote-real [car l] depth]
[quasiquote-real [cdr l] depth]]
[cons [quasiquote-real [car l] depth]
[quasiquote-real [cdr l] depth]]]]]]
[if [and [zero? depth] [symbol? l]]
[cons 'quote [cons l]]
l]]]]
[defmacro quasiquote [l]
[quasiquote-real l 0]]
[defun unquote [expr]
[throw [list :unquote-without-quasiquote "unquote should only occur inside a quasiquote, never evaluated directly"]]]
[defun unquote-splicing [expr]
[throw [list :unquote-splicing-without-quasiquote "unquote-splicing should only occur inside a quasiquote, never evaluated directly"]]]