summaryrefslogtreecommitdiffstats
path: root/share
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2021-05-14 06:11:59 -0700
committerKaz Kylheku <kaz@kylheku.com>2021-05-14 06:11:59 -0700
commit07c6d46b1cc8300042832c9a01fe57cdfb130db3 (patch)
treea9d8e199efb95507f88d7191520ceda2b62bc8ca /share
parent28304a063238826c7c8d1e9cad771a5d23d8b37a (diff)
downloadtxr-07c6d46b1cc8300042832c9a01fe57cdfb130db3.tar.gz
txr-07c6d46b1cc8300042832c9a01fe57cdfb130db3.tar.bz2
txr-07c6d46b1cc8300042832c9a01fe57cdfb130db3.zip
compiler: better code for global var definitions.
* eval.c (rt_defvarl): More accurate self string. (rt_defv): New static function: like rt_defvarl but ensures that the new variable has a binding cell, and returns that cell instead of the hash cell. (op_defvarl): Take advantage of rt_defv to not have to cons up the binding cell. (eval_init): Register sys:rt-defv intrinsic. * parser.c (read_file_common): Compiled files are now version 7, so we must recognize them. We still load version 6 files because rt:defvarl still exists for them. * share/txr/stdlib/compiler.tl (expand-defvarl): Improve the generated code in two ways. Firstly, use the new sys:rt-defv, which returns the binding cell, so that the value can be stored into it with rplacd without having to cons up anything. Secondly, if there is no value expression, don't emit the code to do the assignment. (%tlo-ver%): Bump compiled file version to (7 0). * txr.1: Add note about TXR 260 loading version 7 and 6.
Diffstat (limited to 'share')
-rw-r--r--share/txr/stdlib/compiler.tl12
1 files changed, 7 insertions, 5 deletions
diff --git a/share/txr/stdlib/compiler.tl b/share/txr/stdlib/compiler.tl
index 2dba0bbe..0e0f3f4f 100644
--- a/share/txr/stdlib/compiler.tl
+++ b/share/txr/stdlib/compiler.tl
@@ -1982,10 +1982,12 @@
(defun expand-defvarl (form)
(mac-param-bind form (op sym : value) form
(with-gensyms (cell)
- ^(let ((,cell (sys:rt-defvarl ',sym)))
- (if ,cell
- (usr:rplacd ,cell (cons ',sym ,value)))
- ',sym))))
+ (if value
+ ^(let ((,cell (sys:rt-defv ',sym)))
+ (if ,cell
+ (usr:rplacd ,cell ,value))
+ ',sym)
+ ^(progn (sys:rt-defv ',sym) ',sym)))))
(defun expand-defun (form)
(mac-param-bind form (op name args . body) form
@@ -2164,7 +2166,7 @@
(defvarl %big-endian% (equal (ffi-put 1 (ffi uint32)) #b'00000001'))
-(defvarl %tlo-ver% ^(6 0 ,%big-endian%))
+(defvarl %tlo-ver% ^(7 0 ,%big-endian%))
(defvarl %package-manip% '(make-package delete-package
use-package unuse-package