summaryrefslogtreecommitdiffstats
path: root/stdlib/conv.tl
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2021-06-24 07:21:38 -0700
committerKaz Kylheku <kaz@kylheku.com>2021-06-24 07:21:38 -0700
commit2034729c70161b16d99eee0503c4354df39cd49d (patch)
tree400e7b2f7c67625e7ab6da3fe4a16c3257f30eb8 /stdlib/conv.tl
parent65f1445db0d677189ab01635906869bfda56d3d9 (diff)
downloadtxr-2034729c70161b16d99eee0503c4354df39cd49d.tar.gz
txr-2034729c70161b16d99eee0503c4354df39cd49d.tar.bz2
txr-2034729c70161b16d99eee0503c4354df39cd49d.zip
file layout: moving share/txr/stdlib to stdlib.
This affects run-time also. Txr installations where the executable is not in directory ending in ${bindir} will look for stdlib rather than share/txr/stdlib, relative to the determined installation directory. * txr.c (sysroot_init): If we detect relative to the short name, or fall back on the program directory, use stdlib rather than share/txr/stdlib as the stdlib_path. * INSTALL: Update some installation notes not to refer to share/txr/stdlib but stdlib. * Makefile (STDLIB_SRCS): Refer to stdlib, not share/txr/stdlib. (clean): In unconfigured mode, remove the old share/txr/stdlib entirely. Remove .tlo files from stdlib. (install): Install lib materials from stdlib. * txr.1: Updated documentation under Deployment Directory Structure. * share/txr/stdlib/{asm,awk,build,cadr}.tl: Renamed to stdlib/{asm,awk,build,cadr}.tl. * share/txr/stdlib/{compiler,conv,copy-file,debugger}.tl: Renamed to stdlib/{compiler,conv,copy-file,debugger}.tl. * share/txr/stdlib/{defset,doc-lookup,doc-syms,doloop}.tl: Renamed to stdlib/{defset,doc-lookup,doc-syms,doloop}.tl. * share/txr/stdlib/{each-prod,error,except,ffi}.tl: Renamed to stdlib/{each-prod,error,except,ffi}.tl. * share/txr/stdlib/{getopts,getput,hash,ifa}.tl: Renamed to stdlib/{getopts,getput,hash,ifa}.tl. * share/txr/stdlib/{keyparams,match,op,optimize}.tl: Renamed to stdlib/{keyparams,match,op,optimize}.tl. * share/txr/stdlib/{package,param,path-test,pic}.tl: Renamed to stdlib/{package,param,path-test,pic}.tl. * share/txr/stdlib/{place,pmac,quips,save-exe}.tl: Renamed to stdlib/{place,pmac,quips,save-exe}.tl. * share/txr/stdlib/{socket,stream-wrap,struct,tagbody}.tl: Renamed to stdlib/{socket,stream-wrap,struct,tagbody}.tl. * share/txr/stdlib/{termios,trace,txr-case,type}.tl: Renamed to stdlib/{termios,trace,txr-case,type}.tl. * share/txr/stdlib/{ver,vm-param,with-resources,with-stream}.tl: Renamed to stdlib/{ver,vm-param,with-resources,with-stream}.tl. * share/txr/stdlib/yield.tl: Renamed to stdlib/yield.tl. * share/txr/stdlib/{txr-case,ver}.txr: Renamed to stdlib/{txr-case,ver}.txr. * gencadr.txr: Update to stdlib/place.tl. * genman.txr: Update to stdlib/cadr.tl.
Diffstat (limited to 'stdlib/conv.tl')
-rw-r--r--stdlib/conv.tl98
1 files changed, 98 insertions, 0 deletions
diff --git a/stdlib/conv.tl b/stdlib/conv.tl
new file mode 100644
index 00000000..5cd799f3
--- /dev/null
+++ b/stdlib/conv.tl
@@ -0,0 +1,98 @@
+;; Copyright 2016-2021
+;; 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.
+
+(defun sys:conv-let (. body)
+ ^(flet ((usr:i (arg : radix)
+ (toint arg radix))
+ (usr:o (arg)
+ (toint arg 8))
+ (usr:x (arg)
+ (toint arg 16))
+ (usr:b (arg)
+ (toint arg 2))
+ (usr:c (arg)
+ (toint arg #\c))
+ (usr:r (arg)
+ (tofloat arg))
+ (usr:iz (arg : radix)
+ (tointz arg radix))
+ (usr:oz (arg)
+ (tointz arg 8))
+ (usr:xz (arg)
+ (tointz arg 16))
+ (usr:bz (arg)
+ (tointz arg 2))
+ (usr:cz (arg)
+ (tointz arg #\c))
+ (usr:rz (arg)
+ (tofloatz arg)))
+ ,*body))
+
+(defun sys:do-conv (lfl mfl tfl nm list)
+ (while (and list lfl)
+ (set (car list) (call (car lfl) (car list)))
+ (set list (cdr list))
+ (set lfl (cdr lfl)))
+ (dotimes (i nm)
+ (unless list
+ (return))
+ (when mfl
+ (set (car list) (call (car mfl) (car list)))
+ (set mfl (cdr mfl)))
+ (set list (cdr list)))
+ (while (and list tfl)
+ (set (car list) (call (car tfl) (car list)))
+ (set list (cdr list))
+ (set tfl (cdr tfl))))
+
+(defun sys:conv-expand (form specs list-sym)
+ (mac-param-bind form (lead : mid trail)
+ (split* (mapcar [iff (op eq :)
+ identity
+ [iff (op eq '-)
+ (retf '(fun identity))
+ (ret ^[identity ,@1])]]
+ specs)
+ (op where (op eq :)))
+ (let ((nl (length lead))
+ (nt (length trail)))
+ (with-gensyms (i nm lfl mfl tfl)
+ (sys:conv-let
+ ^(let* ((,nm (- (length ,list-sym) ,(+ nl nt)))
+ (,lfl (list ,*lead))
+ (,mfl (if (plusp ,nm) (repeat (list ,*mid))))
+ (,tfl (list ,*trail)))
+ (sys:do-conv ,lfl ,mfl ,tfl ,nm ,list-sym)))))))
+
+(defmacro sys:conv (:form form (. specs) list-expr)
+ (cond
+ ((null specs) list-expr)
+ ((atom specs)
+ (throwf 'eval-error "~s: invalid conversion list: ~s" 'conv specs))
+ (t (with-gensyms (list-sym)
+ ^(let ((,list-sym ,list-expr))
+ ,(sys:conv-expand form specs list-sym)
+ ,list-sym)))))