作者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