From 1d0227f445578b437437b4e3bcf70e2b9b82451e Mon Sep 17 00:00:00 2001 From: Felix Martin Date: Tue, 26 Jan 2021 13:31:52 -0500 Subject: [PATCH] Answer till 4.27 --- README.md | 10 ++- ex-4_25-xx.scm | 170 +++++++++++++++++++++++++++++++++++++++- misc/corner-split-3.png | Bin 0 -> 53649 bytes misc/evaluator.scm | 12 +++ 4 files changed, 187 insertions(+), 5 deletions(-) create mode 100644 misc/corner-split-3.png diff --git a/README.md b/README.md index c6ebb8c..be3451c 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ You can use the Scheme implementation by the MIT to run these scripts. In Arch, execute `pacman -S mit-scheme` to install it. Then run the scripts via `mit-scheme --quiet < script.scm`. -**This is currently (2020/12/16) work in progress.** +**This is currently (2021/01/25) work in progress.** # Chapter 1 @@ -64,8 +64,14 @@ this brought up cool memories. I wish I still had that presentation. Finally, SICP introduces the evaluation model for stateless functions and concludes with some exercises that require second-order procedures: procedures -that take other procedures as arguments. +that take other procedures as arguments. + # Chapter 2 +![Corner Split](misc/corner-split-3.png) + + +# Chapter 3 + diff --git a/ex-4_25-xx.scm b/ex-4_25-xx.scm index e48a053..77e79ac 100644 --- a/ex-4_25-xx.scm +++ b/ex-4_25-xx.scm @@ -1,7 +1,171 @@ (load "util.scm") -; (load "misc/evaluator.scm") +(load "misc/evaluator.scm") -(display "\nex-4.25\n") +(display "\nex-4.25 - factorial-unless\n") -(display "\nex-4.26\n") +(eval '(define (unless condition usual-value exceptional-value) + (if condition exceptional-value usual-value)) the-global-environment) + +(eval '(define (factorial n) + (unless (= n 1) + (* n (factorial (- n 1))) + 1)) the-global-environment) + +; This implementation of factorial is not going to terminate in regular +; applicative-order Scheme because the recursive calls to factorial result in +; an endless-loop. The definition would work in a normal-order language. + +; (factorial 5) + +(display "[answered]\n") + + +(display "\nex-4.26 - special-form-unless\n") + +(define (unless-condition exp) (cadr exp)) +(define (unless-usual exp) (caddr exp)) +(define (unless-exceptional exp) (cadddr exp)) + +(define (unless->combination exp) + (make-if (unless-condition exp) + (unless-exceptional exp) + (unless-usual exp))) + +(assert (eval '(factorial 3) the-global-environment) 6) + +(display "\nexample - lazy-evaluation\n") + +(define (eval exp env) + (cond ((self-evaluating? exp) exp) + ((variable? exp) (lookup-variable-value exp env)) + ((quoted? exp) (text-of-quotation exp)) + ((assignment? exp) (eval-assignment exp env)) + ((definition? exp) (eval-definition exp env)) + ((if? exp) (eval-if exp env)) + ((lambda? exp) + (make-procedure (lambda-parameters exp) + (lambda-body exp) + env)) + ((begin? exp) + (eval-sequence (begin-actions exp) env)) + ((cond? exp) (eval (cond->if exp) env)) + ((application? exp) + (apply (actual-value (operator exp) env) + (operands exp) + env)) + (else + (error "Unknown expression type -- EVAL" exp)))) + +(define (actual-value exp env) + (force-it (eval exp env))) + +(define (apply procedure arguments env) + (cond ((primitive-procedure? procedure) + (apply-primitive-procedure + procedure + (list-of-arg-values arguments env))) ; changed + ((compound-procedure? procedure) + (eval-sequence + (procedure-body procedure) + (extend-environment + (procedure-parameters procedure) + (list-of-delayed-args arguments env) ; changed + (procedure-environment procedure)))) + (else + (error + "Unknown procedure type -- APPLY" procedure)))) + +(define (list-of-arg-values exps env) + (if (no-operands? exps) + '() + (cons (actual-value (first-operand exps) env) + (list-of-arg-values (rest-operands exps) + env)))) +(define (list-of-delayed-args exps env) + (if (no-operands? exps) + '() + (cons (delay-it (first-operand exps) env) + (list-of-delayed-args (rest-operands exps) + env)))) + +(define (eval-if exp env) + (if (true? (actual-value (if-predicate exp) env)) + (eval (if-consequent exp) env) + (eval (if-alternative exp) env))) + +(define (force-it obj) + (if (thunk? obj) + (actual-value (thunk-exp obj) (thunk-env obj)) + obj)) + +(define (delay-it exp env) + (list 'thunk exp env)) + +(define (thunk? obj) + (tagged-list? obj 'thunk)) + +(define (thunk-exp thunk) (cadr thunk)) + +(define (thunk-env thunk) (caddr thunk)) + +(define (evaluated-thunk? obj) + (tagged-list? obj 'evaluated-thunk)) + +(define (thunk-value evaluated-thunk) (cadr evaluated-thunk)) + +(define (force-it obj) + (cond ((thunk? obj) + (let ((result (actual-value + (thunk-exp obj) + (thunk-env obj)))) + (set-car! obj 'evaluated-thunk) + (set-car! (cdr obj) result) ; replace exp with its value + (set-cdr! (cdr obj) '()) ; forget unneeded env + result)) + ((evaluated-thunk? obj) + (thunk-value obj)) + (else obj))) + +(define the-global-environment (setup-environment)) + +(eval '(define (assert a b) + (cond ((equal? a b) (display "[ok]")) + (else + (display "[error] ") + (display a) + (display " != ") + (display b))) + (newline)) the-global-environment) + +(eval '(define (unless condition usual-value exceptional-value) + (if condition exceptional-value usual-value)) the-global-environment) + +(eval '(define (factorial n) + (unless (= n 1) + (* n (factorial (- n 1))) + 1)) the-global-environment) + +(eval '(assert (factorial 5) 120) the-global-environment) + +(display "\nex-4.27 - lazy-evaluator\n") + +(eval '(define count 0) the-global-environment) +(eval '(define (id x) (set! count (+ count 1)) x) the-global-environment)) +(eval '(define w (id (id 10))) the-global-environment) + +; I expected count to be 0 here, but it is 1 in reality. I think when +; list-of-delayed-args is called in the first call of id the count gets +; incremented the first time. Hence, the value is 1. +(assert (eval 'count the-global-environment) 1) + +; w is thunk and cannot be displayed. By getting the actual value it will show +; 10 as expected. +(assert (actual-value 'w the-global-environment) 10) + +; After w is fully evaluated count is 2 as expected. +(assert (eval 'count the-global-environment) 2) ; count is 2 + +(display "\nex-4.28\n") + +(display "\nex-4.29\n") diff --git a/misc/corner-split-3.png b/misc/corner-split-3.png new file mode 100644 index 0000000000000000000000000000000000000000..cc876ff3254a1b49fb0a58fa43b02e8ccc50b084 GIT binary patch literal 53649 zcmcG12|U#M+ct?Q6?F=ct!R<8qGiHR2}zX7lCAtpv>i8|rk|$dhonm8~zG22Re6v};JB*F3+(>(i`fj&tpX<9WFL@XtxBvMo0ntcr?@L*{ zRh|c_)DN;!*Oh{AByR6wn_d<2s%s*PAxmcu(;^)=2A}KEsi930L$88H) zt$&F~Z;+F3s|LAo9)qnU*eOqf&K@nm@YSSoD6XTkPl$`e-MPTSBr(`@L!9y`=*O1E zF|JNlGmsGJ<;Al?3}2scp0Y|U(x{)4@9nMRMzP7JdKip`!8FKf7ct5L^l;88&j3G4 z(b@m@$8#fkWHqX!Ht`>AES$%U=yWr=aSn#!Vfe1Y1jsaw511C?AAZ!ol1q|h^&zQE zH==Q<;*HOS^DyzM%Qlf4iFcgA@FiAd$v^yf=~Iuo&eU8K=Q4c#@H{t-g9n{Sh4ZXO zXSdbJjpFER+CTiL^v$E}`wN+m&Nlh}_f9R+wM}HTq6<9h{hfTzNr>2UGuZev$&Cx> z>?=c^@}y`SyM-CP23n-V^>p@xa2|aJ8pn>sBKqM!z1v(GM~)g zuTZ5R!#5buWBLLYc=R!SIV{vJEs`nDS$sH82G(oaVi9|svk2_L5{%&Ql&3-C=;$4a zTROE_Pnm*gQ?t@mxxjPyG*(7jq-;7?Mx7it6KzgAsm;eLPG|To!(cP$?7Dc^AZZ`)nY1XmOXO~a5^Jg8Km5oJ%Nti0u zoG*Lq1SA#CsQz@j+&U8L@Gi)&l^;@P9ZrqjudlH4IJIi?{{5pO6W`j7csl*l+qekl zIGn`I+)9q);c3WFW?e6RQlOowD8u)`1)fB|!gX?Cth-m4-?S(a65$9gNn>xwD~McN zOlN!M^G~?&ki6veo-JQkw^mJRVqA29*E8y$hBo&cOxnW|6~4Qe9sBO#qI1&O<9n;p z_fATVZB6&=k|3o8v`Ci<3>!@NSb}7Q|AU-ID=|-T5q)k8uOoX{awTp-&T#cz41UT< zZG$PZo63@BaYAyQuG*7=YK}lomLyAbB?ioDF#Cli%yt+0_sE@PiMP8=1+I}>SOTxg zz9~y*2_XV~Z8Li7m$HPSntJJkY-n!p&I;n_EzXF2^cRPOQPv(6!IH*m>Wbt;OIh++ ze{M*q@l2LbUa;ks)n3ROTv*QXfBmSE7gOc%luV-LXjT+n#;JhXP%0ltIml8ZYPyOl zM+I5hLw~+5?>;V;KB?UD?;q6&l&FFJfMz>b-t?OiOP#41JFP!4ho#{3`9(raIan(1 z(!YOnw@Y(Fb6()CpD*p7R_?Z1TT24;G}LfJ`8OuiyW2S@wS!Ko-caq=aUTR@!eVi_ z60}IWxBlx#7q|}lT%0Rr@K;h}Y65q=CYZKi-mZJO%PVSGhDV-CU1^M--K5zuWKVHb zeL88a)D@1^eH(bpvQ_MPhaB7fI}LinOLm#kr34C$n}j9kqYGN#5}xdBM0T^?qXL#dK+ZN~EOp z-Ijm#*mxVgN4-I)KEzPk)WX>Bf_JqXm#Okt&ys}WhQ_qmN5Sj@dJ|c{-KpKf&#>+~ zkXKYOA$Ov~B|>A^IBTJO-#~8gwI^l=|9!Jl)?FP~gf*@$Rr>`vc5|069~d5JkExyq^hd*wYJ;h>{zEno+1J1++b)_}ac5`>P9f4*anE$?UO?z!&z1yS4 zLG|cqnQc#A9L75O{ZXI%IGXR;o>U#}9)B>6&VE&5U_qMDxe;Smd&)WuvZZ52?A0YA zDI4labuaL|74B}ktwlP@Gvo+Ua&6#9CXVq{tB|l8!HuOVON?*S9{ZBcSYl6!%wM~C zB!A45t9Eu5X~pvo+9vk?dE-$$KU*j#*O#v zY$P8Gx{FwN=}4eaCq%Q**<%6b#fA-Zt)puO$T`E8w;s59qo%JaotWX%&<8p37v3If zclI2V4SD9`ms@nIHH>t4b^t}duh=YbIy&)W19< zw(Zo&xA}FY{dr@fGrQYPhP%tHHYjbe@5nDy+;u!ytlP6?Ux^a&#S}`1~(YLTp*v45y z{U6^R?pW@*=xe=kM__!h$eEFoe0Wa0uJoQI!-3S~ZO)13W(@VOG;*&~&xke5r?>DF zjAe6Uh`HTuds50PYl5yPx8hgLEqaEIXe)6u;T~o%G_Sm(3WJOUwKHrn1+OgwPD;h} z7S$#0Pogmgv3V+HB@fFhNogxGb52KFeePdw}K^ixrX}vHFnSGZkrXH zC{$M}z`s)|BUWDKrY(-U(Uz*YC(Wlx_~_X!EVGwVdUiAQ`i}o^fAUL=cs76VRDV=( zGqpQ#ZEWrTpFh7yjD&Qi|0;K&+}NymaG$Zj!}j~hEyGFogN>Z_);Nsqt=5ns-|Niq zmhN1_A5-OQnj7IfFZfLdIl1BGlOPRiXOSAagJ#d}_O~nF>ui1!#7A<*Qx0a&&iOrg z)A1xj?m&^cnYFW-sldbLxa8C)a>>C)4*E65W&$-D_tz(O-cJthT(VcV(s^%95jrlh z`fUbZabm)qAqb5Vlvv>#&GwX7!N33Cg`pUuWZ4i}hQL?Ik!LlAh$JfgK zFGi|_*XZs4;;mHtS3mXhSREbv&G<>s%mmo5v$n7297;8}EP%)woHl<4Ok05{d+u)Q zr+H@#>?xg`%dWxVl~-s<+1t7MdZKic?Y4W)EA=Y*wkyR~kt3FOaNmxm+s3?{@62hS zYx8Kwr?XE^-?^P;lJI4VS^jPVlO%(aHdcxx?Ywv6 zb&y}+;C$Z0!CBJT%C<_E1RZ))yqnpNIk@^qY9Dp??N09fl31mG=vjW@ z@L5t?Q9Ylz=p&(*=hwR#QTluzXJi$;y0v%nm3buI&gG(I{H}&>Co64NtZ8oCKlY5{ zeRDUre3;1`jpzC;>dWDOZ-gxUp;(hvlkmJ{J3J_F3+tj0X3)TJrQ0=a zl45aB=Y2OZu?yz0LSbv*YB9ZH_G2kWvy@tlv4Q@>|U-D$b+zJzVawwLz0~Xh)yy6UB zZ{|S#5NUhJc(B12c1e*k-q@Uxao;=TJ`USdeQ6xSO%<*UVhT#b@;hFT!kyG8p2OWE z9Jik@S(5|*Pb^f#@neeMs;*{3c*=oR#ljnoZrz^6Hz!6}@ACRW z;h|?~!4`0^|GUk$ki`R>)C`4H&-00K)7e|_(&q{TA2x4RCtJdAGjm`n?DbrsMLG`% zL7GSG`8i$;*#}?0sHxDX?}oUD0$jS}^_~l*RTt1Wo&#av3*@yb3OwzU=SJgr(%ifM zK2txO=QlY0d~IPAk8OY{xQM6zcRp;D5K&;Wh$+~_%LC~$q(z#YXPA&u=2r+=p+aZp z=&h2H8EAwwISKcZ&C{8Cmdbj_n-Bl9W~xN9nm12RxC08}!dm=qeON4_z!j;No3RP- ziaQ4VU;6L_UH>Ax*K(W`g5yZz*m|>w`}IT|aS@#Iw9<@DeG^l}EePjXc$QyUVZsmo zy%?QcqWl17t52C0X<#$iQqtsp-Y73zD{q{cEx~+I6YAJ)UWV_5!w;wRQx4Z1pU_>G z$n9;>^lc|ynCa!;rm5}NIK+2dY-!1<217URONyj_`0*xobZci-RPQR{J~4dr4?h)} zuNr_mfhAg)WN1}TOxz^w#;rly?aYN#*3>Q2%tL01ZJwO^`RaSCnyiT1OK0~hcUM~G zIU83OQ&%u~@cc~JVqgpkuOCxbQ?oI6{dnpB`(JR(hcdE+6%s36j`7<8ZUGwB?cln> zQa>SLMD_y^HlSp6E!`*b;&w<6?aK!A1@tVVxc-x`dd%MLbT{B&K-KKSvR<+Kk(27| z`he{LZEF;DjpX2RHpy&g2IdDiEl;Iejx@U??L=wH;eE;7&aVK6{pr&~HXO*CWu&=9$RVo@> zHQ$5xX78=1v$3pzz+ON5;J0G*u)H5$-`rGe&BGyaZp!;t;{W5OI>gjT#|0If@}Bi= zj>SR(qsU!v|H}6U$Ffkd;RR4F#Ot2g$2D6-!C|xvFv0*}4tbus)t2qPXIlbQu|y;~ zyN^TTW%kXa?ZT7+xNs@}Rf0LvXD=jMHZyM^JkWm1DbGSU<6vGH`}|^FFCY}W2s||B z$#MknM6LI3H^61lUYDp6(4(+z+*-zj{<=N2c+e8Vr#teOm9~F{E6jJGV@>5 z7H=0*5MX(f-u7Rp9E1 zu%QLT3g`Zx|9T@X((5;?L8L-~%c|jEz#O3fr#xN&ZQBbM!u7_EO#KMo8*ATK;99JB z9=4$not*+SZPgqrIP3qSNq+BGc4LqFy#@auWd2bCeE@{FvD*G)ROj>U8$#b`n+b&B zq&ZS@14h0930ybSeA9UG5Gav76TVqej#X)HGR)sUY@4xd^drIusP+X1XL_^|)kZWZ6 z-3u$>4*VHjpOP_%%Gqyhu>Z>JIe+DZNTh-Mb#nltSFxdWrLMT<09vr2IM%J+IdD}) zSSt$;wFh!BGxh=S8K|U^F;6(K8(EV)Vo#ay+rW{t@m}ktWf}S-gJ(HcS?9T0S6!pS zU8wEa+nD1i&|7b;l%R-XY91>AJT>N*4pwALs0T<;va=v&V7U{ES$;^nIsB zzL@>H=Jv-ZBX$mn!jP*5Ple(&>&!mXl|~D@My?x5T?QFmGIsxkgX>90%8?U){^?l% z*z2^42iNu;+va#pisJnruk9PhUS?L^Rs_QFm|^%PX>B|}npEA~6UQG(l>k*ZHXPx2 zPuGTLsQ>6xyNp=ttKOgLYz?9d$CPUaq}%phr3+_uw~fYR{$l^BF4`};H~mko0)Oqc!@eO$nt-9@aSW#&Ol72>ew*1 z^KGZ1T93ZgeUAITFlr1F*ThTLm9E*Io3klK$_)MNA0FiE*v{Y{>YrWl;DNsNHbYD{ z%G=AIZ14myO5s4KbmbK~Uw50}Z3~MVZ!RS>(_$yqtk|NYF!8vx*XQ}oPpc-@=8fH_ zMENX&e<}7lcMjZ0-qr>#xVEHzJC3^2VZU$b?A_L5`J=VIx?k7mY`1%~!(Ym(Hzo6= zd)-l^1Mcu`w+nI%IW{riuqqs!4b&sr$4)HL z-Z^*HSl}n-z!+}@`&4S z>w$=oqLsI5llSf~)4G2m*XW>AZPm)zLTC4M3*0+@Jj=viUE<-(u>%q1#|-Z&9G2Xh zX>ot`lP+66t`O+&q@wVDh?K!7P%JdL<#GRt2+hFgh*OwSs-F}0k&y0(hg`yU>`y9J zsea8vm%6X?q&WJWI@$lx)*+)c8?_Qrs@p}693n9mR0~1$e2&W>zsM8*J#eaU`D(4* zr%G{=;uDS|N!NsEEk?(W=SCR#ISIci=}JFg8y;$vnK`z1#~iwY%)0c3mv_|3p`Tj6 z?%SZGRs687&RaTxi!pt#aJ}89&oW-m&fP*MG4WwW4oh9^kFh>Kr|H3Ox}J_R)ybzd z+P<3mjEalo-*ohNK=BR_wJgtkS|di$(oAWu`_LICMw2jdI^Hu_%uAmqLrxzWZXq#N zREv-gz5GpmILJ9L^vdcJ;i?DfZ&=+vFH8$Fa&3>2k{~f8{;!XO^u;>)evjfVeK=gU zKQ&+uebIeYr?>a_`wej2;}uzZYp>{9-3j~r%0Fg3ll>$yp-36R(y z;m9d@ITfvRoVVVgK;4~l`HuBk4;r7%Br*7|t#1;4dV2nHVVa?R^BKPZ?j6_c!_D*0 z&gbbUY4EF_NGW@K`EO%O!o^(kNu?rdwZh(7HaBJ#axvyD+Agf@`c_=!fZtiaHl9T^ z&7%qqy>)o0pgGHUu5UaVF8VP4S-xZ79J<8XsP%5$De7hj{|`?X9o(k_iC6unaO%|j zjb&8il)T=GkNL$H$KU2%MDs}*$fz7Zx4f4{BcoN1hK~dJ+*N^YDMs$5w!xgRL5K3z@__B|Z^pyDw{M4Ci=POKFIFkKnd;<7kypfg`#1g5pZ7LQ z{2n9owkkL7dDt!kTye9UbiwTBE@M~2*~!XLAgKW0!g_{}fDZ`{K)tj}s#KP|qQ z3fS}m+8oox`n(Uj&Ydc=6=l6aVI+odI} zMe?5ydF?qmdTrO|93N#h;q{FztCG%NbDqAaVQA08KF4hjN5=cu92$MYiqin`&O7Sa zU|96FElr4vM`-O4>x@{Ig^phePp4{rn1j_@=%83y7a;zTU;C(errYPFr1q6lZ z(-4UTLjcq21;fIIlg7ahVh9~kSs7nEj)1K&jvZa;hhahp{%4h*YCKY+)< zxKWg+vy;Hz!I}u8)98f^UqZO1!Knx)-WzdG{>}IvCi3s381WLU7RJ*u0sR2ug{QI6 z*%8zgFTr|%Hlc`EGdc~wy@hPKAMZ^NiVE;JK_SB1gtx+H`1mp^7OA~8Rh%J6XMgfd zMvM0kB%0kk47M?_s&)Za84$q4;=#YNz=X*xI)s`Ai{Rk9dj=lEUecDJGcX+_!JttC zpG*9YOd8rs{0s+-+Wg0Vcm07Rvy%BcElX1NoRcpYSmIJxouB{3iu^>B*@kxk!%7R3 zmOuQ9S^rL;2|s{QVb4X$hTo@&&<4JOq&14?c{q0*e_F2QC!oGQPwM;h+#5 zgGxgNdkWu7XL;gkSWk2ZfM7;T>4XgkDo)tC_{Nd`hQW2|NMo zr7W8B@x@LPK?a)&_Qyfl^TkD&Lv(g`ELgJ}le%2f28U+=RJfwQV$aMJ&e@6U90xv~ zKIh;44K565cNjVd&c4?q?Pg|n&RA7?8a%AwU=XH&;37b{6mN-Bv3vRhJD)*W*|Sc* z&tP zU6CVj?&dLkH?ct0G&av<$KL!JJK>G3zwI|+Q?1#+Z0uY|AhimzY_Xlfp1p&MNXOr? zPcdyy?Q;PvfGgr}-}+k%=?KUNYawem9scRlUol@~om9;UA%QD>_w1YEBao?&A(WNM zzq#o`BH?ByF5B@T2WJR8Hhmxg77%9y(Z>J5j&IE}y6}~j;Tf46@~7ZbML1Jeaj<@6 zc3hHw^IfXEZ2n7LOyI2L-d@RvfCfV_?G_Z+F*Wx?3%GjX9VZ4M6x4cwz_t zk{~mWfGtm-D@@4X^|TzE`H!D?jb=~rXFd_KmyncvI}gpzmUptxnxqK}~_#IU}>sz<&W z?d1z+DXJ3xfBM9unG6-Yh{o~qX5ob+Ks!LEp|@uOs^dFT`uQX?j-l+HTxaLN*|f$( zRP``9>^h)8Q+4L+>w&z{Z*JA*rvjEkn_t^qdOvHCvH|uhF0-(JtReLC#RFdk!8x=9 z*;7&Kr>}4J_ZgrawAjmb&(TU2Sv8IvaDJhJ2C)7pFe*!e7fWz$F9%u=s;652f!~7I z4HTiLp%coo7oK=INpOu@9dK|DMu*s}@EPYXsk4nP084RU%sNDKC^ehgTH<$QWL2to`XmRwDb|U%cfI4`Ig;Y(b%62{a!8DZnIhc*9m zcy3HsB!6BZU(<-A4=#%d8?WJ+p3*T~5F2)7(|H1-A<}K;eYWlQYO5BxMj9hPDd-yM zFcGpn{_QP$el%YDtVddzvaNpAHv^D|;^*{@aF>Sda@{_@pbUL%X8C=)IhWfRa{I_> z@7-PeqBf!+R)@+raq*izlRt)SSHfPmg=Y055zSm*Fe?^M{PDGyaCr!g>8s zuXPzEBkO3^q1=|GbMgu!lJpxx9bMnKlz12G2>Av|@4JyF($@WJSM*qDq#|DLalxmJ z-k$!3fo8M8M4d2b3$6%z(A$v`%%Y~4G_PqFt24_P?tWJ#nRF`am6v|2oTKZvjx1}# zi)mclazpA@vR>DJy4Q2vOqVW{kyS?u@$S3WV39-KzEOP0be&)b*eOA(HU7lzyr@kt zsEoE_FzOfDPA?JBi7V9`YMr(1h~;1;*S&`P3z(=-P?d$yeQ%N` z7RpBavWE>p2`s!r;;mQ+RtQkXHrQi6i5FKd4p8=eS`)dfsN(_8-dsPkrjgW3g+Kpo z@_>iV-s6zd`?;^<+!T2Q$TMYIRpr*^+%m-zmlXx}`jD&`9yR<}t%#K2jSF=evT(AE z@1F7hkPj(Rl)k?qCf<9Bv;uQp093mR;~PYTWpz)*Tfk&pDKYk$q^V&(sx z)EFdQSiI+XVFW{8;(FFA>0nb+^%4Y84%MX?+u6IGJa{2kI&nj{oKD>C68i<-(_v|) zT9(($3jXi_;Q?@i!w==(d?3L8)Pl5=IS;m7$>}Q=^0b6?vkzxn5&~;PZ|YCb_T;(O zI&bcxkQ*dK#C6YTSge+D&%I78yN1j#b$|KD-~ud*^nv%0vv1reX~{&S{)-NH%(MR0rR)ygxHi4yV0YH*xh0)?VbnJ1@y^#hxs@ z_nEz0&J|iheNyWkOehk2(Bo&;<91Nl!`w}I#~SREd7YVy$!OoO>f6Ck!+@UBMU8*? z-LKQ$JhOKdRF4nrULu+-6Lvssv!knE{-#n@Uc<|pV;glUw%pDr9fOT5t(?U<)OEtB zd1ld28xOn$zU%d;M_e|@^qpxQaU{WB=Po^-@0BIIQssuC%0Dn$gjG)rfTY<{U{Da; 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 literal 0 HcmV?d00001 diff --git a/misc/evaluator.scm b/misc/evaluator.scm index bde87cc..fc5e241 100644 --- a/misc/evaluator.scm +++ b/misc/evaluator.scm @@ -4,6 +4,7 @@ ((quoted? exp) (text-of-quotation exp)) ((assignment? exp) (eval-assignment exp env)) ((definition? exp) (eval-definition exp env)) + ((unless? exp) (eval (unless->combination exp) env)) ((if? exp) (eval-if exp env)) ((lambda? exp) (make-procedure (lambda-parameters exp) @@ -108,6 +109,7 @@ (define (make-lambda parameters body) (cons 'lambda (cons parameters body))) +(define (unless? exp) (tagged-list? exp 'unless)) (define (if? exp) (tagged-list? exp 'if)) (define (if-predicate exp) (cadr exp)) (define (if-consequent exp) (caddr exp)) @@ -244,8 +246,12 @@ (list 'cons cons) (list 'null? null?) (list 'display display) + (list 'equal? equal?) + (list 'newline newline) (list '= =) (list '+ +) + (list '* *) + (list '/ /) (list '- -) (list '< <) ;; @@ -299,6 +305,12 @@ ')) (display object))) +(define (eval-verbose exp env) + (let ((output (eval exp env))) + (user-print output) (newline) + output)) + + (define the-global-environment (setup-environment)) ;(driver-loop)