CS61A_lab12_macro

发布时间 2023-04-21 10:16:18作者: 哎呦_不想学习哟~

 

(define-macro (def func args body)
  `(define ,(cons func args) ,body))

分析:

定义一个万能的函数定义,那就要模拟函数定义的样子。ok,函数定义是什么样子的呢? eg:

(define (filter-lst fn lst)
(if (null? lst) nil
    (if (fn (car lst))
        (cons (car lst) (filter-lst fn (cdr lst)))
        (filter-lst fn (cdr lst)))))

可以观察到,函数名以及参数是在一个括号里面的,那么我们也就模拟在一个参数里面呗

【ps:scheme中调用函数时,参数和函数名也是在一个括号里面,即参数不再需要参数,这里就与c,c++,python产生了区别。

eg:(area-circle 2) 而在python [area-circle(2)]

【 ,(cons func args) 】

这个样子就将函数名和参数连接起来了形成了一个列表。那么前面的逗号有什么作用呢?

逗号就是插值,注意到在【  `(define ,(cons func args) ,body)) 】中最前面有【 `】 符号,就是让后面的表达式变成字符串的形式,而我们要计算啊,所以在前面加一个逗号就会计算其中的式子。

例如:

scm> '(1 x 3)
? (1 x 3)
-- OK! --

scm> (define x 2)
? x
-- OK! --

scm> `(1 x 3)
? (1 x 3)
-- OK! --

scm> `(1 ,x 3)
? (1 2 3)
-- OK! --

scm> '(1 ,x 3)
? (1 ,x 3)
-- OK! --

scm> `(,1 x 3)
? (1 x 3)
-- OK! --

scm> `,(+ 1 x 3)
? 6
-- OK! --

 

 

再例如

 

(define-macro (list-of map-expr for var in lst if filter-expr)
`(map (lambda (,var) ,map-expr) (filter (lmabda (,var) ,filter-expr),lst))
)