summaryrefslogtreecommitdiffstats
path: root/share/txr/stdlib/param.tl
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2019-02-28 19:17:47 -0800
committerKaz Kylheku <kaz@kylheku.com>2019-02-28 19:17:47 -0800
commitec967106802e4007fd1d5f66219eafa3fa268053 (patch)
tree5395b04049d47b971de5bd978c7bbfc7b0744d65 /share/txr/stdlib/param.tl
parentb506c5f239d413745875e564b3a34aa6f18f3a4e (diff)
downloadtxr-ec967106802e4007fd1d5f66219eafa3fa268053.tar.gz
txr-ec967106802e4007fd1d5f66219eafa3fa268053.tar.bz2
txr-ec967106802e4007fd1d5f66219eafa3fa268053.zip
compiler: move parameter parsing to separate file.
Some upcoming work is going to use these structures. * share/txr/stdlib/compiler.tl (param-parser-base fun-param-parser, mac-param-parser): These struct definitions move to param.tl. * share/txr/stdlib/param.tl: New file.
Diffstat (limited to 'share/txr/stdlib/param.tl')
-rw-r--r--share/txr/stdlib/param.tl64
1 files changed, 64 insertions, 0 deletions
diff --git a/share/txr/stdlib/param.tl b/share/txr/stdlib/param.tl
new file mode 100644
index 00000000..2128a9d4
--- /dev/null
+++ b/share/txr/stdlib/param.tl
@@ -0,0 +1,64 @@
+;; Copyright 2019
+;; Kaz Kylheku <kaz@kylheku.com>
+;; Vancouver, Canada
+;; All rights reserved.
+;;
+;; Redistribution and use in source and binary forms, with or without
+;; modification, are permitted provided that the following conditions are met:
+;;
+;; 1. Redistributions of source code must retain the above copyright notice, this
+;; list of conditions and the following disclaimer.
+;;
+;; 2. Redistributions in binary form must reproduce the above copyright notice,
+;; this list of conditions and the following disclaimer in the documentation
+;; and/or other materials provided with the distribution.
+;;
+;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+;; DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+;; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+;; SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+;; CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+;; OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+;; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+(compile-only
+ (defstruct param-parser-base nil
+ syntax form
+ rest req opt key
+ nreq nopt nfix
+
+ (:postinit (me)
+ (let* ((rest (nthlast 0 me.syntax))
+ (fixed (ldiff me.syntax rest))
+ nonkey key)
+ (cond
+ (me.mac-param-p
+ (while fixed
+ (let ((pp (pop fixed)))
+ (caseq pp
+ ((:env :whole :form)
+ (unless fixed
+ (compile-error me.form "~s requires argument" pp))
+ (push (cons pp (pop fixed)) key))
+ (t (push pp nonkey)))))
+ (set nonkey (nreverse nonkey)
+ key (nreverse key)))
+ (t (set nonkey fixed)))
+ (tree-bind (: rp opt) (split* nonkey (op where (op eq :)))
+ (set me.rest rest
+ me.req rp
+ me.opt (mapcar [iffi atom list] opt)
+ me.key key
+ me.nreq (len rp)
+ me.nopt (len opt)
+ me.nfix (+ me.nreq me.nopt))))))
+
+ (defstruct (fun-param-parser syntax form) param-parser-base
+ (mac-param-p nil))
+
+ (defstruct (mac-param-parser syntax form) param-parser-base
+ (mac-param-p t)))
+