Macro的写法 `( , ,@ )


 

另外的注意点:

  1.  同名符号的 “变量捕捉” (varible capture) 

     解决方式:  with-gensym 生成几个unique name-s, 然后将它们各自绑定上参数值

 2. 多次求值 、 求值顺序

   ①多次求值: 比如参数传进来的某个 s-expression的计算是带有副作用的(求值次数不能多求), 你必须控制它只会被计算一次,  而不能在 `( ) 内出现多次 ,s

   解决方式:   only-one  

   就如上图一样, 把 ,stop先求值一次 并把结果赋给 gstop ,则不会出现多个 ,stop了

   ②求值顺序 :  比如上图中 start , stop 都是有副作用的计算,那就必须保证 start 在 stop 之前求值,不能改变求值顺序。   

3. modify-macro (修改宏)

   比如库中的 incf 这个宏,类似的 第一个参数为目标变量place的 修改, 都得靠 define-modify-macro 来实现。(特征:place是第一个参数、且返回值是修改后的对象)

 


 

posted on 2018-09-18 22:52  王家恒  阅读(555)  评论(0编辑  收藏  举报

导航