• The little schemer 学习


    参考文章:

    The Little Schemer 阅读笔记-CSDN博客

    前言

    原子是Scheme的基本元素之一。首先定义了过程atom?,用来判断一个S-表达式是不是原子:

    1. (define atom?
    2. (lambda (x)
    3. (and (not (pair? x)) (not (null? x)))))

    这个“pair”实际上就是list.

    但是需要注意,pair和list是两码事。pair在表达上是诸如'(1 . 2)这样用点分隔开的二元组

    第一章

    S-表达式包括①原子atom;②列表list。

    car取非空列表的第一个S-表达式

    cdr取非空列表list的 除(car list)的剩余所有元素 组成的 列表

    cons将某个S-表达式 添加到 某个列表的开头。

    null? 判断S-表达式是否是空列表。

    eq? 判断两个S-表达式是否相同。

    list的默认解析方式是:以car为函数名,以cdr为参数列表对函数进行调用,整个list的evaluated的结果就是函数的返回值。某些“关键字”作为car时,求值规则会发生变化,这个要具体问题具体分析。这个问题可以参考SICP的练习1.6。(“关键字”很少,并不复杂)

    quote 或者 ' 用来抑制对S-表达式的求值。由于S-表达式是递归结构,因此被抑制求值的S-表达式的各个子表达式都不会被求值。被quote的部分是作为“数据”的代码。quoted原子的结果是它本身,类似于C系语言的enum;quoted数字原子的结果仍然是数字;quoted list的结果就是不求值的列表,类似于链表这样的结构。

    第二章  处理,处理,反复处理

    本章从lat?函数的实现出发,探讨递归处理lat的基本思想和方法。

    定义过程lat?,用来判断表的子表达式是否都是原子,即判断list是不是lat(list of atoms)。第五章之前,涉及到的列表基本上都是lat。

    1. (define lat?
    2. (lambda (list)
    3. (cond ((null? list) #t)
    4. ((atom? (car list)) (lat? (cdr list)))
    5. (else #f)))`

    特殊形式cond是惰性的,也就是说,如果某个子句的谓词为真,则不再检查下面的子句。

    定义过程member?,用来判断某个原子是否为某个lat的成员。这个函数很重要,尤其是对于实现集合的第七章。

    1. (define member?
    2. (lambda (x lat)
    3. (cond ((null? lat) #f) ;找遍列表也没找到
    4. ((eq? x (car lat)) #t)
    5. (else (member? x (cdr lat))))))

    第三章

    直接看参考文章吧,总结的很到位了

    第九章 lambda 终结者

  • 相关阅读:
    Linux服务器占用处理手记
    中国帘子布市场投资前景分析及供需格局研究预测报告
    单线程模型想象不到的高并发能力、多路复用是效率杠杆
    Java多线程 用join方法控制线程按顺序执行。
    Ubuntu18中NVIDIA,cuda,cudnn,pytorch安装
    jdk 管理工具比对 jEnv jabba SDKMAN
    在 Elasticsearch 中使用 PyTorch 进行现代自然语言处理的介绍
    TS 函数 配合接口
    基于Label studio实现UIE信息抽取智能标注方案,提升标注效率!
    小程序中如何(批量)删除会员卡
  • 原文地址:https://blog.csdn.net/zaizai1007/article/details/133465815