Lambda形参表的三种形式
(lambda (x …) (func x …))
(define f
(lambda (x y z)
(x z y)))
等价于
(define (f x y z) (x z y))
;; (f - 1 2) => (- 2 1) => 1
(lambda (x … . y) (func x … . y))
(define g
(lambda (x . y)
(list x y)))
等价于
(define (g x . y)
(list x y))
;; (g 1 2 3) => (list 1 (2 3)) => '(1 (2 3))
(lambda x (func x))
这个有点神奇
类似(lambda (. y) (func y)), 即把所有参数作为list传入x
(define h
(lambda x
(cdr x)))
等价于
(define (h . x) (cdr x))
;; (h 1 2 3) => (cdr (list 1 2 3)) => '(2 3)
一些语法糖和造轮子
也没什么特别的
let语法糖
(let ([x1 val1] [x2 val2] ...) (func x1 x2 ...))
;; 等价于
((lambda (x1 x2 ...) (func x1 x2 ...)) val1 val2 ...)
例如
((lambda (x y)
(+ x y)) 1 2)
;; 等价于
(let ([x 1] [y 2])
(+ x y))
atom?
(define (atom? x) (not (pair? x)))
list
(define list (lambda x x))
length
(define length
(lambda (ls)
(if (null? ls)
0
(+ (length (cdr ls)) 1))))
memv
(define memv
(lambda (x ls)
(cond
[(null? ls) #f]
[(eqv? (car ls) x) ls]
[else (memv x (cdr ls))])))
;; (memv 'a '(a b b d)) => '(a b b d)
;; (memv 'b '(a b b d)) => '(b b d)
;; (memv 'c '(a b b d)) => #f
remv
(define remv
(lambda (x ls)
(cond
[(null? ls) '()]
[(eqv? (car ls) x) (remv x (cdr ls))]
[else (cons (car ls) (remv x (cdr ls)))])))
;; (remv'a '(a b b d)) => '(b b d)
;; (remv'b '(a b b d)) => '(a d)
map(非完整)
(define half-map
(lambda (p ls)
(if (null? ls)
'()
(cons (p (car ls))
(map p (cdr ls))))))
; Here Just restricted version