From 48f9e8997827bdf8c9d721cfa0c2b1d1694eb1c5 Mon Sep 17 00:00:00 2001 From: Robby Findler Date: Thu, 11 Jun 2009 14:04:48 +0000 Subject: [PATCH] prunes out the identifier bindings and source locations from the output of the top-level macros svn: r15144 --- collects/redex/private/bitmap-test-util.ss | 8 +- .../private/bmps/unix-extended-language.png | Bin 0 -> 2109 bytes .../bmps/unix-extended-reduction-relation.png | Bin 0 -> 507 bytes .../redex/private/bmps/unix-language-nox.png | Bin 0 -> 3129 bytes collects/redex/private/bmps/unix-language.png | Bin 0 -> 5597 bytes collects/redex/private/bmps/unix-lw.png | Bin 0 -> 1181 bytes .../bmps/unix-metafunction-Name-vertical.png | Bin 0 -> 4545 bytes .../private/bmps/unix-metafunction-Name.png | Bin 0 -> 3738 bytes .../private/bmps/unix-metafunction-T.png | Bin 0 -> 4027 bytes .../private/bmps/unix-metafunction-TL.png | Bin 0 -> 4547 bytes .../bmps/unix-metafunction-multi-arg.png | Bin 0 -> 7207 bytes .../private/bmps/unix-metafunction-subst.png | Bin 0 -> 5287 bytes .../redex/private/bmps/unix-metafunction.png | Bin 0 -> 1158 bytes .../bmps/unix-metafunctions-multiple.png | Bin 0 -> 10731 bytes .../private/bmps/unix-reduction-relation.png | Bin 0 -> 1956 bytes collects/redex/private/loc-wrapper-ct.ss | 22 +- collects/redex/private/loc-wrapper.ss | 10 +- collects/redex/private/pict.ss | 26 +- collects/redex/private/reduction-semantics.ss | 574 +++++++++--------- 19 files changed, 319 insertions(+), 321 deletions(-) create mode 100644 collects/redex/private/bmps/unix-extended-language.png create mode 100644 collects/redex/private/bmps/unix-extended-reduction-relation.png create mode 100644 collects/redex/private/bmps/unix-language-nox.png create mode 100644 collects/redex/private/bmps/unix-language.png create mode 100644 collects/redex/private/bmps/unix-lw.png create mode 100644 collects/redex/private/bmps/unix-metafunction-Name-vertical.png create mode 100644 collects/redex/private/bmps/unix-metafunction-Name.png create mode 100644 collects/redex/private/bmps/unix-metafunction-T.png create mode 100644 collects/redex/private/bmps/unix-metafunction-TL.png create mode 100644 collects/redex/private/bmps/unix-metafunction-multi-arg.png create mode 100644 collects/redex/private/bmps/unix-metafunction-subst.png create mode 100644 collects/redex/private/bmps/unix-metafunction.png create mode 100644 collects/redex/private/bmps/unix-metafunctions-multiple.png create mode 100644 collects/redex/private/bmps/unix-reduction-relation.png diff --git a/collects/redex/private/bitmap-test-util.ss b/collects/redex/private/bitmap-test-util.ss index ab24e7b392..c9e9ba5e02 100644 --- a/collects/redex/private/bitmap-test-util.ss +++ b/collects/redex/private/bitmap-test-util.ss @@ -28,7 +28,11 @@ (define (test/proc line-number pict raw-bitmap-filename) (set! tests (+ tests 1)) - (let* ([bitmap-filename (build-path "bmps" raw-bitmap-filename)] + (let* ([bitmap-filename + (build-path "bmps" + (case (system-type) + [(unix) (string-append "unix-" raw-bitmap-filename)] + [else raw-bitmap-filename]))] [old-bitmap (if (file-exists? bitmap-filename) (make-object bitmap% bitmap-filename) (let* ([bm (make-object bitmap% 100 20)] @@ -50,7 +54,7 @@ (set! failed (append failed (list (make-failed-test failed-panel))))))))) (define (compute-diffs old-bitmap new-bitmap) - (let* ([w (max (send old-bitmap get-width) + (let* ([w (max (send old-bitmap get-width) (send new-bitmap get-width))] [h (max (send old-bitmap get-height) (send new-bitmap get-height))] diff --git a/collects/redex/private/bmps/unix-extended-language.png b/collects/redex/private/bmps/unix-extended-language.png new file mode 100644 index 0000000000000000000000000000000000000000..87e19556d4f1c0eef92e68f1357a1b101250bfd4 GIT binary patch literal 2109 zcmV-D2*US?P)wIGRtm=eGUZE5Cv7{7JD(k|^6dL#RLIV>csMjP)G47`TU(`4si&u> z(P&&3hxB7vTwKh`%F<{w>k^Beva+(y&Q4^r9T0EBP*6}XF)`8I-OXaL91!mG>C;(R zSt%(g_6~$$*rP{}5)u-kqoZXqnfvV%&V?X|#Kc4g1R5F|>hA6?DJgM4EC7JNzyHyr zM{8?q0rlC@*VmVxo}Q7BA(zWlDwShyWqr}>^&TD`7>21-s^a2eZ*OmjL^3oq1OS+w zolQzg!Z7Uh>(>B)rlzJXTej@nxznUqVPT=Sx3@x}`0?Y%y?gf}BP0F%{O;bpONPL4 zJS;3MKR-V@I$9(W_4M?RRjVhE>bbPE)X&ck!?2N&5o^ZM-rl}@_ihe{L%pcgYQKN~ zPT$d*bu`;1H8r)PqeHLP0|+66@bTlvLZNVSauPx~Gc&{Ga=W^^AO+N5Vq(H<@#4jc zEDQAa_rrB%XlO_v5Ll|!>-8KCCo?ni%a<>6b8}HqQD@GaK~;l;g8+bEzkZ>jQmH(3 z>J+tCR#ui;t)8Bq4hjlNPfu@aYg=AkE-EUDiHSkYrl+R?069513kwSn!ph3ZkdP3) zUJor#Ao84%kufqdqSb06A|eb1gEeDGOG_&&D>J#++}vDVUQRPPYpx?r8+35NaeNa1 zU~zG=w6s*EQVE4Z005uQ4-XIj@ZkeBvvfM$@87>yR#waw%gf7$E#R1)mSl8vRHxHj zx^yWjD$3vAUnCNd&;G%|L7`9>6cj`j6$%BlS8Z+W)~#Cw0s)`TmrA9%xw#w;CpI>g z^gs{?NYf@DAOOW>0|1^qd#2TDo0^(hT3S#~gTW9I5<>NrpP!$fpKqzi=kxh|zD)zL z6F82GM53gmBvc$9A6F`s$R-GaOoD}l1+`jD7I7RGi^ZsDFc`jm{d)7}O;q*y^XIs@ zIMPF6Vq#=uBr49&&jSEB91hI{BG1Xm$>=)ScTJX;m#xem5^L6xrp@Nfn*jhzOG|7t z)X>mS9LH_C11dE&HJ2}6He2=f?c2S3_x|6WZG|9+UAuN6dv0z{qtTEHPY}exg9k~Q z&1Ub|v14_w(a}-8UQcEfK@dld96>gYe(iQLZMcxMfRROd(eZprluw@FAv#;g@qCA%yeu^Qoz+PoF+DIheG!w}*#^lZQ%^qOCMEG~B;`-+G%0 z&ACjc(|LG!^!E0m;*~2`6bc1d%jI$(K75EggocI|7Z;oDRaRD(o12U5j~_n*0OscA z;C~O8X=!N&gTZJto;`b3B9UmdT4;F!O+4E)mhlq| z@4ch0u1+SCrKYB4WMp)9cCL=s+S(cz7&tyYZnkJE$;ruw4m*(c?_wV2L_V(I45QOm9v151c+!2e#fcd|}mErMt9UUDrGcyi| z)!N!heob({eFDQUTVLE=7Hh^L5C|M_8`RHB7-V!-4F8M!?Gp_4hRF#AQ`|2nHj>WD zHQ6ACHOJs!ot3k2zkR~FI80~dL^c5cnwpw?eSHN2!SUnA0RVk{ecQHe6N|+!Uc7Mj z?b*gg(pfnZ^l4M6RAy&qlV3Wsv$IY9-(qxD&<;8)*W~YcLN1q+zlP_}pU20?i$o%7 z>a3}=%E`$wn{yJ0#15Hk5vtA#06?#^s;a7@_Ch)<006180szFu#*$K{)jF$&h6c4- z9UdNDT3UMT+BFmL(*FJXsX8kFfb}{nC-N^RCMPEs7ZlN z6ZxAHadB}F!m+Wjfq{Xdq9QLZFPpqDI;(ZpSvirvIU$uwxm<34fB%~|Z_p{sCMqf_ z^78V`Ryp|Df#W#&6kDycs;;g^_G+CKbvvQaSs_UTSW9Qs*w|QKUvJ{sZ6Hq;2?+^2 z9`D_|cV^EWjLym)IxE-YUrrPh6eyKSOYIn)l|6J;u8I5oFFHItoSB)4ezgqtfccKe nU<#8H45qkWPHZHdm22`Jr~)@PBGqAnm?Vh-FpP+UxZQ zBYVf5y4≻cyrZhlDoHSYdX%-Abim7zQG$sydxcDNFmzt#$YNeMM1Ls}%q&mrG64 x%H=Y3dcT}br}swFXf&v^vx!DpKZq3l;0MDPgqgq^{l5SJ002ovPDHLkV1jVP>wN$K literal 0 HcmV?d00001 diff --git a/collects/redex/private/bmps/unix-language-nox.png b/collects/redex/private/bmps/unix-language-nox.png new file mode 100644 index 0000000000000000000000000000000000000000..a05ce95394ac8c60651378d72a98fca9a09db418 GIT binary patch literal 3129 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 RW$;P>K>x6}s4@3V{SS=q43q!> literal 0 HcmV?d00001 diff --git a/collects/redex/private/bmps/unix-language.png b/collects/redex/private/bmps/unix-language.png new file mode 100644 index 0000000000000000000000000000000000000000..cb88a9a4d92e2ff3cf89d78687bca196cdd604f1 GIT binary patch literal 5597 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 PEky01mQtC5Rmgt;9){&b literal 0 HcmV?d00001 diff --git a/collects/redex/private/bmps/unix-lw.png b/collects/redex/private/bmps/unix-lw.png new file mode 100644 index 0000000000000000000000000000000000000000..708c9df4aa9e473580a6e096b6bcfceb06847b34 GIT binary patch literal 1181 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 JN7&=Y{{a}I;I9Ax literal 0 HcmV?d00001 diff --git a/collects/redex/private/bmps/unix-metafunction-Name.png b/collects/redex/private/bmps/unix-metafunction-Name.png new file mode 100644 index 0000000000000000000000000000000000000000..b299b86abdddc528abe1b6087fcc97d092731cdc GIT binary patch literal 3738 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 literal 0 HcmV?d00001 diff --git a/collects/redex/private/bmps/unix-metafunction-T.png b/collects/redex/private/bmps/unix-metafunction-T.png new file mode 100644 index 0000000000000000000000000000000000000000..05edef44444f9588e0589d0410e6f3951feb2ff4 GIT binary patch literal 4027 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 literal 0 HcmV?d00001 diff --git a/collects/redex/private/bmps/unix-metafunction-TL.png b/collects/redex/private/bmps/unix-metafunction-TL.png new file mode 100644 index 0000000000000000000000000000000000000000..378e0fd05bd9cc4e62bf22865beca217e8c10ff1 GIT binary patch literal 4547 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 IqJ|3o7vKN$#{d8T literal 0 HcmV?d00001 diff --git a/collects/redex/private/bmps/unix-metafunction-multi-arg.png b/collects/redex/private/bmps/unix-metafunction-multi-arg.png new file mode 100644 index 0000000000000000000000000000000000000000..0ccd5e69e935c1a515c04dce4e25da286c03fb54 GIT binary patch literal 7207 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 literal 0 HcmV?d00001 diff --git a/collects/redex/private/bmps/unix-metafunction-subst.png b/collects/redex/private/bmps/unix-metafunction-subst.png new file mode 100644 index 0000000000000000000000000000000000000000..3f00d4671a50c2fb46f2794e82bb80ab9502099b GIT binary patch literal 5287 zcmZ8lby$?!xBf`UL)XwD5+WrqAdRFl#L%UH2uO&ebPpv00@6bXLnti>BdMU00*96o zX#p9e>+a+E-TU0<_xr{F<&6Y#>e?H`etWmDZj#uzs=6(%lq?W^d)-w;H!{dhoI%?bXE; zsZ~i92XbWaAf_8uVbrCsUY#8+CH=a${jHe*a(eVA;*#pk7n%8>rNzbF!}-u+39R2v zqtOS^_OpmeRTICRxoGOf#>VGtva~V_C;OXF7#hvtWKqM$V$9qV-$D0U-$^%LQGti& z`$A{r;m&-979R}_4SXX$KK`R!ZB7pBRhYBx$?0ieKmhTTD+XDwUcFjdbDF+?aB!f( z3L=h+i(6k`=iuOgpjxw^8ygk|2H`?!T6|#7t5>h4q@-A#vo8|3YG^R5)bjiyVzVhJ zDS^UtbEFq}jg5^ZANDif^8H!eexbvfQo(N#X0uI1OgwnbL`9YK`t^0Ig|29FUtiyP z$03bS^gx#Fr}&O57vvS+zuUREY<~W%r4#r2w>KweeqkZEvAqv}CY9omvbET~)&Pcd zZEfu*Po5Z&No38)&#yM9KBCG=F^KkmO(MV8y)>U6dXbfvmj{AmWwo@l++1Ca z34U+a9nXHtS3c)4p_)FB0b=8qpgq+G_oBG}K8i}eLGk~k8RWTd1V!1Lh2LZy80 ziT6~U!$xU=vaO^g3cE3oUJgO$b+&HI^7!+uR&I8A1tm%9{|P@B1ut zg#Y~M3IYdUdjI}Ccq1_g%D?_vSy?f(qk1fv`TOwjaDRW1iNQ5CK3?a}9darvKQFKP zx;h8#}v$L>8V!v5v8E`fVO=8g**w4|*o#}UNDg|7j=iXSTUjF*}OrovH4Lin6pMV-rof>a1U++ItchJ?*NwxGAKZ*OVqWn%#nBnJw+riU(=HLf&Sd_0meR_D+MgTXiy0&cp0dw2ED%Up%P zgX6u`-QC@bi;J?!V$CE78Xg|Dwzj73N=r-IUHSyvQ{MlwShiAAQ3CO5TlJ=}#z7y(lXyQ^wlb+FCZbtIu3R)(sfE~ zY;2rNZ)C_wOLKr7@+!*9v!vZ%Rkq-yk7D#49j`$hJw2r$3$3jRw{D$I*4nS7S>51N z3X!k!2b8$>4vP)+@$s>;`ZkO86SZ!6;NVaa&^KFa|LJ>o0$}c})YQo5AOAcH_;$5s z*BK?}n^>|5ArDW_-l3t;r9_!hL|(wfnLi(WA-gL~jr>xfL>+VY8B;xyKXo8W@`{_E zxA#pcDcjJ`59%0%O%~jQg)1{`0<_0A#@|>1{7p^)U~Wynb+Qyn7rH!1|MFmPa1ewQ zL&fR)^j1~`a!@7}ev$faoA7B>)}2jCSE5!q;Iaha$(KRp~p zw*>4z^6(IAscPZJg8~8r>1b&Yx$tmosnox|sXyI4&;uKt_Vo1db8$gib8W#h^Yff; zp_k`}qoum_wY7zBal5-Lk`F1Mg7)@H;AAf*H!pAaU}0gQX+8w&J_|N~mCe=`eCj)v zoo-%hryd-9{vn1+@Y56b%kBgw7Z(?2Y<6z$>+Lx5Au$v`9>VK%>L!Y@@M-VsaO#7@ zLqK*+Oiabsx{{PG;9_FbN?f4b;C`=BU2r)5bP_jxFEYVj2)_-Hu3Uix(_k;lY zIy{VbdA`L8g9&ByF_3iwzgk;cXJ%#!Pkwml4D@FDySInQI}C<>|NcGWUI+^$X5aG+ zP+ikpfJ;{tDL`F$d3o7w3ybXf`aRroUlRMRmCen~m6ew%DJr!VE#B(@8=wL*)6;!^ zuNmCCckj-fKJ^5~hVTw? zzOw)2$Y;_j4rx)oWDj4=BdB>`?dOu)cKh_7r}qgtigxpQ-;r+7_j9-Balujd^3V~s zw9|sWq}yjZ)&g@$zlAB{Jum~`YJeXd<<7g`Z$MxicLXD9k9K4jdeO0QakVuyPfxd+ z#)xcveGg(dLyi_Y3C4cU*t)<$6Z7=+R9Ej#6GTE#5~!!MBk?Wc_pPm(i7+B)ZF~Cw zhttv1OG--8!~_KefzyiFHr1kE?9Y;nu*9Nu=f^rnkc7qIA6zC&Rw(Pu6o~44TZK-T z9r0r*>gCP>yPcn(W3kv>8f(T%%>6-^36~~0g@_UiNl%2c&q;WAI6x>I4xgNvvCnX6 zFbfU|2?-3umXv@ty9@|Wu>Mo-MAd}5Pe4H&hD3uvq6%@()Rc*pwUR9wcD12cv#ztV z6Htp&{P7mC2Cp8?vu?4<(Mmcz)KA7rO$l!n78cDU4k9S|?WT{)EntSc`rYQ+&ZpnH z^lB!*FmQ7d$w_u|c9sn~@&JIhw=ZtA9lC99&N6Z`thwB!I))^)@BFQs_o@h&Kzksfb+fq?-?(ha-p*0|zg-WDF4 z(YmrSt?P`S0~+Wc{!6@;Re%->B<@*WprN55U~0Ei4-;Ci89v&$H*eguwd2C+a8nId z4A%19drzdpK}3{XQ9!-|)!c(8<4TMb`l*Xn2qcD-n_Ey{hGa^jg0|$Z#{S<=0W5F% zZGT+-C!l3l$!o2`dqYZ>5JW~!4xo+Oi_S@|ww7zXf&P9Bug_O~zeSFoF@YeUXAcg1 zt=_g!_@Z*%eE2KYf3K;oRmFc5P|A<+pu@fWlMQ)J#{*<+Q}FR)_u@%PO3H4$PsyEC zHykbVNU!E`s6IW$EgKYT2(~}Jxkt1rrOKqY8>EhQ-dbvipUlb}~= zS$GagGv+V$BDWa1)WX6-z|Cg-sfDwLbAePM>`CIQU$`Vmv%I2T<^TB?75B5mL zm!vFi)gbcnFRSN?-j>P~(m14lLMdtS$f!oJ8j%vAaC=mh0sU0RZ#7$DZJ?#J_lj%p zsF0x(;c$a~^fmOzY%@Pat48|Id4=jP zPDM5b2K6{K9selR!kWfLcV}k<#n||%sVM`pz6TPZTbCQ@$l92gG(Mhhd+~yH8uoB7 z*BlT;N(v1V6HsH1t6#7AoI;U$q7j>b(L07oU^_^z?k4!yR+;sh##qL~UW(6`g5_Nz~@`n>XE`j2Q%} zD`3z})8i`;Tvm1p>+K%)X5$)-moIMOdn)nW(J2=@#`bfA~TapG@_!Z zNk&MBOi;VVb`qzirdHi{vH`fEzfDl-{P!r3LsT5{nQ3X>$2bQcDFJ#iO-)VvR&P1) zwdDN#e1jW_3z3)xF>zt{p~pi{6`-WTw9S;tzDV~21S*+U9myG~0z+o)w&Yph#=%;t%{;vbtD zu>BVK$Hq;#3JZ>PTQe=jFHS(?%|8&z9IlKd8d4yNUWW~KOaHDk2p?8|-DM`h0F!zV zfxdnH>9!!(-3brTM!fyh)2YN-VvU(?N>vjygo>4D$Q1*1-c>DHxvI6p z7=S9vx#?`Esrdi{+}i$n0BP4rAtdo|8lWJA_<^(p_hs!($f#cMyIDM5W@IML6t6iA~NpZ zAjsR-cO%5w7-U4??nK#U-T0b8vEAOv0IRgCfT(Cp_8l&2R1mVW zvolx^Xp)fg{Rt!zX9pROz_)*#>=rkiW)$9CZAKciyEQGrr1Gi8p;@><1($WV%zNCV&=(;fHxGxa& z&!0aBbJJu6xOLe1)|{G?69`5=Fpj>YydT+;U0G29I(T$+o8sjv2J?%?wpku8B2m*GMNLY7(|RB_jpG&a5np8{h&G(pE>@u2Q`p@jt?S BAZY*q literal 0 HcmV?d00001 diff --git a/collects/redex/private/bmps/unix-metafunction.png b/collects/redex/private/bmps/unix-metafunction.png new file mode 100644 index 0000000000000000000000000000000000000000..b9d908c4acc0117dbac44ffbcd52f880a3c48ed5 GIT binary patch literal 1158 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 literal 0 HcmV?d00001 diff --git a/collects/redex/private/bmps/unix-reduction-relation.png b/collects/redex/private/bmps/unix-reduction-relation.png new file mode 100644 index 0000000000000000000000000000000000000000..d2196e527cf0deb34f2c0ac4abebf33bd96d756a GIT binary patch literal 1956 zcmV;V2V3}wP)k?gBetft?wGce{5p+kAc5=O6Dme$ROx&-3^^ z?jA9O5QGRMocW%>|DRBa15T*K0Vh=AfDns=+TUf49Z0_5kj|b-xdf2R;$%(3YxyBr$;On1As!I zKnUgL<_ZJ?l}d#WG8hbDVPP{fGhXu;3{K_%>+Tz*47dP;dz>S>XVX^va+(yo;_PrQ?qK-s;sOm z(!XfYB2rJwV6)lw@87T0YRT;%6%`c|6Vun%#}WbnGMVh<%a`PHYisM;wQJ+z;@Cs5 zKtc^c8&9j#Dn02>=%^TsV31GltyLa#QIZA+FuP*=qLa4mFT&Yx2d*0m~9UaAS zd}L&VG!+U(VPPTdcZ3#hu~@ck+h(;|34(}^kKem@FZHbl4;}~vf*(JA&@$Y;dl$#? z(a}+a(6?{j($dn%tCA&zBsn=bEG+EFlPB&@_K-gd_;L6ELg>Yd7ZDK=4u^wuxtk>= zCGNL&OG^u%&;R`SvwI46{h2doVq;_DCMx&uQ*+c#y)E@OABfsp~v*+BobCj26`otgo#KeR| zA{iSS^FM8HLVg>6>WionI~)$RTCLaXy_!Dpsdu?t85tSf-Q9jB3|dGK_}4mo`t*s# z^a+dJ<#JgpmRV&BPDl{&bsL75Goe@V0Vh=AfDKBdN~PpOM@PpzPB$|%GbJSj!!WsAPCj&Xbe4$*Ck&)fq-D}pYVF~N) z?Tw3z!!S&#R04ontriM}>FMcAdYw)u5{Z^BT}r+Z>+0%CNJx-KBwk-YQ*?E8sZ^@; z^mLg_rqya^`?LL5KnNW;Z~((FwOW1S#toCn^EiGNKVueg5yLt1b&$VId9x=hx2l5I_t7*Z30|1A^(P%UpjmG724Gaui zzka=-pddUveEat8?7?MaWeSC2-MV#Gu3Ygs64eLd^Z8X(Rh^xkEMltFbnV(T(nGbH z794nAU*F}+mm3-y0D!~c$mMdmT>jz1hvw#HpC$I%Jz|2X59Ae=R?~umBNPf78yg1) z2i?7PyPfRgvcS|mVuGm;kbEiTeohVK7G2fveINSg@=dB<#N4VpPZb` zv?`UAl{%e{$K%=U_J)QAyWL)2U;p#x&$_z0*RNl%U%#Hu=X(v5$z)QgG&MDq@-XSu zYPD9Y&CJYU_ z|I#WFi3o!D{{6d1B&w*WVA@baLqkTRap%sRey;9p^#G8WnQ66J&1Q2 . 0)) @@ -60,7 +67,8 @@ #,quoted?)] [x (and (identifier? #'x) - (term-fn? (syntax-local-value #'x (λ () #f)))) + (or (term-fn? (syntax-local-value #'x (λ () #f))) + ((is-term-fn?) #'x))) #`(make-lw '#,(syntax-e #'x) #,(syntax-line stx) @@ -86,11 +94,5 @@ #,(syntax-column stx) #,quoted?)])) -(define (to-lw/proc stx) - (syntax-case stx () - [(_ stx) - #`(add-spans #,(process-arg #'stx 1))])) -(define (to-lw/uq/proc stx) - (syntax-case stx () - [(_ stx) - #`(add-spans #,(process-arg #'stx 0))])) \ No newline at end of file +(define (to-lw/proc stx) #`(add-spans #,(process-arg stx 1))) +(define (to-lw/uq/proc stx) #`(add-spans #,(process-arg stx 0))) \ No newline at end of file diff --git a/collects/redex/private/loc-wrapper.ss b/collects/redex/private/loc-wrapper.ss index 666f3d8afa..ac409abe47 100644 --- a/collects/redex/private/loc-wrapper.ss +++ b/collects/redex/private/loc-wrapper.ss @@ -5,8 +5,14 @@ (for-syntax "loc-wrapper-ct.ss") "loc-wrapper-rt.ss") -(define-syntax (to-lw stx) (to-lw/proc stx)) -(define-syntax (to-lw/uq stx) (to-lw/uq/proc stx)) +(define-syntax (to-lw stx) + (syntax-case stx () + [(_ stx) + (to-lw/proc #'stx)])) +(define-syntax (to-lw/uq stx) + (syntax-case stx () + [(_ stx) + (to-lw/uq/proc #'stx)])) (define pnum (and/c number? (or/c zero? positive?))) diff --git a/collects/redex/private/pict.ss b/collects/redex/private/pict.ss index ba4c88a0a3..c58a780d2d 100644 --- a/collects/redex/private/pict.ss +++ b/collects/redex/private/pict.ss @@ -768,18 +768,20 @@ ltl-superimpose ltl-superimpose sep sep)] [(up-down up-down/vertical-side-conditions) - (apply vl-append - sep - (apply append - (map (lambda (lhs sc rhs) - (cons - (vl-append (hbl-append lhs =-pict) rhs) - (if (not sc) - null - (list (inset sc 0 0 (- 5 (pict-width sc)) 0))))) - lhss - scs - rhss)))]))) + (panorama + ;; the side-conditions may hang outside the pict, so bring them back w/ panorama + (apply vl-append + sep + (apply append + (map (lambda (lhs sc rhs) + (cons + (vl-append (hbl-append lhs =-pict) rhs) + (if (not sc) + null + (list (inset sc 0 0 (- 5 (pict-width sc)) 0))))) + lhss + scs + rhss))))]))) (define (metafunction-call name an-lw flattened?) (if flattened? diff --git a/collects/redex/private/reduction-semantics.ss b/collects/redex/private/reduction-semantics.ss index cddc9c5795..f3da8a5bf6 100644 --- a/collects/redex/private/reduction-semantics.ss +++ b/collects/redex/private/reduction-semantics.ss @@ -10,6 +10,7 @@ (lib "etc.ss")) (require (for-syntax (lib "name.ss" "syntax") + "loc-wrapper-ct.ss" "rewrite-side-conditions.ss" "term-fn.ss" "underscore-allowed.ss" @@ -20,32 +21,7 @@ (define (language-nts lang) (hash-map (compiled-lang-ht lang) (λ (x y) x))) -#; (define-for-syntax (prune-syntax stx) - (datum->syntax - (identifier-prune-lexical-context #'whatever '()) - (let loop ([stx stx]) - (syntax-case stx (quote) - [(quote x) (list (quote-syntax/prune quote) - (syntax->datum #'x))] - [x - (cond - [(identifier? stx) (identifier-prune-lexical-context stx)] - [(syntax? stx) - (datum->syntax (identifier-prune-lexical-context - #'whatever - '(#%app)) - (syntax-e stx) - stx)] - [(pair? stx) - (cons (loop (car stx)) - (loop (cdr stx)))] - [else stx])])))) - -(define-for-syntax (prune-syntax stx) - stx - - #; (datum->syntax (identifier-prune-lexical-context #'whatever '(#%app #%datum)) (let loop ([stx stx]) @@ -449,20 +425,26 @@ [((tl-id . tl-pat) ...) (extract-term-let-binds #'rhs)]) #`(make-rule-pict 'arrow - (to-lw lhs) - (to-lw rhs) + #,(to-lw/proc #'lhs) + #,(to-lw/proc #'rhs) #,label - (list (to-lw/uq scs) ...) - (list (to-lw fvars) ...) - (list (cons (to-lw bind-id) - (to-lw bind-pat)) - ... - (cons (to-lw tl-id) - (to-lw/uq tl-pat)) - ... - (cons (to-lw where-id) - (to-lw where-expr)) - ...))))])) + (list #,@(map to-lw/uq/proc (syntax->list #'(scs ...)))) + (list #,@(map to-lw/proc (syntax->list #'(fvars ...)))) + (list #,@(map (λ (bind-id bind-pat) + #`(cons #,(to-lw/proc bind-id) + #,(to-lw/proc bind-pat))) + (syntax->list #'(bind-id ...)) + (syntax->list #'(bind-pat ...))) + #,@(map (λ (tl-id tl-pat) + #`(cons #,(to-lw/proc tl-id) + #,(to-lw/uq/proc tl-pat))) + (syntax->list #'(tl-id ...)) + (syntax->list #'(tl-pat ...))) + #,@(map (λ (where-id where-expr) + #`(cons #,(to-lw/proc where-id) + #,(to-lw/proc where-expr))) + (syntax->list #'(where-id ...)) + (syntax->list #'(where-expr ...)))))))])) (define (reduction-relation/helper stx orig-name orig-red-expr lang-id rules shortcuts lws @@ -1030,141 +1012,138 @@ (with-syntax ([(((original-names lhs-clauses ...) rhs stuff ...) ...) pats] [(lhs-for-lw ...) (with-syntax ([((lhs-for-lw _ _ ...) ...) pats]) - (map (λ (x) (datum->syntax #f (cdr (syntax-e x)) x)) + (map (λ (x) (to-lw/proc (datum->syntax #f (cdr (syntax-e x)) x))) (syntax->list #'(lhs-for-lw ...))))]) - (with-syntax ([(lhs ...) #'((lhs-clauses ...) ...)] - [name (let loop ([name (if contract-name - contract-name - (car (syntax->list #'(original-names ...))))] - [names (if contract-name - (syntax->list #'(original-names ...)) - (cdr (syntax->list #'(original-names ...))))]) - (cond - [(null? names) name] - [else - (unless (eq? (syntax-e name) (syntax-e (car names))) - (raise - (make-exn:fail:syntax - (if contract-name - "define-metafunction: expected each clause and the contract to use the same name" - "define-metafunction: expected each clause to use the same name") - (current-continuation-marks) - (list name - (car names))))) - (loop name (cdr names))]))]) - - (with-syntax ([(((tl-side-conds ...) ...) - (tl-bindings ...) - (tl-side-cond/binds ...)) - (parse-extras #'((stuff ...) ...))]) - (let ([lang-nts (language-id-nts #'lang 'define-metafunction)]) - (with-syntax ([(tl-withs ...) (map (λ (sc/b) (bind-withs syn-error-name '() sc/b #t)) - (syntax->list #'(tl-side-cond/binds ...)))]) - (with-syntax ([(side-conditions-rewritten ...) - (map (λ (x) (rewrite-side-conditions/check-errs - lang-nts - 'define-metafunction - #t - x)) - (syntax->list (syntax ((side-condition lhs tl-withs) ...))))] - [dom-side-conditions-rewritten - (and dom-ctcs - (rewrite-side-conditions/check-errs - lang-nts - 'define-metafunction - #f - dom-ctcs))] - [codom-side-conditions-rewritten - (rewrite-side-conditions/check-errs - lang-nts - 'define-metafunction - #f - codom-contract)] - [(rhs-fns ...) - (map (λ (lhs rhs bindings) - (let-values ([(names names/ellipses) (extract-names lang-nts 'define-metafunction #t lhs)]) - (with-syntax ([(names ...) names] - [(names/ellipses ...) names/ellipses] - [rhs rhs] - [((tl-var tl-exp) ...) bindings]) - (syntax - (λ (name bindings) - (term-let-fn ((name name)) - (term-let ([names/ellipses (lookup-binding bindings 'names)] ...) - (term-let ([tl-var (term tl-exp)] ...) - (term rhs))))))))) - (syntax->list (syntax (lhs ...))) - (syntax->list (syntax (rhs ...))) - (syntax->list (syntax (tl-bindings ...))))] - [(name2 name-predicate) (generate-temporaries (syntax (name name)))] - [((side-cond ...) ...) - ;; For generating a pict, separate out side conditions wrapping the LHS and at the top-level - (map (lambda (lhs scs) - (append - (let loop ([lhs lhs]) - (syntax-case lhs (side-condition term) - [(side-condition pat (term sc)) - (cons #'sc (loop #'pat))] - [_else null])) - scs)) - (syntax->list #'(lhs ...)) - (syntax->list #'((tl-side-conds ...) ...)))] - [(((bind-id . bind-pat) ...) ...) - ;; Also for pict, extract pattern bindings - (map extract-pattern-binds (syntax->list #'(lhs ...)))] - [(((rhs-bind-id . rhs-bind-pat) ...) ...) - ;; Also for pict, extract pattern bindings - (map extract-term-let-binds (syntax->list #'(rhs ...)))] - [(((where-id where-pat) ...) ...) - ;; Also for pict, extract where bindings - #'(tl-bindings ...)]) - (syntax-property - #`(begin - (define-values (name2 name-predicate) - (let ([sc `(side-conditions-rewritten ...)] - [dsc `dom-side-conditions-rewritten]) - (build-metafunction - lang - sc - (list rhs-fns ...) - #,(if prev-metafunction - (let ([term-fn (syntax-local-value prev-metafunction)]) - #`(metafunc-proc-cps #,(term-fn-get-id term-fn))) - #''()) - #,(if prev-metafunction - (let ([term-fn (syntax-local-value prev-metafunction)]) - #`(metafunc-proc-rhss #,(term-fn-get-id term-fn))) - #''()) - (λ (f/dom cps rhss) - (make-metafunc-proc - (let ([name (lambda (x) (f/dom x))]) name) - (list (list (to-lw lhs-for-lw) - (list (to-lw/uq side-cond) ...) - (list (cons (to-lw bind-id) - (to-lw bind-pat)) - ... - (cons (to-lw rhs-bind-id) - (to-lw/uq rhs-bind-pat)) - ... - (cons (to-lw where-id) - (to-lw where-pat)) - ...) - (to-lw rhs)) - ...) - lang - #t ;; multi-args? - 'name - cps - rhss - (let ([name (lambda (x) (name-predicate x))]) name) - dsc - sc)) - dsc - `codom-side-conditions-rewritten - 'name))) - (term-define-fn name name2)) - 'disappeared-use - (map syntax-local-introduce (syntax->list #'(original-names ...)))))))))))))] + (parameterize ([is-term-fn? + (let ([names (syntax->list #'(original-names ...))]) + (λ (x) (and (not (null? names)) + (identifier? (car names)) + (free-identifier=? x (car names)))))]) + (with-syntax ([(rhs/lw ...) (map to-lw/proc (syntax->list #'(rhs ...)))] + [(lhs ...) #'((lhs-clauses ...) ...)] + [name (let loop ([name (if contract-name + contract-name + (car (syntax->list #'(original-names ...))))] + [names (if contract-name + (syntax->list #'(original-names ...)) + (cdr (syntax->list #'(original-names ...))))]) + (cond + [(null? names) name] + [else + (unless (eq? (syntax-e name) (syntax-e (car names))) + (raise + (make-exn:fail:syntax + (if contract-name + "define-metafunction: expected each clause and the contract to use the same name" + "define-metafunction: expected each clause to use the same name") + (current-continuation-marks) + (list name + (car names))))) + (loop name (cdr names))]))]) + + (with-syntax ([(((tl-side-conds ...) ...) + (tl-bindings ...) + (tl-side-cond/binds ...)) + (parse-extras #'((stuff ...) ...))]) + (let ([lang-nts (language-id-nts #'lang 'define-metafunction)]) + (with-syntax ([(tl-withs ...) (map (λ (sc/b) (bind-withs syn-error-name '() sc/b #t)) + (syntax->list #'(tl-side-cond/binds ...)))]) + (with-syntax ([(side-conditions-rewritten ...) + (map (λ (x) (rewrite-side-conditions/check-errs + lang-nts + 'define-metafunction + #t + x)) + (syntax->list (syntax ((side-condition lhs tl-withs) ...))))] + [dom-side-conditions-rewritten + (and dom-ctcs + (rewrite-side-conditions/check-errs + lang-nts + 'define-metafunction + #f + dom-ctcs))] + [codom-side-conditions-rewritten + (rewrite-side-conditions/check-errs + lang-nts + 'define-metafunction + #f + codom-contract)] + [(rhs-fns ...) + (map (λ (lhs rhs bindings) + (let-values ([(names names/ellipses) (extract-names lang-nts 'define-metafunction #t lhs)]) + (with-syntax ([(names ...) names] + [(names/ellipses ...) names/ellipses] + [rhs rhs] + [((tl-var tl-exp) ...) bindings]) + (syntax + (λ (name bindings) + (term-let-fn ((name name)) + (term-let ([names/ellipses (lookup-binding bindings 'names)] ...) + (term-let ([tl-var (term tl-exp)] ...) + (term rhs))))))))) + (syntax->list (syntax (lhs ...))) + (syntax->list (syntax (rhs ...))) + (syntax->list (syntax (tl-bindings ...))))] + [(name2 name-predicate) (generate-temporaries (syntax (name name)))] + [((side-cond/lw/uq ...) ...) + (map (lambda (scs) (map to-lw/uq/proc (syntax->list scs))) + (syntax->list #'((tl-side-conds ...) ...)))] + [(((bind-id/lw . bind-pat/lw) ...) ...) + ;; Also for pict, extract pattern bindings + (map (λ (x) (map (λ (x) (cons (to-lw/proc (car x)) (to-lw/proc (cdr x)))) + (extract-pattern-binds x))) + (syntax->list #'(lhs ...)))] + [(((rhs-bind-id/lw . rhs-bind-pat/lw/uq) ...) ...) + ;; Also for pict, extract pattern bindings + (map (λ (x) (map (λ (x) (cons (to-lw/proc (car x)) (to-lw/uq/proc (cdr x)))) + (extract-term-let-binds x))) + (syntax->list #'(rhs ...)))] + [(((where-id/lw where-pat/lw) ...) ...) + ;; Also for pict, extract where bindings + (map (λ (lst) (map (λ (ab) (map to-lw/proc (syntax->list ab))) + (syntax->list lst))) + (syntax->list #'(tl-bindings ...)))]) + (syntax-property + #`(begin + (define-values (name2 name-predicate) + (let ([sc `(side-conditions-rewritten ...)] + [dsc `dom-side-conditions-rewritten]) + (build-metafunction + lang + sc + (list rhs-fns ...) + #,(if prev-metafunction + (let ([term-fn (syntax-local-value prev-metafunction)]) + #`(metafunc-proc-cps #,(term-fn-get-id term-fn))) + #''()) + #,(if prev-metafunction + (let ([term-fn (syntax-local-value prev-metafunction)]) + #`(metafunc-proc-rhss #,(term-fn-get-id term-fn))) + #''()) + (λ (f/dom cps rhss) + (make-metafunc-proc + (let ([name (lambda (x) (f/dom x))]) name) + (list (list lhs-for-lw + (list side-cond/lw/uq ...) + (list (cons bind-id/lw bind-pat/lw) ... + (cons rhs-bind-id/lw rhs-bind-pat/lw/uq) ... + (cons where-id/lw where-pat/lw) ...) + rhs/lw) + ...) + lang + #t ;; multi-args? + 'name + cps + rhss + (let ([name (lambda (x) (name-predicate x))]) name) + dsc + sc)) + dsc + `codom-side-conditions-rewritten + 'name))) + (term-define-fn name name2)) + 'disappeared-use + (map syntax-local-introduce (syntax->list #'(original-names ...))))))))))))))] [(_ prev-metafunction name lang clauses ...) (begin (unless (identifier? #'name) @@ -1403,134 +1382,137 @@ (identifier? (syntax name)) (begin (check-rhss-not-empty stx (cddr (syntax->list stx))) - (prune-syntax - (with-syntax ([((nt-names orig) ...) (pull-out-names 'define-language stx #'(names ...))]) - (with-syntax ([(subst-names ...) (generate-temporaries (syntax->list #'(nt-names ...)))]) - (syntax/loc stx - (begin - (define-syntax name - (make-set!-transformer - (make-language-id - (case-lambda - [(stx) - (syntax-case stx (set!) - [(set! x e) (raise-syntax-error 'define-language "cannot set! identifier" stx #'e)] - [(x e (... ...)) #'(define-language-name e (... ...))] - [x - (identifier? #'x) - #'define-language-name])]) - '(nt-names ...)))) - (define define-language-name (language name (names rhs ...) ...))))))))])) + (with-syntax ([((nt-names orig) ...) (pull-out-names 'define-language stx #'(names ...))]) + (with-syntax ([(subst-names ...) (generate-temporaries (syntax->list #'(nt-names ...)))]) + (syntax/loc stx + (begin + (define-syntax name + (make-set!-transformer + (make-language-id + (case-lambda + [(stx) + (syntax-case stx (set!) + [(set! x e) (raise-syntax-error 'define-language "cannot set! identifier" stx #'e)] + [(x e (... ...)) #'(define-language-name e (... ...))] + [x + (identifier? #'x) + #'define-language-name])]) + '(nt-names ...)))) + (define define-language-name (language name (names rhs ...) ...)))))))])) (define-struct binds (source binds)) (define-syntax (language stx) (syntax-case stx () [(_ lang-id (name rhs ...) ...) - (let () - - ;; verify `name' part has the right shape - (for-each - (λ (name) - (cond - [(identifier? name) (void)] - [else - (let ([lst (syntax->list name)]) - (cond - [(list? lst) - (when (null? lst) - (raise-syntax-error 'language - "expected a sequence of identifiers with at least one identifier" - stx - name)) - (for-each (λ (x) (unless (identifier? x) - (raise-syntax-error 'language - "expected an identifier" - stx - x))) - lst)] - [else - (raise-syntax-error 'language - "expected a sequence of identifiers" - stx - lst)]))])) - (syntax->list #'(name ...))) - (let ([all-names (apply append (map (λ (x) (if (identifier? x) (list x) (syntax->list x))) - (syntax->list #'(name ...))))]) - ;; verify the names are valid names - (for-each - (λ (name) - (let ([x (syntax->datum name)]) - (when (memq x '(any number string variable natural integer real variable-except variable-prefix hole name in-hole hide-hole side-condition cross ...)) - (raise-syntax-error 'language - (format "cannot use pattern language keyword ~a as non-terminal" - x) - stx - name)) - (when (regexp-match #rx"_" (symbol->string x)) - (raise-syntax-error 'language - "non-terminals cannot have _ in their names" - stx - name)))) - all-names) - - (with-syntax ([((r-rhs ...) ...) - (map (lambda (rhss) - (map (lambda (rhs) - (rewrite-side-conditions/check-errs - (map syntax-e all-names) - 'language - #f - rhs)) - (syntax->list rhss))) - (syntax->list (syntax ((rhs ...) ...))))] - [(refs ...) - (let loop ([stx (syntax ((rhs ...) ...))]) - (cond - [(identifier? stx) - (if (ormap (λ (x) (bound-identifier=? x stx)) - all-names) - (list stx) - '())] - [(syntax? stx) - (loop (syntax-e stx))] - [(pair? stx) - (append (loop (car stx)) - (loop (cdr stx)))] - [else '()]))]) - (with-syntax ([(the-stx ...) (cdr (syntax-e stx))] - [(all-names ...) all-names] - [((uniform-names ...) ...) - (map (λ (x) (if (identifier? x) (list x) x)) - (syntax->list (syntax (name ...))))] - [(first-names ...) - (map (λ (x) (if (identifier? x) x (car (syntax->list x)))) - (syntax->list (syntax (name ...))))] - [((new-name orig-name) ...) - (apply - append - (map (λ (name-stx) - (if (identifier? name-stx) - '() - (let ([l (syntax->list name-stx)]) - (map (λ (x) (list x (car l))) - (cdr l))))) - (syntax->list #'(name ...))))]) - - ;; note: when there are multiple names for a single non-terminal, - ;; we build equivalent non-terminals by redirecting all except the - ;; first non-terminal to the first one, and then make the first one - ;; actually have all of the productions. This should produce better - ;; caching behavior and should compile faster than duplicating the - ;; right-hand sides. - (syntax/loc stx - (begin - (let ([all-names 1] ...) - (begin (void) refs ...)) - (compile-language (list (list '(uniform-names ...) (to-lw rhs) ...) ...) - (list (make-nt 'first-names (list (make-rhs `r-rhs) ...)) ... - (make-nt 'new-name (list (make-rhs 'orig-name))) ...) - '((uniform-names ...) ...))))))))] + (prune-syntax + (let () + + ;; verify `name' part has the right shape + (for-each + (λ (name) + (cond + [(identifier? name) (void)] + [else + (let ([lst (syntax->list name)]) + (cond + [(list? lst) + (when (null? lst) + (raise-syntax-error 'language + "expected a sequence of identifiers with at least one identifier" + stx + name)) + (for-each (λ (x) (unless (identifier? x) + (raise-syntax-error 'language + "expected an identifier" + stx + x))) + lst)] + [else + (raise-syntax-error 'language + "expected a sequence of identifiers" + stx + lst)]))])) + (syntax->list #'(name ...))) + (let ([all-names (apply append (map (λ (x) (if (identifier? x) (list x) (syntax->list x))) + (syntax->list #'(name ...))))]) + ;; verify the names are valid names + (for-each + (λ (name) + (let ([x (syntax->datum name)]) + (when (memq x '(any number string variable natural integer real variable-except variable-prefix hole name in-hole hide-hole side-condition cross ...)) + (raise-syntax-error 'language + (format "cannot use pattern language keyword ~a as non-terminal" + x) + stx + name)) + (when (regexp-match #rx"_" (symbol->string x)) + (raise-syntax-error 'language + "non-terminals cannot have _ in their names" + stx + name)))) + all-names) + + (with-syntax ([((r-rhs ...) ...) + (map (lambda (rhss) + (map (lambda (rhs) + (rewrite-side-conditions/check-errs + (map syntax-e all-names) + 'language + #f + rhs)) + (syntax->list rhss))) + (syntax->list (syntax ((rhs ...) ...))))] + [((rhs/lw ...) ...) + (map (lambda (rhss) (map to-lw/proc (syntax->list rhss))) + (syntax->list (syntax ((rhs ...) ...))))] + [(refs ...) + (let loop ([stx (syntax ((rhs ...) ...))]) + (cond + [(identifier? stx) + (if (ormap (λ (x) (bound-identifier=? x stx)) + all-names) + (list stx) + '())] + [(syntax? stx) + (loop (syntax-e stx))] + [(pair? stx) + (append (loop (car stx)) + (loop (cdr stx)))] + [else '()]))]) + (with-syntax ([(the-stx ...) (cdr (syntax-e stx))] + [(all-names ...) all-names] + [((uniform-names ...) ...) + (map (λ (x) (if (identifier? x) (list x) x)) + (syntax->list (syntax (name ...))))] + [(first-names ...) + (map (λ (x) (if (identifier? x) x (car (syntax->list x)))) + (syntax->list (syntax (name ...))))] + [((new-name orig-name) ...) + (apply + append + (map (λ (name-stx) + (if (identifier? name-stx) + '() + (let ([l (syntax->list name-stx)]) + (map (λ (x) (list x (car l))) + (cdr l))))) + (syntax->list #'(name ...))))]) + + ;; note: when there are multiple names for a single non-terminal, + ;; we build equivalent non-terminals by redirecting all except the + ;; first non-terminal to the first one, and then make the first one + ;; actually have all of the productions. This should produce better + ;; caching behavior and should compile faster than duplicating the + ;; right-hand sides. + (syntax/loc stx + (begin + (let ([all-names 1] ...) + (begin (void) refs ...)) + (compile-language (list (list '(uniform-names ...) rhs/lw ...) ...) + (list (make-nt 'first-names (list (make-rhs `r-rhs) ...)) ... + (make-nt 'new-name (list (make-rhs 'orig-name))) ...) + '((uniform-names ...) ...)))))))))] [(_ (name rhs ...) ...) (for-each (lambda (name) @@ -1595,6 +1577,8 @@ x)) (syntax->list rhss))) (syntax->list (syntax ((rhs ...) ...))))] + [((rhs/lw ...) ...) (map (lambda (rhss) (map to-lw/proc (syntax->list rhss))) + (syntax->list (syntax ((rhs ...) ...))))] [(first-names ...) (map (λ (x) (if (identifier? x) x (car (syntax->list x)))) (syntax->list (syntax (name ...))))] @@ -1615,7 +1599,7 @@ (syntax/loc stx (do-extend-language lang (list (make-nt '(uniform-names ...) (list (make-rhs `r-rhs) ...)) ...) - (list (list '(uniform-names ...) (to-lw rhs) ...) ...))))] + (list (list '(uniform-names ...) rhs/lw ...) ...))))] [(_ lang (name rhs ...) ...) (begin (unless (identifier? #'lang)