吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1782|回复: 0
收起左侧

[其他原创] LISP(SCHEME) 捏一个for和while循环

[复制链接]
lovingxiaobing 发表于 2019-12-5 01:58
总所周知,LISP中没有循环,想要循环就得递归。
我们可以用 call/cc 来捏一个循环,call/cc会跳回原来的点往下执行,关于 延续(continuation)相关的其他更深入的东西这里不赘述。

创建一个call/cc为A
在这个A中再创建一个call/cc为B
在B的位置下面就是循环体过程
此时A为break,B就为continue(默认调用继续循环)
循环的次数由循环的条件决定要不要continue。

下面就上全部代码(用lisp的scheme方言实现)
[Plain Text] 纯文本查看 复制代码
; author: 小冰哟
; email: [email]865741184@qq.com[/email]
;        [email]lovingxiaobing@qq.com[/email]

; (while! (conditional) (lambda (continue break) ...))
(define-syntax while!
  (syntax-rules ()
    ((while! (conditional) body)
      (call/cc (lambda (_break)
                 (let ((_continue 0))
                   (call/cc (lambda (__continue)
                              (set! _continue __continue)))
                              (if conditional
                                (begin (body _continue _break)
                                       (_continue))
                                (_break))))))))


(define-syntax for!
  (syntax-rules ()
    ((for! () body)
      (while (#t) body))
    ((for! (() () ()) body)
      (for! ()))
    ((for! ((binds ...)) body)
      (for! ((binds ...) #t) body))
    ((for! ((binds ...) conditional))
      (let* (binds ...)
        (while! (conditional) body)))
    ((for! ((binds ...) conditional (validates ...)) body)
      (let* (binds ...)
        (letrec ((_validates (lambda () validates ...)))
          (while! (conditional)
            (lambda (continue break)
              (body (lambda () (_validates) (continue))
                    break)
              (_validates))))))))


; 测试 for! : 输出0~20内10以内的奇数
(for! (((m 0)) (< m 20) ((set! m (+ m 1))))
  (lambda (continue break)
    (if (zero? (modulo m 2))
      (continue))
    (if (>= m 10)
      (break))
    (display m)
    (newline)))


在贴这段代码时,竟然没有scheme格式的。
为了方便,就做成宏。上面的代码可直接使用,没有任何递归带来的开销。for其实完全是在while的基础上模拟的,欢迎大家来找茬!!

贴运行结果:
Screenshot_2019-12-05-01-58-00-55.png


免费评分

参与人数 2吾爱币 +4 热心值 +2 收起 理由
元元 + 1 + 1 我很赞同!
wushaominkk + 3 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 17:41

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表