aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVincent Belaïche2025-05-23 10:00:48 +0200
committerVincent Belaïche2025-06-21 21:13:24 +0200
commitdec75392335df90f4413ef311c735bde5d58601c (patch)
tree69743fc3425fb3d6cc08c462e3077da9008fc78a
parent6c2256f52eefff79da57a8eb4db38796c40381ea (diff)
downloademacs-dec75392335df90f4413ef311c735bde5d58601c.tar.gz
emacs-dec75392335df90f4413ef311c735bde5d58601c.zip
Rewrite ses-set to be lexical-binding-proof.scratch/ses-programmatic-editing-1
-rw-r--r--lisp/ses.el276
-rw-r--r--test/lisp/ses-tests.el227
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
4206ARGS 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.
4139ARGS is a list of elements chunks that are processed. Each element chunk
4140is either a setter switch or setting a cell. Possible setters are 'sqv',
4141'sv', 'sf', 'sqf', 'sfq', 'sqfq', 'rcv', 'rcf' or 'rcfq'. Default setter
4142is 'sqv'. Setter can be switched by element chunk
4143
4144:: NEW-SETTER
4145
4146In the setter id 's' means symbol, 'rc' means row-column, 's' or 'rc'
4147tells whether the cell is pointed at by a symbol or by coordinates. 'v'
4148means 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
4151So:
4152
4153(set-set A1 1 :: sv 'A2 2 :: sqfq B1 (+ A1 A2) :: sqf B2 '(+ A1 A2))
4154
4155will set A1 to value 1, A2 to value 2, B1 to formula A1+A2, and B2 to
4156formula 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