• 游客,您好! Include社区于2021.5.26迁移至新版社区,用户数据丢失,欢迎注册! 补偿政策

教程 SCHEME教学 第二篇 CONS与LIST

Include社区

Include社区信息发布
管理成员
超级版主
2021/05/26
9
2
101
China

前言​

Hi,这里是RMOlive,本系列教程将系统的讲解Scheme这一门Lisp方言。
但是在这里我们并不会介绍Scheme的背景,读者只需要知道这是一个遵从极简主义哲学的lisp分支语言就足够了。
本文假设读者已有一定的编程基础,基础概念将不再重复。

高阶函数​

高阶函数是一种可以接受数个函数输入,或返回一个函数的函数,scheme支持高阶函数,例如:
代码:
(define (g x)
    (lambda (y)
        (+ x y)))

此时(g 3)返回一个函数,这个函数接受一个参数,例如((g 3) 4)=3+4=7
例如:
代码:
(define (funcall f x)
    (f x))

而对于
代码:
(funcall
    (lambda (x)
        (+ x 3)) 4)

来说,将返回3+4=7

CONS​

scheme中最基本的结构就是元组,也就是序对,它能够存储2个值(或表达式,取决于应用序和正则序)。
代码:
(define a
    (cons 1 2))

而car与cdr是用于取出cons中的值。
代码:
(car a) = 1
(cdr a) = 2

LIST​

scheme的list一般是cons组成的,例如('()表示NIL)
代码:
(list 1 2 3) = (cons 1 (cons 2 (cons 3 '())))

聪明的人一眼看出这是链表了(

List: map​

map这东西就是将list所有的东西作用于一个函数上,用得到的值构成一个list。

比如:
代码:
(define l (list 1 2 3 4 5))
(map (lambda (x) (* x 2)) l) = (2 4 6 8 10)

实现:
代码:
(define (map f l)
  (if (eq? l '())
     '()
     (cons (f (car l)) (map f (cdr l)))))

在这里面我们用到了两个新东西,eq?if(eq? a b)就是判断a=b是否成立,而(if a b c)则是a为真执行b,否则c.

而其他语言所要用的return在scheme里和kotlin一样,直接写就可以return。

List: filter

filter则是一个选择器,将list中满足条件的元素筛选出来。

例如:
代码:
(define l (list 1 2 3 1 2 2))
(filter (lambda (x) (eq? x 2)) l) = (2 2 2)

实现:
代码:
(define (filter f l)
  (if (eq? l '())
     '()
     (if (f (car l))
        (cons (car l) (filter f (cdr l)))
        (filter f (cdr l)))))



author@RMOlives
 
最后编辑:

在线会员

现在没有会员在线。