Lambda表达式

2016-07-28
1分钟阅读时长

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
上一页 CPS变换
下一页 Macro