作者sbrhsieh (偶尔想摆烂一下)
看板PLT
标题Re: [问题] letrec 为何可以成立? (In scheme, ma …
时间Wed Jun 2 01:29:44 2010
※ 引述《SansWord (是你)》之铭言:
: 最近在做作业~正在学着用scheme 实作letrec
: 现在作业已经due, 也已经写出来了~可是感觉自己还是有点一知半解...
: 来这里问问有没有更general 的 "letrec 如何可能" 的学理原则
: 先解释名词(我想大家都知道了~不过还是先说明)
: 以下语法用偷懒的scheme style psudeo code.(特色是括号还是超级多)
: letrec:
: (letrec
: (
: (foo (\x. (if (= x 1)
: 1
: (* x ( foo(- x 1)
: )
: )
: )
: )
: (foo 3)
: )
: letrec 是专门let里面有recursive call 的专门function
: 我的作法是:
: 先让environment (称为ev1) 里面有一个 (foo 'dontcare) pair
: 然後再用set-cdr! 的方式把 (foo 'dontcare) 後面set
: 成 lambda function eval 後的结果
: 可是在我的实作中~ eval lambad function 的时候,会包入当下的environment
: 此时包入的environment (称为ev2) 内也必须要有一个 (foo '....) pair,
: 否则该lambda function内的foo 会找不到东西
: =======以下开始 loop==========
: 所以 ev2 的 (foo '...) pair 後面又是一个lambda, 里面又要包
: environment(称作ev3) 里面也要有 (foo '...) ...又得是一个lambda...
: ... ... (inductive phrase)
: 这个lambda 里面又要有env n....里面又要包lambda, 里面又要有env n+1
: ==============================
: 所以要怎麽处理呢?
: 我最後是recursively 的让env 里面包的就是env. (自己里面包自己)
: 可是总觉得怪怪的....
: =============================
: 更麻烦的问题~那mutual recursion呢?又要怎实作?
: 会不会有晦暗的角落出错我却没注意到?
我有玩过 Scheme 但不算很熟,从你的说明我无法清楚地了解你的做法(当然
也不清楚你遇到的困难是甚麽)。
如果是我会这麽做(使用 syntax 扩展):
(define-syntax myletrec
(syntax-rules ()
((_ ((name value) ...) expr ...)
(let ((name #f) ...)
(set! name value) ...
(begin expr ...)))))
这作法大致上如同 r5rs 里关於 letrec 的描述。
(letrec <bindings> <body>)
Syntax: <bindings> should have the form
(( variable init ) . . . )
先利用 let construct 替每一个 variable 配置空间,然後再塞值到对应的
空间(binding)里,最後在这些 variable bindings 都存在的 context 内
evaluate <body> 内的所有的 expression。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.173.130.72