我想为iterate宏定义一个新的子句,类似于Python中的range函数,其中包含start, stop, step
参数。下面是第一次尝试:
(defmacro-clause (for var start start stop stop step step)
(if (minusp step)
`(for ,var from ,start downto ,stop by (- ,step))
`(for ,var from ,start to ,stop by ,step)))
使用迭代的 to
和 downto
关键字处理增加和减少的范围。(请注意,与 Python 不同,这些关键字包括 stop
值。)
对于以下内容,这样的操作能够正常运行
(iter (for x start 5 stop 3 step -1)
(collect x))
;; => (5 4 3)
(iter (for x start 2 stop 5 step 1)
(collect x))
;; => (3,4,5)
然而,它对像这样的任何东西都失败了
(let ((a 9)
(b 3)
(c -1))
(iter (for x start a stop b step c)
(collect x)))
iterate
需要在这些地方明确的数字,这是它的一个怪癖吗?但它对这样的事情没有问题:
(iter (for x below (+ 3 3) by (+ 1 1))
(collect x))
具体来说,我的问题是如何定义一个新的iterate
子句,该子句接受绑定到这些位置上的数字变量?
step
。如果它不是数字字面量,那么这根本不起作用,否则也不会按预期工作。 - Svante