7.2.4 Auxiliary functions

lookup:UIdeL

lookup=λρI.ρI

extends:UIdeLU

extends=

λρIα.

#I=0ρ,

extends(ρ[(α1)/(I1)])(I1)(α1)

wrong:XC[implementation-dependent]

send:EKC

send=λϵκ.κϵ

single:(EC)K

single=

λψϵ.

#ϵ=1ψ(ϵ1),

wrongwrong number of return values

new:S(L+{error})[implementation-dependent]

hold:LKC

hold=λακσ.send(σα1)κσ

assign:LECC

assign=λαϵθσ.θ(updateαϵσ)

update:LESS

update=λαϵσ.σ[ϵ,true/α]

tievals:(LC)EC

tievals=

λψϵσ.

#ϵ=0ψσ,

newσLtievals

(λα.ψ(newσ|L§α))

(ϵ1)

(update(newσ|L)(ϵ1)σ),

wrongout of memoryσ

tievalsrest:(LC)ENC

tievalsrest=

λψϵν.list

(dropfirstϵν)

(single(λϵ.tievalsψ((takefirstϵν)§ϵ)))

dropfirst=λln.n=0l,dropfirst(l1)(n1)

takefirst=λln.n=0,l1§(takefirst(l1)(n1))

truish:ET

truish=λϵ.ϵ=falsefalse,true

permute:ExpExp[implementation-dependent]

unpermute:EE[inverse ofpermute]

applicate:EEPKC

applicate=

λϵϵωκ.ϵF(ϵ|F2)ϵωκ,wrongbad procedure

onearg:(EPKC)(EPKC)

onearg=

λζϵωκ.

#ϵ=1ζ(ϵ1)ωκ,

wrongwrong number of arguments

twoarg:(EEPKC)(EPKC)

twoarg=

λζϵωκ.

#ϵ=2ζ(ϵ1)(ϵ2)ωκ,

wrongwrong number of arguments

threearg:(EEEPKC)(EPKC)

threearg=

λζϵωκ.

#ϵ=3ζ(ϵ1)(ϵ2)(ϵ3)ωκ,

wrongwrong number of arguments

list:EPKC

list=

λϵωκ.

#ϵ=0sendnullκ,

list(ϵ1)(single(λϵ.consϵ1,ϵκ))

cons:EPKC

cons=

twoarg(λϵ1ϵ2κωσ.

newσL

(λσ.newσL

send

(

newσ|L,newσ|L,true

inE

κ

(update(newσ|L)ϵ2σ),

wrongout of memoryσ)

(update(newσ|L)ϵ1σ),

wrongout of memoryσ)

less:EPKC

less=

twoarg(λϵ1ϵ2ωκ.

(ϵ1Rϵ2R)

send(ϵ1|R<ϵ2|Rtrue,false)κ,

wrongnon-numeric argument to<)

add:EPKC

add=

twoarg(λϵ1ϵ2ωκ.

(ϵ1Rϵ2R)

send((ϵ1|R+ϵ2|R)inE)κ,

wrongnon-numeric argument to+)

car:EPKC

car=

onearg(λϵωκ.

ϵEpcar-internalϵκ,

wrongnon-pair argument tocar)

car-internal:EKC

car-internal=λϵωκ.hold(ϵ|Ep1)κ

cdr:EPKC[similar tocar]

cdr-internal:EKC[similar tocar-internal]

setcar:EPKC

setcar=

twoarg(λϵ1ϵ2ωκ.

ϵ1Ep

(ϵ1|Ep3)assign

(ϵ1|Ep1)

ϵ2

(sendunspecifiedκ),

wrongimmutable argument toset-car!,

wrongnon-pair argument toset-car!)

eqv:EPKC

eqv=

twoarg(λϵ1ϵ2ωκ.

(ϵ1Mϵ2M)

send(ϵ1|M=ϵ2|Mtrue,false)κ,

(ϵ1Qϵ2Q)

send(ϵ1|Q=ϵ2|Qtrue,false)κ,

(ϵ1Hϵ2H)

send(ϵ1|H=ϵ2|Htrue,false)κ,

(ϵ1Rϵ2R)

send(ϵ1|R=ϵ2|Rtrue,false)κ,

(ϵ1Epϵ2Ep)

send

(

(λp1p2.(

(p11)=(p21)

(p12)=(p22))true,

false)

(ϵ1|Ep)

(ϵ2|Ep))

κ,

(ϵ1Evϵ2Ev),

(ϵ1Esϵ2Es),

(ϵ1Fϵ2F)

send

((ϵ1|F1)=(ϵ2|F1)true,false)

κ,

sendfalseκ)

apply:EPKC

apply=

twoarg(λϵ1ϵ2ωκ.

ϵ1Fvalueslistϵ2(λϵ.applicateϵ1ϵωκ),

wrongbad procedure argument toapply)

valueslist:EKC

valueslist=

λϵκ.

ϵEp

cdr-internal

ϵ

(λϵ.

valueslist

ϵ

(λϵ.

car-internal

ϵ

(single(λϵ.κ(ϵ§ϵ))))),

ϵ=nullκ,

wrongnon-list argument tovalues-list

cwcc

:EPKC

[call-with-current-continuation]

cwcc=

onearg(λϵωκ.

ϵF

(λσ.

newσL

applicate

ϵ

newσ|L,

λϵωκ.travelωω(κϵ)

inE

ω

κ

(update

(newσ|L)

unspecified

σ),

wrongout of memoryσ),

wrongbad procedure argument)

travel:PPCC

travel=

λω1ω2.travelpath(

(pathupω1(commonancestω1ω2))§

(pathdown(commonancestω1ω2)ω2))

pointdepth:PN

pointdepth=

λω.ω=root0,1+(pointdepth(ω|(F×F×P)3))

ancestors:P𝒫P

ancestors=

λω.ω=root{ω},{ω}(ancestors(ω|(F×F×P)3))

commonancest:PPP

commonancest=

λω1ω2.

the only element of

{ω

ω(ancestorsω1)(ancestorsω2),

pointdepthωpointdepthω

ω(ancestorsω1)(ancestorsω2)}

pathup:PP(P×F)

pathup=

λω1ω2.

ω1=ω2,

(ω1,ω1|(F×F×P)2)§

(pathup(ω1|(F×F×P)3)ω2)

pathdown:PP(P×F)

pathdown=

λω1ω2.

ω1=ω2,

(pathdownω1(ω2|(F×F×P)3))§

(ω2,ω2|(F×F×P)1)

travelpath:(P×F)CC

travelpath=

λπθ.

#π=0θ,

((π1)2)

((π1)1)

(λϵ.travelpath(π1)θ)

dynamicwind:EPKC

dynamicwind=

threearg

(λϵ1ϵ2ϵ3ωκ.(ϵ1Fϵ2Fϵ3F)

applicate

ϵ1ω(λζ.

applicate

ϵ2((ϵ1|F,ϵ3|F,ω)inP)

(λϵ.applicateϵ3ω(λζ.κϵ))),

wrongbad procedure argument)

values:EPKC

values=λϵωκ.κϵ

cwv:EPKC[call-with-values]

cwv=

twoarg(λϵ1ϵ2ωκ.applicateϵ1ω(λϵ.applicateϵ2ϵω))