(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)) )
标签:scm,OK,--,macro,CS61A,filter,lst,lab12,define From: https://www.cnblogs.com/xuenima/p/17337547.html