V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ZoomQuiet
V2EX  ›  Lisp

[101]如何在迭代展开过程中输出中间数据?

  •  
  •   ZoomQuiet · 2018-01-05 23:51:52 +08:00 · 4816 次点击
    这是一个创建于 2491 天前的主题,其中的信息可能已经有所发展或是发生改变。

    俺是 Lisp 初学者, 先从 Scheme 建立函式语言的感觉,

    刚刚开始刷: The Little Schemer - 4th Edition (豆瓣)

    环境:

    ; member? _v1 尝试将探索过程打印出来
    (define iter4cond ())  ; 声明寄存容器
    
    (define member1?    ; 声明函式
      (lambda (a lat)  ; 绑定匿名函式, 接收参数 a lat
        (set! iter4cond (cons iter4cond lat)) ; ???
        (cond          ; 系列 if 判定
          ((null? lat) #f) ; 法则->先检验 目标原子是否为空? 是, 直接退出并返回 #f
          (else (or        ; 否则 or 一下两种对比
                 ;(define lat1st (car lat))
                 ;(display lat1st)
                    (eq? (car lat) a)      ; 第一个成员是否和 对比原子相同?
                    ;(eq? lat1st a)      ; 第一个成员是否和 对比原子相同?
                    (member1? a (cdr lat))  ; 对其它成员使用 member 进行检验
                    )
                )
         )
        )
      )
    
    
    • member1? 是一个基础的自定函式, 来判定指定原子是否存在目标列表中
    • 俺想将迭代过程打印出来,
    • 结果发现 cond 多条件判定语句中,
    • 无论 null? eq? 或是迭代的 member1?
    • 本质上都是退出行为, 根本无法同时打印出对比过程来;

    所以, 不得不用过程语言的方法, 通过全局列表收集过程中的数据,

    再另外打印:

    比如:

    (define lat `(fried eggs and scrambled egg))
    (define b 'and)
    (member1? b lat)
    => #t
    

    iter4cond
    

    才能输出:

    (((() fried eggs and scrambled egg) eggs and scrambled egg) and scrambled egg)
    

    可能还得另外构建合理的可视化输出函式,

    所以, 俺的问题是, 这种场景中, 是否可以在计算过程中, 安全输出中间数据, 而又不干挠正常的迭代展开?

    1 条回复    2018-03-15 16:11:39 +08:00
    ZoomQuiet
        1
    ZoomQuiet  
    OP
       2018-03-15 16:11:39 +08:00
    ~> [\[101\]如何在迭代展开过程中输出中间数据? \- Google 网上论坛]( https://groups.google.com/forum/#!topic/lisp-cn/Ny4nBE0igWw)

    在 lisp-cn 列表中问出来了:

    尝试用命令行跑一下

    ; member? _v1 尝试将探索过程打印出来

    (define member1? ; 声明函式
    (lambda (a lat) ; 绑定匿名函式, 接收参数 a lat
    (format #t "~a->~a~%" a lat)
    (cond ; 系列 if 判定
    ((null? lat) #f) ; 法则->先检验 目标原子是否为空? 是, 直接退出并返回 #f
    (else (or ; 否则 or 一下两种对比
    ;(define lat1st (car lat))
    ;(display lat1st)
    (eq? (car lat) a) ; 第一个成员是否和 对比原子相同?
    ;(eq? lat1st a) ; 第一个成员是否和 对比原子相同?
    (member1? a (cdr lat)) ; 对其它成员使用 member1 (<--当然的要对应变化否则..) 进行检验
    )
    )
    )
    )
    )
    (define b 'egg)
    (define lat `(fried eggs and scrambled egg))
    (member1? b lat)



    > ༄ chez member1.scm

    Chez Scheme Version 9.4
    Copyright 1984-2016 Cisco Systems, Inc.

    egg->(fried eggs and scrambled egg)
    egg->(eggs and scrambled egg)
    egg->(and scrambled egg)
    egg->(scrambled egg)
    egg->(egg)



    主要原因是, Calysto/calysto_scheme: A Scheme kernel for Jupyter that can use
    Python libraries https://github.com/Calysto/calysto_scheme

    这一 Jupyter 插件, 是用 Py 实现的一个 Scheme 模拟器,
    本身不是完备的 Scheme 解析器,
    缺少很多必要的函式支持,

    所以, 切换到 CLI 环境中, 使用确实的 Scheme 运行环境运行,
    就能获得预期结果了...



    囧 rz...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3606 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 00:11 · PVG 08:11 · LAX 17:11 · JFK 20:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.