• 变动数据模拟cons


    source code

    #lang planet neil/sicp
    (define (mycons x y)
      (define (set-first aim-data) (set! x aim-data))
      (define (set-second aim-data)(set! y aim-data))
      (define (dispatch m)
         (cond ((eq? m 'car) x)
                ((eq? m 'cdr) y)
                ((eq? m 'set-car!) set-first)
                ((eq? m 'set-cdr!) set-second)
                (else (error "wrong paramter of cons!"))))
        dispatch
         
       )
    
    (define (car z) (z 'car))
    (define (cdr z) (z 'cdr))
    (define (set-car! z aim-value) ((z 'set-car!) aim-value))
    (define (set-cdr! z aim-value)((z 'set-cdr!) aim-value))
    
    (define pair (mycons 'a 'b))
    (car pair)
    (cdr pair)
    (set-car! pair 'gao)
    (car pair)
    (set-cdr! pair 'duan)
    (cdr pair)
    

    分析mycons

    • 首先看mycons函数,它是一个典型的数据导向的分派函数:具体来说,它返回的是一个叫做dispatch的函数,而这个函数可以接受一些参数比如 'car等来调用新的函数实现功能;
    • 这也是用过程来实现数据结构的一个实例,scheme 刷三观的地方很多,关于过程是最为集中的一块,比如函数表达数据,函数表达这里的数据结构等等;
      cons的本质就是构建一个pair,不管什么方式把他们结合在一起都可以,只要car z的时候可以返回first number,cdr z的时候返回second number就可以了
    • 内部的car 和 cdr是查询过程,返回值就可以了;而set-car!、set-cdr!是要对数据改变的操作,并且还需要额外的参数,所以这里多了一层分派;

    操作函数

    • 有了mycons之后,相当于用户使用cons x y 之后,他有了一个dispatch函数,这显然还不够,更重要的是提供接口,查询和改变的接口:

    • 这里的接口有两类,首先是car cdr函数,其次是set-car!、set-cdr!函数;

    • 我们实际使用的时候无需关心实现的细节,还是十分便捷;

    其它

    • sicp 的一个小例子,涉及了第二章的数据表示,以及第三章的赋值和改变,也包括第二章抽象的一些手法。
  • 相关阅读:
    伪元素:placeholder-shown&&:focus-within
    伪元素:target
    伪元素:focus-within
    MpVue解析
    ESLint在vue中的使用
    vue动态 设置类名
    Java 文件流操作.
    SpringMVC 与 REST.
    基于Nginx和Zookeeper实现Dubbo的分布式服务
    基于Spring的RPC通讯模型.
  • 原文地址:https://www.cnblogs.com/gaoduan/p/4059545.html
Copyright © 2020-2023  润新知