文档章节

scheme macro vs common lisp macro

firebroo
 firebroo
发布于 2014/08/18 15:22
字数 252
阅读 204
收藏 0

common lisp的let宏定义如下

(defmacro our-left (binds &body body)
  `((lambda ,(mapcar #'(lambda (x)
			 (if (consp x) (car x) x))
		     binds)
      ,@body)
      ,@(mapcar #'(lambda (x)
		    (if (consp x) (cadr x) nil))
		binds)))
		
;;;;;;;;;;;;;;;;;;;;;test;;;;
(our-left ((x 1) (y 2))
    (+ x y))
展开之后变成
=>((lambda (x y) (+ x y) 1 2)
这里我们不难看出其实let不过是lambda的语法糖:)


scheme的let宏定义如下

(defien-syntax let
  (syntax-rules ()
    ((_ ((x v) ...) e1 e2 ...)
     ((lambda (x ...) e1 e2 ...) v ...))))
scheme的比上面的那个优雅,直观吧,我们能不费力气的看出这个let内部是如何工作的。

 scheme的let*宏如下

(define-syntax my-let*
  (syntax-rules ()
    ((_ ((p v)) b ...)
     (let ((p v)) b ...))
    ((_ ((p1 v1) (p2 v2) ...) b ...)
     (let ((p1 v1))
       (my-let* ((p2 v2) ...)
		b ...)))))
其实scheme的宏是一种模式匹配,所以事先一定要把所有的情况的考虑清楚。

那一堆的使用@来解构真的是没有必要的,看看shceme是如何处理的,根本没有必要先包裹然后解构啊。

© 著作权归作者所有

firebroo
粉丝 18
博文 28
码字总数 16581
作品 0
杭州
程序员
私信 提问
加载中

评论(2)

firebroo
firebroo 博主

引用来自“BlinkD”的评论

scheme的完全看不懂,commonlisp版的符合程序编写者的思路,我反而觉得更容易理解。
好吧,可能确认每个人的感觉是不一样的,我感觉是sheme的比较清晰!--
兰穆达
兰穆达
scheme的完全看不懂,commonlisp版的符合程序编写者的思路,我反而觉得更容易理解。
Lisp语言的分支 - Racket

Racket源自著名的专家型语言PLT Scheme,同时又是Lisp语言的一个分支。它适用于从脚本Script到应用程序开发的任务执行工具,包括图形用户界面,Web服务器等。支持编译器的虚拟机,创建独立的...

匿名
2012/05/28
10.4K
2
Lisp 通过宏传递引用

我一直遗憾 Lisp 没有指针,对于动态作用域的 newLISP 可以用传递符号来传递一个不求值的引用。但对于 Scheme 这种静态函数作用域的语言,如何传递引用呢? 用宏!宏不对参数进行求值,只是传...

沙枣
2016/09/03
28
0
Common Lisp学习资源整理

Lisp Hackers: Interviews with 100x More Productive Programmers Posted on June 26th, 2013 Lisp Hackers: Interviews with 100x More Productive Programmers, by Vsevolod Dyomkin, is ......

戎码半生
2017/01/24
0
0
自定义Xcode模板

Introduction I gave a presentation a few weeks ago at the local CocoaHeads MN meeting on extending Xcode. It was pretty well received and at some point I promised to deliver thi......

长平狐
2012/08/13
663
0
深入浅出 Babel 下篇:既生 Plugin 何生 Macros

接着上篇文章: 《深入浅出 Babel 上篇:架构和原理 + 实战 🔥》 这篇文章干货不少于上篇文章,这篇我们深入讨论一下宏这个玩意 —— 我想我们对宏并不默认,因为很多程序员第一门语言就是 ...

_sx_
10/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

一起来学Java8(三)——方法引用

在一起来学Java8(一)——函数式编程中有一个简单的函数式编程的例子: import java.util.function.Consumer;class Person { public static void sayHello(String name) { S...

猿敲月下码
14分钟前
8
0
读书笔记:深入理解ES6(十一)

第十一章 Promise与异步编程   Promise可以实现其他语言中类似Future和Deferred一样的功能,是另一种异步编程的选择,它既可以像事件和回调函数一样指定稍后执行的代码,也可以明确指示代码...

张森ZS
38分钟前
13
0
面试官,Java8 JVM内存结构变了,永久代到元空间

在文章《JVM之内存结构详解》中我们描述了Java7以前的JVM内存结构,但在Java8和以后版本中JVM的内存结构慢慢发生了变化。作为面试官如果你还不知道,那么面试过程中是不是有些露怯?作为面试...

程序新视界
45分钟前
27
0
Elasticsearch 实战(一) - 简介

官腔 Elasticsearch,分布式,高性能,高可用,可伸缩的搜索和分析系统 基本等于没说,咱们慢慢看 1 概述 百度:我们比如说想找寻任何的信息的时候,就会上百度去搜索一下,比如说找一部自己喜...

JavaEdge
50分钟前
19
0
【jQuery基础学习】11 jQuery性能简单优化

本文转载于:专业的前端网站➦【jQuery基础学习】11 jQuery性能简单优化 关于性能优化 合适的选择器 $("#id")会直接调用底层方法,所以这是最快的。如果这样不能直接找到,也可以用find方法继...

前端老手
59分钟前
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部