在 femtolisp 中添加 Do Loop 或定义一个 do 循环宏 common lisp

Adding Do Loop in femtolisp or defining a do loop macro common lisp

我在我的项目中使用 femtolisp,但它不支持 do 循环。任何人都可以指导我如何在 femtolisp 中添加 do 循环功能,或者我可以在 common lisp 中为 do 循环定义一个宏。

Femtolisp 提供 do macro。作为参考,这是它的实现:

(define-macro (do vars test-spec . commands)
  (let ((loop (gensym))
        (test-expr (car test-spec))
        (vars  (map car  vars))
        (inits (map cadr vars))
        (steps (map (lambda (x)
                      (if (pair? (cddr x))
                          (caddr x)
                          (car x)))
                    vars)))
    `(letrec ((,loop (lambda ,vars
                       (if ,test-expr
                           (begin
                             ,@(cdr test-spec))
                           (begin
                             ,@commands
                             (,loop ,.steps))))))
       (,loop ,.inits))))