Scheme中let*的本质

let*是Scheme语言中一种常用的赋值方式,今天想到了一种使用lambda演算解释let*的方式。

首先我们知道let*的语法定义如下:

(let* ( [ var val ] 

          ...)

  body

  ... )

其语义是在环境中求值val,与var绑定后,加入环境,构成新环境,然后在新环境中求值val2...,最后在得到的环境中,求值body

用scheme来解释是这样的:

(define (eval-let* argslist

   body

   env)

   (let ((new-env (extend-env* argslist env)))

    (eval body new-env)))

(define (extend-env* argslist env)

  (cond ((null? argslist)

 env)

(else (let ((var (first (first argslist)))

    (val (second (first arglist))))

(extend-env* (cdr arglist)

     (extend-env var

 (eval-expr val env)

 env))))))

最后我想到其实用lambda演算解释起来更加的简单:

((lambda (var1)

   ((lambda (var2)

      (...

       (lambda ()

       body1

       ...)))

    val2))

 val1)

现在想的是用lambda去解释let反而感觉是一件比较麻烦的事了。

时间: 2024-09-30 15:51:47

Scheme中let*的本质的相关文章

Scheme中let的本质

我原先想let的语义不好用lambda解释,主要是我记得有curring这么一回事 (lambda (a) (lambda (b) a)) == (lambda (a b) a) 但是今天仔细一想好像不是这么回事, (lambda (a) (lambda (b) a)) == (lambda (a b) a) 先eval foo,给a赋值,然后eval bar,给b赋值 而在((lambda (a b) a) (foo bar))中 则是先eval foo,bar,然后对a,b赋值, 式子cur

c语言中函数调用的本质从汇编角度分析

今天下午写篇博客吧,分析分析c语言中函数调用的本质,首先我们知道c语言中函数的本质就是一段代码,但是给这段代码起了一个名字,这个名字就是他的的这段代码的开始地址 这也是函数名的本质,其实也就是汇编中的标号.下面我们会接触到一些东西 比如 eip 就是我们常常说的程序计数器,还有ebp和esp (这里是俩个指针,记得我们以前学8086也就一个sp堆栈指针)分别为EBP是指向栈底的指针,在过程调用中不变,又称为帧指针.ESP指向栈顶,程序执行时移动,ESP减小分配空间,ESP增大释放空间,ESP又称

沉淀再出发:java中注解的本质和使用

沉淀再出发:java中注解的本质和使用 一.前言 以前XML是各大框架的青睐者,它以松耦合的方式完成了框架中几乎所有的配置,但是随着项目越来越庞大,XML的内容也越来越复杂,维护成本变高.于是就有人提出来一种标记式高耦合的配置方式——注解.方法上可以进行注解,类上也可以注解,字段属性上也可以注解,反正几乎需要配置的地方都可以进行注解.关于注解和XML两种不同的配置模式,争论了好多年了,各有各的优劣,注解可以提供更大的便捷性,易于维护修改,但耦合度高,而XML相对于注解则是相反的.追求低耦合就要抛

Scheme中lambda表达式与函数指针小例

SICP/Chapter2/Exercise-2.4 Lambda表达式语法 (lambda kw-formals body) 题目描述 用过程性表示方式重写序对的cons.car.cdr Scheme代码 (define (cons-24 x y) (lambda (m) (m x y))) (define (car-24 z) (z (lambda (p q) p))) 这段代码只有4行,但是逻辑关系并不好理解. 原因在于函数式语言的自顶向下实现方式不符合一般的逻辑习惯. lambda以类似

[转载] 信息检索中索引的本质

原文: http://my.oschina.net/zjzhai/blog/464446 比较好的一篇科普文章, 介绍倒排索引的. 如有不正确的或者理解不到位的地方,欢迎斧正. 信息检索问题 首先我们来看问题域.每一种技术产物都是为解决某类问题.不从问题域出发,我们就很难理解为什么它是这样的.就像那些没学过“程序语言”设计的人,只能被程序语言牵着走. 信息检索背后的模型其实很简单:就是从大量的信息中找出需要的信息.这类问题有个更专业的名字:信息检索(Information Retrieval).

C++中引用的本质分析

引用的意义 引用作为变量别名而存在,因此在一些场合可以代替指针 引用相对于指针来说具有更好的可读性和实用性 swap函数的实现对比: void swap(int* a, int* b) { int t = *a; *a = *b; *b = t; } void swap_yinyong(int& a,int& b) { int t = a; a = b; b = t; } int main() { int a = 1; int b = 2; printf("a = %d,b =

JS中函数的本质,定义、调用,以及函数的参数和返回值

要用面向对象的方式去编程,而不要用面向过程的方式去编程 对象是各种类型的数据的集合,可以是数字.字符串.数组.函数.对象…… 对象中的内容以键值对方式进行存储 对象要赋值给一个变量 var cat={ "name":"喵1", "age":4, "family":["喵爸","喵妈"], "speak":function(){ console.log("喵喵

15、Java中this的本质 和 static的本质

this 在说this之前先说一下,对象创建的过程: 1.分配对象空间,并将对象成员变量初始化. 2.执行属性值的显式初始化. 3.执行构造方法. 4.返回相关的地址给相关的对象. ??this的本质就是"创建好的对象的地址",由于在构造方法调用之前,对象已经创建好了,因此在构造方法中也可以使和this来代表当前对象. public class User{ int a,b,c; //声明三个成员变量 //this里面自的是当前对象的地直,所以可以代表当前对象 public User(i

scheme 中的宏使用

#lang scheme ( define-syntax my-when ( syntax-rules () [ ( _ pred body ... ) ( if pred ( begin body ... ) ( void ) ) ] ) ) ( my-when ( = 2 1 ) ( display 1 ) ( display 2 ) ) ( define-syntax my-let ( syntax-rules () [ ( my-let ( [ var exp ] ... ) body