Scheme 在femtolisp中添加Do循环或定义Do循环宏common lisp

Scheme 在femtolisp中添加Do循环或定义Do循环宏common lisp,scheme,lisp,femtolisp,Scheme,Lisp,Femtolisp,我在我的项目中使用femtolisp,但它不支持do循环。有人可以指导我如何在femtolisp中添加do循环功能,或者我可以在common lisp中为do循环定义宏。femtolisp确实提供了。以下是它的实现,以供参考: (define-macro (do vars test-spec . commands) (let ((loop (gensym)) (test-expr (car test-spec)) (vars (map car vars))

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

femtolisp确实提供了。以下是它的实现,以供参考:

(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))))
Femtolisp确实提供了一个新的解决方案。以下是它的实现,以供参考:

(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))))

为什么它被标记为“C”?为什么它被标记为“C”?是的,但我使用的是它没有do实现的微型repo是的,但我使用的是它没有do实现的微型repo