diff options
Diffstat (limited to 'lisp/ses.el')
| -rw-r--r-- | lisp/ses.el | 114 |
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 | |||
| 4181 | ARGS 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) |