Discussion:
What's the error in this macro?
Add Reply
B. Pym
2024-09-21 13:29:23 UTC
Reply
Permalink
(defmacro sum (expression index initial condition)
;; Sum $expression$ for $index$ = $initial$ and successive integers,
;; as long as $condition$ holds.
(let ((temp (gensym)))
`(do ((,temp 0 (+ ,temp ,expression))
(,index ,initial (1+ ,index)))
((not ,condition) ,temp))))
The main error with this macro is that it does something you could do
with the standard LOOP. I.e. instead of debugging this macro, you could
(loop for x from 1 while (< x 6) summing x)
-> 15
Gauche Scheme

(use srfi-42) ;; sum-ec

(sum-ec (:range x 1 6) x)
===>
15
HenHanna
2024-09-24 00:49:20 UTC
Reply
Permalink
Post by B. Pym
(defmacro sum (expression index initial condition)
;; Sum $expression$ for $index$ = $initial$ and successive integers,
;; as long as $condition$ holds.
(let ((temp (gensym)))
`(do ((,temp 0 (+ ,temp ,expression))
(,index ,initial (1+ ,index)))
((not ,condition) ,temp))))
This looks good to me... Was this the corrected version?
Post by B. Pym
The main error with this macro is that it does something you could do
with the standard LOOP. I.e. instead of debugging this macro, you could
(loop for x from 1 while (< x 6) summing x) --> 15
Gauche Scheme
(use srfi-42) ;; sum-ec
(sum-ec (:range x 1 6) x) ===> 15
In Scheme and Gauche Scheme, do ppl use Gensym?


(define-macro (Sum expression index initial condition)
`(do ((%Sum 0 (+ %Sum ,expression))
(,index ,initial (+ 1 ,index)))
((not ,condition) %Sum)))

(print (macroexpand '(Sum x x 1 (< x 6))))

(print (Sum x x 1 (< x 6)))

Loading...