aboutsummaryrefslogtreecommitdiffstats
path: root/lisp/ses.el
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/ses.el')
-rw-r--r--lisp/ses.el114
1 files changed, 114 insertions, 0 deletions
diff --git a/lisp/ses.el b/lisp/ses.el
index d7ad4056f7b..3dd3ab3dc17 100644
--- a/lisp/ses.el
+++ b/lisp/ses.el
@@ -4067,6 +4067,120 @@ Use `math-format-value' as a printer for Calc objects."
4067 #'ses--cell-value 4067 #'ses--cell-value
4068 (quote ,from) (quote ,to) ,(and rest `(quote ,rest)))) 4068 (quote ,from) (quote ,to) ,(and rest `(quote ,rest))))
4069 4069
4070(defun ses--setq-engine (arglist)
4071 (let* (undo-list
4072 undo-chunk
4073 value
4074 cell
4075 old-value
4076 old-formula
4077 new-formula
4078 old-ref
4079 row col
4080 x xrow xcol
4081 sym
4082 (setter 'sv))
4083 (ses-initialize-Dijkstra-attempt)
4084 (while arglist
4085 (setq setter
4086 (or (and (eq (car-safe arglist) ::)
4087 (progn
4088 (setq arglist (cdr arglist))
4089 (or (consp arglist) (error "Missing setter after ::"))
4090 (setq value (car arglist)
4091 arglist (cdr arglist))
4092 (pcase value
4093 ((or 'sv 'sf 'rcv 'rcf)
4094 (setq undo-list (append (list value ::) undo-list)))
4095 (_ (error "Invalid setter %S" value)))
4096 value))
4097 setter))
4098 (pcase setter
4099 ('sv
4100 (setq sym (pop arglist)
4101 value (pop arglist)
4102 undo-chunk (list value sym)
4103 value (eval value))
4104 (or (ses-is-cell-sym-p sym)
4105 (error "Not a SES cell symbol %S" sym))
4106 (setq row (ses-sym-rowcol sym)
4107 col (cdr row)
4108 row (car row)
4109 cell (ses-get-cell row col)
4110 new-formula (if (atom value) value `(quote ,value)))
4111 .
4112 #1=(;; This is a simplified ses-cell-set-formula, as values don't have
4113 ;; reference lists
4114 (setq old-formula (ses-cell-formula cell)
4115 old-ref (ses-formula-references old-formula)
4116 old-value (symbol-value sym))
4117 (unless (and (equal old-value value)
4118 (equal old-formula new-formula))
4119 (let ((inhibit-quit t))
4120 (set sym value)
4121 (ses-set-cell row col 'formula new-formula)
4122 (dolist (ref old-ref)
4123 (setq x (ses-sym-rowcol ref))
4124 (and (consp x)
4125 (< (setq xrow (car x)) ses--numrows)
4126 (< (setq xcol (cdr x)) ses--numcols)
4127 (ses-set-cell xrow xcol 'references
4128 (delq sym (ses-cell-references xrow xcol)))))
4129 (ses-update-cells (ses-cell-references row col)))
4130 (cl-pushnew (cons row col) ses--deferred-write :test #'equal)
4131 (ses-print-cell row col))
4132 (setq undo-list (append undo-chunk undo-list))))
4133
4134 ('rcv
4135 (setq row (pop arglist)
4136 col (pop arglist)
4137 value (pop arglist)
4138 undo-chunk (list value col row)
4139 row (eval row)
4140 col (eval col)
4141 value (eval value)
4142 cell (ses-get-cell row col)
4143 sym (ses-cell-symbol cell)
4144 new-formula (if (atom value) value `(quote ,value)))
4145 . #1#)
4146 ('sf
4147 (setq sym (pop arglist)
4148 new-formula (pop arglist)
4149 undo-chunk (list new-formula sym))
4150 (or (ses-is-cell-sym-p sym)
4151 (error "Not a SES cell symbol %S" sym))
4152 (setq row (ses-sym-rowcol sym)
4153 col (cdr row)
4154 row (car row)
4155 cell (ses-get-cell row col))
4156 .
4157 #2=((ses-cell-set-formula row col new-formula)
4158 (ses-update-cells (prog1 ses--deferred-recalc
4159 (setq ses--deferred-recalc nil)))
4160 (ses-print-cell row col)
4161 (ses-update-cells (ses-cell-references row col))
4162 (setq undo-list (append undo-chunk undo-list))
4163 ))
4164 ('rcf
4165 (setq row (pop arglist)
4166 col (pop arglist)
4167 new-formula (pop arglist)
4168 undo-chunk (list new-formula col row)
4169 row (eval row)
4170 col (eval col)
4171 cell (ses-get-cell row col)
4172 sym (ses-cell-symbol cell))
4173 . #2#)
4174 (_ (error "INTERNAL"))))
4175 (ses-write-cells)
4176 value))
4177
4178(defmacro ses-setq (&rest args)
4179 "Sets cells values or formulaes programmatically.
4180
4181ARGS is a list of elements that are processed "
4182 `(ses--setq-engine (quote ,args)))
4183
4070(defun ses-delete-blanks (&rest args) 4184(defun ses-delete-blanks (&rest args)
4071 "Return ARGS reversed, with the blank elements (nil and *skip*) removed." 4185 "Return ARGS reversed, with the blank elements (nil and *skip*) removed."
4072 (let (result) 4186 (let (result)