iota関数はSchemeのSRFIに倣いつつも、吉田先生はその仕組みを段階を追って説明、コードを示しています。この数列をあれこれと関数のフィルターに通すことにより、特定の性質をもった数列を生成して検証していく流れになっています。
ISLispだとこんな表現になるだろうと思います。
(defun iota (n :rest opt)
(let ((start (if (>= (length opt) 1) (elt opt 0) 1))
(step (if (= (length opt) 2) (elt opt 1) 1)))
(for ((m start (+ m step))
(ls nil (cons m ls)))
((> m n)
(reverse ls)))))
引き数は第一のnは必須です。開始数と更新加算する数はオプションです。:restで与えています。
EISLのインタプリタで実行してみます。
Easy-ISLisp Ver0.62
> T
> (iota 10)
(1 2 3 4 5 6 7 8 9 10)
> (iota 10 2)
(2 3 4 5 6 7 8 9 10)
> (iota 10 2 3)
(2 5 8)
>
FASTコンパイラにかけてみます。C:\Babbage>eisl -c compiler.o
eisl -c compiler.o
Easy-ISLisp Ver0.62
> (compile-file "prime.lsp")
initialize
pass1
pass2
compiling FILTER
compiling ODDP
compiling IOTA
finalize
invoke GCC
T
> (load "prime.o")
T
> (iota 10)
(1 2 3 4 5 6 7 8 9 10)
> (iota 10 2)
(2 3 4 5 6 7 8 9 10)
> (iota 10 2 3)
(2 5 8)
>
良さそうです。