diff options
| author | Vincent Belaïche | 2025-05-23 10:00:48 +0200 |
|---|---|---|
| committer | Vincent Belaïche | 2025-06-21 21:13:24 +0200 |
| commit | dec75392335df90f4413ef311c735bde5d58601c (patch) | |
| tree | 69743fc3425fb3d6cc08c462e3077da9008fc78a | |
| parent | 6c2256f52eefff79da57a8eb4db38796c40381ea (diff) | |
| download | emacs-dec75392335df90f4413ef311c735bde5d58601c.tar.gz emacs-dec75392335df90f4413ef311c735bde5d58601c.zip | |
Rewrite ses-set to be lexical-binding-proof.scratch/ses-programmatic-editing-1
| -rw-r--r-- | lisp/ses.el | 276 | ||||
| -rw-r--r-- | test/lisp/ses-tests.el | 227 |
2 files changed, 268 insertions, 235 deletions
diff --git a/lisp/ses.el b/lisp/ses.el index 1c78fbf7624..daf08963114 100644 --- a/lisp/ses.el +++ b/lisp/ses.el | |||
| @@ -4069,142 +4069,148 @@ Use `math-format-value' as a printer for Calc objects." | |||
| 4069 | #'ses--cell-value | 4069 | #'ses--cell-value |
| 4070 | (quote ,from) (quote ,to) ,(and rest `(quote ,rest)))) | 4070 | (quote ,from) (quote ,to) ,(and rest `(quote ,rest)))) |
| 4071 | 4071 | ||
| 4072 | (defun ses--setq-engine (arglist) | ||
| 4073 | (let* (undo-list | ||
| 4074 | undo-chunk | ||
| 4075 | value | ||
| 4076 | cell | ||
| 4077 | old-value | ||
| 4078 | old-formula | ||
| 4079 | new-formula | ||
| 4080 | old-ref | ||
| 4081 | row col | ||
| 4082 | x xrow xcol | ||
| 4083 | sym | ||
| 4084 | (setter 'sv)) | ||
| 4085 | (ses-initialize-Dijkstra-attempt) | ||
| 4086 | (while arglist | ||
| 4087 | (setq setter | ||
| 4088 | (or (and (eq (car-safe arglist) ::) | ||
| 4089 | (progn | ||
| 4090 | (setq arglist (cdr arglist)) | ||
| 4091 | (or (consp arglist) (error "Missing setter after ::")) | ||
| 4092 | (setq value (car arglist) | ||
| 4093 | arglist (cdr arglist)) | ||
| 4094 | (pcase value | ||
| 4095 | ((or 'sv 'sf 'rcv 'rcf 'sfq 'rcfq) | ||
| 4096 | (setq undo-list (append (list value ::) undo-list))) | ||
| 4097 | (_ (error "Invalid setter %S" value))) | ||
| 4098 | value)) | ||
| 4099 | setter)) | ||
| 4100 | (pcase setter | ||
| 4101 | ('sv | ||
| 4102 | (setq sym (pop arglist) | ||
| 4103 | value (pop arglist) | ||
| 4104 | undo-chunk (list value sym) | ||
| 4105 | value (eval value)) | ||
| 4106 | (or (ses-is-cell-sym-p sym) | ||
| 4107 | (error "Not a SES cell symbol %S" sym)) | ||
| 4108 | (setq row (ses-sym-rowcol sym) | ||
| 4109 | col (cdr row) | ||
| 4110 | row (car row) | ||
| 4111 | cell (ses-get-cell row col) | ||
| 4112 | new-formula (if (atom value) value `(quote ,value))) | ||
| 4113 | . | ||
| 4114 | #1=(;; This is a simplified ses-cell-set-formula, as values don't have | ||
| 4115 | ;; reference lists | ||
| 4116 | (setq old-formula (ses-cell-formula cell) | ||
| 4117 | old-ref (ses-formula-references old-formula) | ||
| 4118 | old-value (symbol-value sym)) | ||
| 4119 | (unless (and (equal old-value value) | ||
| 4120 | (equal old-formula new-formula)) | ||
| 4121 | (let ((inhibit-quit t)) | ||
| 4122 | (set sym value) | ||
| 4123 | (ses-set-cell row col 'formula new-formula) | ||
| 4124 | (dolist (ref old-ref) | ||
| 4125 | (setq x (ses-sym-rowcol ref)) | ||
| 4126 | (and (consp x) | ||
| 4127 | (< (setq xrow (car x)) ses--numrows) | ||
| 4128 | (< (setq xcol (cdr x)) ses--numcols) | ||
| 4129 | (ses-set-cell xrow xcol 'references | ||
| 4130 | (delq sym (ses-cell-references xrow xcol))))) | ||
| 4131 | (ses-update-cells (ses-cell-references row col))) | ||
| 4132 | (cl-pushnew (cons row col) ses--deferred-write :test #'equal) | ||
| 4133 | (ses-print-cell row col)) | ||
| 4134 | (setq undo-list (append undo-chunk undo-list)))) | ||
| 4135 | |||
| 4136 | ('rcv | ||
| 4137 | (setq row (pop arglist) | ||
| 4138 | col (pop arglist) | ||
| 4139 | value (pop arglist) | ||
| 4140 | undo-chunk (list value col row) | ||
| 4141 | row (eval row) | ||
| 4142 | col (eval col) | ||
| 4143 | value (eval value) | ||
| 4144 | cell (ses-get-cell row col) | ||
| 4145 | sym (ses-cell-symbol cell) | ||
| 4146 | new-formula (if (atom value) value `(quote ,value))) | ||
| 4147 | . #1#) | ||
| 4148 | ('sf | ||
| 4149 | (setq sym (pop arglist) | ||
| 4150 | new-formula (pop arglist) | ||
| 4151 | undo-chunk (list new-formula sym)) | ||
| 4152 | (or (ses-is-cell-sym-p sym) | ||
| 4153 | (error "Not a SES cell symbol %S" sym)) | ||
| 4154 | (setq row (ses-sym-rowcol sym) | ||
| 4155 | col (cdr row) | ||
| 4156 | row (car row) | ||
| 4157 | cell (ses-get-cell row col)) | ||
| 4158 | . | ||
| 4159 | #2=((ses-cell-set-formula row col new-formula) | ||
| 4160 | (ses-update-cells (prog1 ses--deferred-recalc | ||
| 4161 | (setq ses--deferred-recalc nil))) | ||
| 4162 | (ses-print-cell row col) | ||
| 4163 | (ses-update-cells (ses-cell-references row col)) | ||
| 4164 | (setq undo-list (append undo-chunk undo-list)) | ||
| 4165 | )) | ||
| 4166 | ('rcf | ||
| 4167 | (setq row (pop arglist) | ||
| 4168 | col (pop arglist) | ||
| 4169 | new-formula (pop arglist) | ||
| 4170 | undo-chunk (list new-formula col row) | ||
| 4171 | row (eval row) | ||
| 4172 | col (eval col) | ||
| 4173 | cell (ses-get-cell row col) | ||
| 4174 | sym (ses-cell-symbol cell)) | ||
| 4175 | . #2#) | ||
| 4176 | ('sfq | ||
| 4177 | (setq sym (pop arglist) | ||
| 4178 | new-formula (pop arglist) | ||
| 4179 | undo-chunk (list new-formula sym)) | ||
| 4180 | (or (ses-is-cell-sym-p sym) | ||
| 4181 | (error "Not a SES cell symbol %S" sym)) | ||
| 4182 | (setq row (ses-sym-rowcol sym) | ||
| 4183 | col (cdr row) | ||
| 4184 | row (car row) | ||
| 4185 | new-formula (eval new-formula) | ||
| 4186 | cell (ses-get-cell row col)) | ||
| 4187 | . #2#) | ||
| 4188 | ('rcfq | ||
| 4189 | (setq row (pop arglist) | ||
| 4190 | col (pop arglist) | ||
| 4191 | new-formula (pop arglist) | ||
| 4192 | undo-chunk (list new-formula col row) | ||
| 4193 | row (eval row) | ||
| 4194 | col (eval col) | ||
| 4195 | new-formula (eval new-formula) | ||
| 4196 | cell (ses-get-cell row col) | ||
| 4197 | sym (ses-cell-symbol cell)) | ||
| 4198 | . #2#) | ||
| 4199 | (_ (error "INTERNAL")))) | ||
| 4200 | (ses-write-cells) | ||
| 4201 | value)) | ||
| 4202 | |||
| 4203 | (defmacro ses-setq (&rest args) | ||
| 4204 | "Sets cells values or formulaes programmatically. | ||
| 4205 | 4072 | ||
| 4206 | ARGS is a list of elements that are processed " | 4073 | (defun ses--set-value (cell sym row col new-formula new-value) |
| 4207 | `(ses--setq-engine (quote ,args))) | 4074 | ;; This is a faster ses-cell-set-formula, as values don't have |
| 4075 | ;; reference lists | ||
| 4076 | (let* ((old-formula (ses-cell-formula cell)) | ||
| 4077 | (old-ref (ses-formula-references old-formula)) | ||
| 4078 | (old-value (symbol-value sym)) | ||
| 4079 | x xrow xcol) | ||
| 4080 | (unless (and (equal old-value new-value) | ||
| 4081 | (equal old-formula new-formula)) | ||
| 4082 | (let ((inhibit-quit t)) | ||
| 4083 | (set sym new-value) | ||
| 4084 | (ses-set-cell row col 'formula new-formula) | ||
| 4085 | (dolist (ref old-ref) | ||
| 4086 | (setq x (ses-sym-rowcol ref)) | ||
| 4087 | (and (consp x) | ||
| 4088 | (< (setq xrow (car x)) ses--numrows) | ||
| 4089 | (< (setq xcol (cdr x)) ses--numcols) | ||
| 4090 | (ses-set-cell xrow xcol 'references | ||
| 4091 | (delq sym (ses-cell-references xrow xcol))))) | ||
| 4092 | (ses-update-cells (ses-cell-references row col))) | ||
| 4093 | (cl-pushnew (cons row col) ses--deferred-write :test #'equal) | ||
| 4094 | (ses-print-cell row col)) | ||
| 4095 | ;(push `(apply ses--set-value ,cell ,sym ,row ,col ,old-formula ,old-value) buffer-undo-list) | ||
| 4096 | )) | ||
| 4097 | |||
| 4098 | (defun ses--sv-set (sym value) | ||
| 4099 | (let* ((rowcol (ses-sym-rowcol sym)) | ||
| 4100 | (col (cdr rowcol)) | ||
| 4101 | (row (car rowcol)) | ||
| 4102 | (cell (ses-get-cell row col)) | ||
| 4103 | (new-formula (if (atom value) value `(quote ,value)))) | ||
| 4104 | (ses--set-value cell sym row col new-formula value))) | ||
| 4105 | |||
| 4106 | (defun ses--rcv-set (row col value) | ||
| 4107 | (let* ((cell (ses-get-cell row col)) | ||
| 4108 | (sym (ses-cell-symbol cell)) | ||
| 4109 | (new-formula (if (atom value) value `(quote ,value)))) | ||
| 4110 | (ses--set-value cell sym row col new-formula value))) | ||
| 4111 | |||
| 4112 | (defun ses--set-formula (cell sym row col new-formula) | ||
| 4113 | ;; This is a simplified ses-cell-set-formula, as values don't have | ||
| 4114 | ;; reference lists | ||
| 4115 | (let* ((old-formula (ses-cell-formula cell))) | ||
| 4116 | (ses-cell-set-formula row col new-formula) | ||
| 4117 | (ses-update-cells (prog1 ses--deferred-recalc | ||
| 4118 | (setq ses--deferred-recalc nil))) | ||
| 4119 | (ses-print-cell row col) | ||
| 4120 | (ses-update-cells (ses-cell-references row col)) | ||
| 4121 | ; (push `(apply ses--set-formula ,cell ,sym ,row ,col ,old-formula) buffer-undo-list) | ||
| 4122 | )) | ||
| 4123 | |||
| 4124 | (defun ses--sf-set (sym formula) | ||
| 4125 | (let* ((rowcol (ses-sym-rowcol sym)) | ||
| 4126 | (col (cdr rowcol)) | ||
| 4127 | (row (car rowcol)) | ||
| 4128 | (cell (ses-get-cell row col))) | ||
| 4129 | (ses--set-formula cell sym row col formula))) | ||
| 4130 | |||
| 4131 | (defun ses--rcf-set (row col formula) | ||
| 4132 | (let* ((cell (ses-get-cell row col)) | ||
| 4133 | (sym (ses-cell-symbol cell))) | ||
| 4134 | (ses--set-formula cell sym row col formula))) | ||
| 4135 | |||
| 4136 | |||
| 4137 | (defmacro ses-set (&rest args) | ||
| 4138 | "Sets cells values or formulaes programmatically. | ||
| 4139 | ARGS is a list of elements chunks that are processed. Each element chunk | ||
| 4140 | is either a setter switch or setting a cell. Possible setters are 'sqv', | ||
| 4141 | 'sv', 'sf', 'sqf', 'sfq', 'sqfq', 'rcv', 'rcf' or 'rcfq'. Default setter | ||
| 4142 | is 'sqv'. Setter can be switched by element chunk | ||
| 4143 | |||
| 4144 | :: NEW-SETTER | ||
| 4145 | |||
| 4146 | In the setter id 's' means symbol, 'rc' means row-column, 's' or 'rc' | ||
| 4147 | tells whether the cell is pointed at by a symbol or by coordinates. 'v' | ||
| 4148 | means value, and 'f' means formula and this tells what is assigned to cell. | ||
| 4149 | 'q' tells whether the element is implicitely quoted or not. | ||
| 4150 | |||
| 4151 | So: | ||
| 4152 | |||
| 4153 | (set-set A1 1 :: sv 'A2 2 :: sqfq B1 (+ A1 A2) :: sqf B2 '(+ A1 A2)) | ||
| 4154 | |||
| 4155 | will set A1 to value 1, A2 to value 2, B1 to formula A1+A2, and B2 to | ||
| 4156 | formula A1+A2. The same settings can be done as: | ||
| 4157 | |||
| 4158 | (set-set :: rcv 0 0 1 1 0 2 :: rcfq 0 1 (+ A1 A2) :: rcf 1 1 '(+ A1 A2)) | ||
| 4159 | |||
| 4160 | " | ||
| 4161 | (let ((setter-id 'sqv) | ||
| 4162 | (argsq `(,@args)) | ||
| 4163 | result | ||
| 4164 | next-setter-id) | ||
| 4165 | `(progn | ||
| 4166 | (ses-initialize-Dijkstra-attempt) ; (ses-begin-change) | ||
| 4167 | ,@(progn | ||
| 4168 | (while argsq | ||
| 4169 | (setq next-setter-id (car argsq)) | ||
| 4170 | (if (eq next-setter-id ::) | ||
| 4171 | (progn | ||
| 4172 | (pop argsq) | ||
| 4173 | (setq setter-id (or (pop argsq) (error "Expected setter id")))) | ||
| 4174 | (cond | ||
| 4175 | ((eq setter-id 'sqfq) | ||
| 4176 | (push `(ses--sf-set (quote ,(or (pop argsq) (error "expected symbol"))) | ||
| 4177 | (quote ,(or (pop argsq) (error "expected formula")))) result)) | ||
| 4178 | ((eq setter-id 'rcfq) | ||
| 4179 | (push `(ses--rcf-set | ||
| 4180 | ,(or (pop argsq) (error "expected row")) | ||
| 4181 | ,(or (pop argsq) (error "expected col")) | ||
| 4182 | (quote ,(or (pop argsq) (error "expected formula")))) result)) | ||
| 4183 | |||
| 4184 | ((eq setter-id 'sqv) | ||
| 4185 | (push `(ses--sv-set (quote ,(or (pop argsq) (error "expected symbol"))) | ||
| 4186 | ,(or (pop argsq) (error "expected value"))) result)) | ||
| 4187 | ((eq setter-id 'sv) | ||
| 4188 | (push `(ses--sv-set ,(or (pop argsq) (error "expected symbol")) | ||
| 4189 | ,(or (pop argsq) (error "expected value"))) result)) | ||
| 4190 | ((eq setter-id 'rcv) | ||
| 4191 | (push `(ses--rcv-set | ||
| 4192 | ,(or (pop argsq) (error "expected row")) | ||
| 4193 | ,(or (pop argsq) (error "expected col")) | ||
| 4194 | ,(or (pop argsq) (error "expected value"))) result)) | ||
| 4195 | |||
| 4196 | ((eq setter-id 'sqf) | ||
| 4197 | (push `(ses--sf-set (quote ,(or (pop argsq) (error "expected symbol"))) | ||
| 4198 | ,(or (pop argsq) (error "expected formula"))) result)) | ||
| 4199 | ((eq setter-id 'sf) | ||
| 4200 | (push `(ses--sf-set ,(or (pop argsq) (error "expected symbol")) | ||
| 4201 | ,(or (pop argsq) (error "expected formula"))) result)) | ||
| 4202 | |||
| 4203 | ((eq setter-id 'sfq) | ||
| 4204 | (push `(ses--sf-set ,(or (pop argsq) (error "expected symbol")) | ||
| 4205 | (quote ,(or (pop argsq) (error "expected formula")))) result)) | ||
| 4206 | ((eq setter-id 'rcf) | ||
| 4207 | (push `(ses--rcf-set | ||
| 4208 | ,(or (pop argsq) (error "expected row")) | ||
| 4209 | ,(or (pop argsq) (error "expected col")) | ||
| 4210 | ,(or (pop argsq) (error "expected formula"))) result)) | ||
| 4211 | |||
| 4212 | (t (error "Invalid setter id %S" setter-id))))) | ||
| 4213 | (nreverse result))))) | ||
| 4208 | 4214 | ||
| 4209 | (defun ses-delete-blanks (&rest args) | 4215 | (defun ses-delete-blanks (&rest args) |
| 4210 | "Return ARGS reversed, with the blank elements (nil and *skip*) removed." | 4216 | "Return ARGS reversed, with the blank elements (nil and *skip*) removed." |
diff --git a/test/lisp/ses-tests.el b/test/lisp/ses-tests.el index 94f7b46d83e..5ae69ff685a 100644 --- a/test/lisp/ses-tests.el +++ b/test/lisp/ses-tests.el | |||
| @@ -341,19 +341,19 @@ cell has to be rewritten to data area." | |||
| 341 | (>= x 4))) | 341 | (>= x 4))) |
| 342 | '(9 10)))) | 342 | '(9 10)))) |
| 343 | 343 | ||
| 344 | ;; Tests for ses-setq | 344 | ;; Tests for ses-set |
| 345 | 345 | ||
| 346 | (ert-deftest ses-setq-sv () | 346 | (ert-deftest ses-set-sv () |
| 347 | "Set values, cells denoted by symbol." | 347 | "Set values, cells denoted by symbol." |
| 348 | (let ((ses-initial-size '(4 . 3)) | 348 | (let ((ses-initial-size '(4 . 3)) |
| 349 | (ses-after-entry-functions nil)) | 349 | (ses-after-entry-functions nil)) |
| 350 | (with-temp-buffer | 350 | (with-temp-buffer |
| 351 | (ses-mode) | 351 | (ses-mode) |
| 352 | (ses-setq A1 1 B1 2 | 352 | (ses-set A1 1 B1 2 |
| 353 | A2 (+ A1 B1) B2 (+ B1 A2)) | 353 | A2 (+ A1 B1) B2 (+ B1 A2)) |
| 354 | (should (eq A2 3)) | 354 | (should (eq A2 3)) |
| 355 | (should (eq B2 5)) | 355 | (should (eq B2 5)) |
| 356 | (ses-setq A1 0) | 356 | (ses-set A1 0) |
| 357 | ;; values are'nt changed because (+ A1 B1) and (+ B1 A2) are | 357 | ;; values are'nt changed because (+ A1 B1) and (+ B1 A2) are |
| 358 | ;; evaluated before being set to A2 and B2. So A2's formula is 3, | 358 | ;; evaluated before being set to A2 and B2. So A2's formula is 3, |
| 359 | ;; and B2's formula is 5 | 359 | ;; and B2's formula is 5 |
| @@ -361,30 +361,30 @@ cell has to be rewritten to data area." | |||
| 361 | (should (eq B2 5)) | 361 | (should (eq B2 5)) |
| 362 | ))) | 362 | ))) |
| 363 | 363 | ||
| 364 | (ert-deftest ses-setq-sv-sf () | 364 | (ert-deftest ses-set-sqv-sqfq () |
| 365 | "Set values and formulas, cells denoted by symbol." | 365 | "Set values and formulas, cells denoted by symbol." |
| 366 | (let ((ses-initial-size '(4 . 3)) | 366 | (let ((ses-initial-size '(4 . 3)) |
| 367 | (ses-after-entry-functions nil)) | 367 | (ses-after-entry-functions nil)) |
| 368 | (with-temp-buffer | 368 | (with-temp-buffer |
| 369 | (ses-mode) | 369 | (ses-mode) |
| 370 | (ses-setq A1 1 B1 2 | 370 | (ses-set A1 1 B1 2 |
| 371 | :: sf A2 (+ A1 B1) B2 (+ B1 A2)) | 371 | :: sqfq A2 (+ A1 B1) B2 (+ B1 A2)) |
| 372 | (should (eq A1 1)) | 372 | (should (eq A1 1)) |
| 373 | (should (eq B1 2)) | 373 | (should (eq B1 2)) |
| 374 | (should (eq A2 3)) | 374 | (should (eq A2 3)) |
| 375 | (should (eq B2 5)) | 375 | (should (eq B2 5)) |
| 376 | (ses-setq A1 0) | 376 | (ses-set A1 0) |
| 377 | (should (eq A2 2)) | 377 | (should (eq A2 2)) |
| 378 | (should (eq B2 4)) | 378 | (should (eq B2 4)) |
| 379 | ))) | 379 | ))) |
| 380 | 380 | ||
| 381 | (ert-deftest ses-setq-rcv () | 381 | (ert-deftest ses-set-rcv () |
| 382 | "Set values, cells denoted by coordinates." | 382 | "Set values, cells denoted by coordinates." |
| 383 | (let ((ses-initial-size '(4 . 3)) | 383 | (let ((ses-initial-size '(4 . 3)) |
| 384 | (ses-after-entry-functions nil)) | 384 | (ses-after-entry-functions nil)) |
| 385 | (with-temp-buffer | 385 | (with-temp-buffer |
| 386 | (ses-mode) | 386 | (ses-mode) |
| 387 | (ses-setq :: rcv | 387 | (ses-set :: rcv |
| 388 | 0 0 1; A1 := 1 | 388 | 0 0 1; A1 := 1 |
| 389 | 0 1 2; B1 := 2 | 389 | 0 1 2; B1 := 2 |
| 390 | 1 0 (+ A1 B1); A2 := A1 + B1 | 390 | 1 0 (+ A1 B1); A2 := A1 + B1 |
| @@ -394,7 +394,7 @@ cell has to be rewritten to data area." | |||
| 394 | (should (eq B1 2)) | 394 | (should (eq B1 2)) |
| 395 | (should (eq A2 3)) | 395 | (should (eq A2 3)) |
| 396 | (should (eq B2 5)) | 396 | (should (eq B2 5)) |
| 397 | (ses-setq A1 0) | 397 | (ses-set A1 0) |
| 398 | (should (eq A1 0)) | 398 | (should (eq A1 0)) |
| 399 | ;; values are'nt changed because (+ A1 B1) and (+ B1 A2) are | 399 | ;; values are'nt changed because (+ A1 B1) and (+ B1 A2) are |
| 400 | ;; evaluated before being set to A2 and B2. So A2's formula is 3, | 400 | ;; evaluated before being set to A2 and B2. So A2's formula is 3, |
| @@ -403,16 +403,16 @@ cell has to be rewritten to data area." | |||
| 403 | (should (eq B2 5)) | 403 | (should (eq B2 5)) |
| 404 | ))) | 404 | ))) |
| 405 | 405 | ||
| 406 | (ert-deftest ses-setq-rcv-rcf () | 406 | (ert-deftest ses-set-rcv-rcfq () |
| 407 | "Set values and formulas, cells denoted by coordinates." | 407 | "Set values and formulas, cells denoted by coordinates." |
| 408 | (let ((ses-initial-size '(4 . 3)) | 408 | (let ((ses-initial-size '(4 . 3)) |
| 409 | (ses-after-entry-functions nil)) | 409 | (ses-after-entry-functions nil)) |
| 410 | (with-temp-buffer | 410 | (with-temp-buffer |
| 411 | (ses-mode) | 411 | (ses-mode) |
| 412 | (ses-setq :: rcv | 412 | (ses-set :: rcv |
| 413 | 0 0 1; A1 := 1 | 413 | 0 0 1; A1 := 1 |
| 414 | 0 1 2; B1 := 2 | 414 | 0 1 2; B1 := 2 |
| 415 | :: rcf | 415 | :: rcfq |
| 416 | 1 0 (+ A1 B1); A2 := A1 + B1 | 416 | 1 0 (+ A1 B1); A2 := A1 + B1 |
| 417 | 1 1 (+ B1 A2); B2 := B1 + A2 | 417 | 1 1 (+ B1 A2); B2 := B1 + A2 |
| 418 | ) | 418 | ) |
| @@ -420,105 +420,132 @@ cell has to be rewritten to data area." | |||
| 420 | (should (eq B1 2)) | 420 | (should (eq B1 2)) |
| 421 | (should (eq A2 3)) | 421 | (should (eq A2 3)) |
| 422 | (should (eq B2 5)) | 422 | (should (eq B2 5)) |
| 423 | (ses-setq A1 0) | 423 | (ses-set A1 0) |
| 424 | (should (eq A1 0)) | 424 | (should (eq A1 0)) |
| 425 | (should (eq A2 2)) | 425 | (should (eq A2 2)) |
| 426 | (should (eq B2 4)) | 426 | (should (eq B2 4)) |
| 427 | ))) | 427 | ))) |
| 428 | 428 | ||
| 429 | (ert-deftest ses-setq-rcxv () | 429 | (ert-deftest ses-set-rcxv () |
| 430 | "Set values, cells denoted by coordinates expressions." | 430 | "Set values, cells denoted by coordinates expressions." |
| 431 | (let ((ses-initial-size '(4 . 3)) | 431 | (let ((ses-initial-size '(4 . 3)) |
| 432 | (ses-after-entry-functions nil)) | 432 | (ses-after-entry-functions nil) |
| 433 | (cl-progv '(zero one) '(0 1) | 433 | (zero 0) |
| 434 | (with-temp-buffer | 434 | (one 1)) |
| 435 | (ses-mode) | 435 | (with-temp-buffer |
| 436 | (ses-setq :: rcv | 436 | (ses-mode) |
| 437 | zero zero 1; A1 := 1 | 437 | (ses-set :: rcv |
| 438 | zero one 2; B1 := 2 | 438 | zero zero 1; A1 := 1 |
| 439 | one zero (+ A1 B1); A2 := A1 + B1 | 439 | zero one 2; B1 := 2 |
| 440 | one one (+ B1 A2); B2 := B1 + A2 | 440 | one zero (+ A1 B1); A2 := A1 + B1 |
| 441 | ) | 441 | one one (+ B1 A2); B2 := B1 + A2 |
| 442 | (should (eq A2 3)) | 442 | ) |
| 443 | (should (eq B2 5)) | 443 | (should (eq A2 3)) |
| 444 | (ses-setq A1 0) | 444 | (should (eq B2 5)) |
| 445 | (should (eq A1 0)) | 445 | (ses-set A1 0) |
| 446 | ;; values are'nt changed because (+ A1 B1) and (+ B1 A2) are | 446 | (should (eq A1 0)) |
| 447 | ;; evaluated before being set to A2 and B2. So A2's formula is 3, | 447 | ;; values are'nt changed because (+ A1 B1) and (+ B1 A2) are |
| 448 | ;; and B2's formula is 5 | 448 | ;; evaluated before being set to A2 and B2. So A2's formula is 3, |
| 449 | (should (eq A2 3)) | 449 | ;; and B2's formula is 5 |
| 450 | (should (eq B2 5)))))) | 450 | (should (eq A2 3)) |
| 451 | 451 | (should (eq B2 5))))) | |
| 452 | (ert-deftest ses-setq-rcxv-rcxf () | 452 | |
| 453 | (ert-deftest ses-set-rcxv-rcxfq () | ||
| 453 | "Set values and formulas, cells denoted by coordinates expressions." | 454 | "Set values and formulas, cells denoted by coordinates expressions." |
| 454 | (let ((ses-initial-size '(4 . 3)) | 455 | (let ((ses-initial-size '(4 . 3)) |
| 455 | (ses-after-entry-functions nil)) | 456 | (ses-after-entry-functions nil) |
| 456 | (cl-progv '(zero one) '(0 1) | 457 | (zero 0) |
| 457 | (with-temp-buffer | 458 | (one 1)) |
| 458 | (ses-mode) | 459 | (with-temp-buffer |
| 459 | (ses-setq :: rcv | 460 | (ses-mode) |
| 460 | zero zero 1; A1 := 1 | 461 | (ses-set :: rcv |
| 461 | zero one 2; B1 := 2 | 462 | zero zero 1; A1 := 1 |
| 462 | :: rcf | 463 | zero one 2; B1 := 2 |
| 463 | one zero (+ A1 B1); A2 := A1 + B1 | 464 | :: rcfq |
| 464 | one one (+ B1 A2); B2 := B1 + A2 | 465 | one zero (+ A1 B1); A2 := A1 + B1 |
| 465 | ) | 466 | one one (+ B1 A2); B2 := B1 + A2 |
| 466 | (should (eq A2 3)) | 467 | ) |
| 467 | (should (eq B2 5)) | 468 | (should (eq A2 3)) |
| 468 | (ses-setq A1 0) | 469 | (should (eq B2 5)) |
| 469 | (should (eq A1 0)) | 470 | (ses-set A1 0) |
| 470 | (should (eq A2 2)) | 471 | (should (eq A1 0)) |
| 471 | (should (eq B2 4)))))) | 472 | (should (eq A2 2)) |
| 472 | 473 | (should (eq B2 4))))) | |
| 473 | (ert-deftest ses-setq-sv-sfq () | 474 | |
| 475 | (ert-deftest ses-set-sqv-sqf () | ||
| 474 | "Set values and formulas, formulas are expressions." | 476 | "Set values and formulas, formulas are expressions." |
| 475 | (let ((ses-initial-size '(4 . 3)) | 477 | (let ((ses-initial-size '(4 . 3)) |
| 476 | (ses-after-entry-functions nil)) | 478 | (ses-after-entry-functions nil) |
| 477 | (cl-progv | 479 | (A2-form '(+ A1 B1)) |
| 478 | '(A2-form B2-form) | 480 | (B2-form '(+ B1 A2))) |
| 479 | '((+ A1 B1) (+ B1 A2)) | 481 | (with-temp-buffer |
| 480 | (with-temp-buffer | 482 | (ses-mode) |
| 481 | (ses-mode) | 483 | (ses-set |
| 482 | (ses-setq | 484 | A1 1; A1 := 1 |
| 483 | A1 1; A1 := 1 | 485 | B1 2; B1 := 2 |
| 484 | B1 2; B1 := 2 | 486 | :: sqf |
| 485 | :: sfq | 487 | A2 A2-form; A2 := A1 + B1 |
| 486 | A2 A2-form; A2 := A1 + B1 | 488 | B2 B2-form; B2 := B1 + A2 |
| 487 | B2 B2-form; B2 := B1 + A2 | 489 | ) |
| 488 | ) | 490 | (should (eq A1 1)) |
| 489 | (should (eq A1 1)) | 491 | (should (eq B1 2)) |
| 490 | (should (eq B1 2)) | 492 | (should (eq A2 3)) |
| 491 | (should (eq A2 3)) | 493 | (should (eq B2 5)) |
| 492 | (should (eq B2 5)) | 494 | (ses-set A1 0) |
| 493 | (ses-setq A1 0) | 495 | (should (eq A1 0)) |
| 494 | (should (eq A1 0)) | 496 | (should (eq A2 2)) |
| 495 | (should (eq A2 2)) | 497 | (should (eq B2 4))))) |
| 496 | (should (eq B2 4)))))) | 498 | |
| 497 | 499 | (ert-deftest ses-set-rcv-rcf () | |
| 498 | (ert-deftest ses-setq-rcv-rcfq () | ||
| 499 | "Set values and formulas, cells denoted by coordinates, formulas are expressions." | 500 | "Set values and formulas, cells denoted by coordinates, formulas are expressions." |
| 500 | (let ((ses-initial-size '(4 . 3)) | 501 | (let ((ses-initial-size '(4 . 3)) |
| 501 | (ses-after-entry-functions nil)) | 502 | (ses-after-entry-functions nil) |
| 502 | (cl-progv | 503 | (A2-form '(+ A1 B1)) |
| 503 | '(A2-form B2-form) | 504 | (B2-form '(+ B1 A2))) |
| 504 | '((+ A1 B1) (+ B1 A2)) | 505 | (with-temp-buffer |
| 505 | (with-temp-buffer | 506 | (ses-mode) |
| 506 | (ses-mode) | 507 | (ses-set :: rcv |
| 507 | (ses-setq :: rcv | 508 | 0 0 1; A1 := 1 |
| 508 | 0 0 1; A1 := 1 | 509 | 0 1 2; B1 := 2 |
| 509 | 0 1 2; B1 := 2 | 510 | :: rcf |
| 510 | :: rcfq | 511 | 1 0 A2-form; A2 := A1 + B1 |
| 511 | 1 0 A2-form; A2 := A1 + B1 | 512 | 1 1 B2-form; B2 := B1 + A2 |
| 512 | 1 1 B2-form; B2 := B1 + A2 | 513 | ) |
| 513 | ) | 514 | (should (eq A1 1)) |
| 514 | (should (eq A1 1)) | 515 | (should (eq B1 2)) |
| 515 | (should (eq B1 2)) | 516 | (should (eq A2 3)) |
| 516 | (should (eq A2 3)) | 517 | (should (eq B2 5)) |
| 517 | (should (eq B2 5)) | 518 | (ses-set A1 0) |
| 518 | (ses-setq A1 0) | 519 | (should (eq A1 0)) |
| 519 | (should (eq A1 0)) | 520 | (should (eq A2 2)) |
| 520 | (should (eq A2 2)) | 521 | (should (eq B2 4))))) |
| 521 | (should (eq B2 4)))))) | 522 | |
| 523 | |||
| 524 | (ert-deftest ses-set-sv-sfq () | ||
| 525 | "Set values and formulas, symbols expressions." | ||
| 526 | (let ((ses-initial-size '(4 . 3)) | ||
| 527 | (ses-after-entry-functions nil) | ||
| 528 | (A1-sym 'A1) | ||
| 529 | (A2-sym 'A2)) | ||
| 530 | (with-temp-buffer | ||
| 531 | (ses-mode) | ||
| 532 | (ses-set | ||
| 533 | :: sv | ||
| 534 | A1-sym 1; A1 := 1 | ||
| 535 | 'B1 2; B1 := 2 | ||
| 536 | :: sf | ||
| 537 | A2-sym '(+ A1 B1); A2 := A1 + B1 | ||
| 538 | :: sfq | ||
| 539 | 'B2 (+ B1 A2); B2 := B1 + A2 | ||
| 540 | ) | ||
| 541 | (should (eq A1 1)) | ||
| 542 | (should (eq B1 2)) | ||
| 543 | (should (eq A2 3)) | ||
| 544 | (should (eq B2 5)) | ||
| 545 | (ses-set A1 0) | ||
| 546 | (should (eq A1 0)) | ||
| 547 | (should (eq A2 2)) | ||
| 548 | (should (eq B2 4))))) | ||
| 522 | 549 | ||
| 523 | (provide 'ses-tests) | 550 | (provide 'ses-tests) |
| 524 | 551 | ||