}<$C{DQ#} g$ hƇ҇Շ  ,  DD@ vIh%<= 䛇( ,p A X X 5405894ff  d,4A4 '<  \ F@S@SQQ؅(䆅h&<+䆅ԅ$+r Յ Յ ą䊂؄ DDÅ<ۅM('\ޅh` \rDYALOG~ P#! 1#~ {~} ~ {not} ~ {less} ~ {without} ! {!} \ {\} | {|} | {abs} {residue} {stile} {mod} {magnitude} ' {'} ^ {and} ^ {^} ^ {lcm} ^ {*.} @ {@} @ {lamp} {comment} {capnull} {rem} {nb.} {u+235d} # {#} # {quad} {box} {u+25af} & {&}  &  {diamond}  {<>}  {u+25ca} { {leftbrace} { {(} { {from} } {rightbrace} } {)} {neg} {-} {negative} {highminus} {overbar} {_} {u+00af}  {<-}  {is}  {gets}  {assign}  {leftarrow}  {=.}  {=:}  {:=}  {u+2190}  {->}  {goto}  {go}  {branch}  {rightarrow}  {u+2192} {/=} {ne} {noteq} {notequal} {unequal} {nubsieve} {=/} {~=} {~:} {u+2260} {>=} {ge} {gteq} {greq} {notless} {<:} {u+2265} {<=} {le} {lteq} {notgreater} {>:} {u+2264} {or} {gcd} {+.} {u+2228} {nand} {~^} {*:} {u+2372} {nor} {+:} {u+2371} {signum} {times} {x} {sign} {*} {direction} {u+00d7} {divide} {reciprocal} {%} {u+00f7}  {ln}  {log}  {circlestar}  {^.}  {u+235f}  {gradeup}  {upgrade}  {deltastile}  {/:}  {u+234b}  {gradedown}  {downgrade}  {delstile}  {\:}  {u+2352} {ceiling} {max} {upstile} {greater} {>.} {u+2308} {floor} {min} {downstile} {lesser} {<.} {u+230a} {basevalue} {decode} {base} {downtack} {#.} {u+22a4} {represent} {encode} {top} {uptack} {#:} {u+22a5} {format} {topnull} {fmt} {thorn} {":} {u+2355} {execute} {do} {basenull} {eval} {".} {u+234e} {domino} {quaddivide} {%.} {u+2339} {quotequad} {u+235e} {pitimes} {circle} {o.} {u+25cb} {jot} {null} {u+2218} {slashbar} {compressbar} {reducebar} {/-} {u+233f} {backslashbar} {slopebar} {expandbar} {scanbar} {\-} {u+2340} {reverse} {rotate} {circlestile} {rev} {|.} {u+233d} {reversebar} {rotatebar} {circlebar} {u+2296} {transpose} {|:} {u+2349}  {first}  {take}  {uparrow}  {mix}  {u+2191}  {split}  {drop}  {downarrow}  {raze}  {u+2193} {alpha} {u+237a} {enlist} {epsilon} {memberof} {membership} {in} {member} {e.} {u+2208} {iota} {indexof} {i.} {u+2373} {rho} {shape} {reshape} {$} {u+2374}  {omega}  {u+2375}  {each}  {dieresis}  {with}  {u+00a8}  {righttack}  {lev}  {stop}  {[}  {u+22a2}  {lefttack}  {dex}  {pass}  {]}  {u+22a3}  {disclose}  {pick}  {superset}  {rightshoe}  {weakenclose}  {link}  {>}  {u+2283} {enclose} {subset} {leftshoe} {<} {u+2282} {upshoe} {intersection} {cap} {u+2229} {downshoe} {union} {cup} {u+222a} {del} {u+2207} {delta} {u+2206} {delta_} {deltaunderscore} {deltaunderbar} {u+2359}  {deltilde}  {u+236b}  {ibeam}  {u+2336} {commabar} {catbar} {,-} {table} {u+236a} {jotdieresis} {on} {rank} {cut} {"} {paw} {u+2364} {circledieresis} {hoof} {upon} {u+2365} {depth} {match} {equalunderscore} {equalunderbar} {equal_} {=_} {-:} {u+2261}  {notmatch}  {~=_}  {u+2262}  {zilde}  {0~}  {u+236c} {squad} {squishquad} {index} {u+2337}  {find}  {epsilon_}  {epsilonunderscore} {epsilonunderbar}  {u+2377}  {iota_}  {iotaunderscore}  {iotaunderbar}  {u+2378} {tildedieresis} {u+2368} {pounds} {u+00a3} {cent} {leftshoestile} {cents} {u+00a2} {yen} {u+00a5} {uptackdieresis} {encodedieresis} {u+2361} {deldieresis} {u+2362} {stardieresis} {u+2363}  {quadjot}  {u+233b}  {quadbackslash}  {quadslope}  {u+2342} {u+0000}  {u+263a}  {u+0007}  {u+0008} {u+0009} {u+000a} {u+000c}  {u+00f9}  {u+001b}  {u+007f} {u+00c7} {u+00fc} {u+00e9} {u+00e2} {u+00e4} {u+00e0} {u+00e7} {u+00ea} {u+00eb} {u+00e8} {u+00ef} {u+00ee} {u+00c4} {u+00c9} {u+00f4} {u+00f6} {u+00fb} {u+00d6} {u+00dc} {u+00e1} {u+00ed} {u+00f3} {u+00fa} {u+00f1} {u+00d1} {u+00bf} {u+00a1} {u+00ab} {u+00bb} {u+2591} {u+2592} {u+2593} {u+2502} {u+2524} {u+2561} {u+2562} {u+2556} {u+2555} {u+2563} {u+2551} {u+2557} {u+255d} {u+255c} {u+255b} {u+2510} {u+2514} {u+2534} {u+252c} {u+251c} {u+2500} {u+253c} {u+255e} {u+255f} {u+255a} {u+2554} {u+2569} {u+2566} {u+2560} {u+2550} {u+256c} {u+2567} {u+2568} {u+2564} {u+2565} {u+2559} {u+2558} {u+2552} {u+2553} {u+256b} {u+256a} {u+2518} {u+250c} {u+2588} {u+2584} {u+258c} {u+2590} {u+2580} {u+00df} {u+201e} {u+00a0} P#$   // $ F'   ,  t f | {|} | @ {@} @ # {#} # & {&}  & { {leftbrace} } {rightbrace} {neg}  {<-}  {->} {/=} {>=} {<=} {or} {nand} {nor} {signum} {times} {divide}  {ln}  {log}  {gradeup}  {gradedown} {ceiling} {max} {floor} {min} {basevalue} {represent} {format} {execute} {domino} {quotequad} {pitimes} {circle} {jot} {slashbar} {backslashbar} {reverse} {rotate} {reversebar} {rotatebar} {transpose}  {first}  {take}  {split}  {drop} {alpha} {enlist} {epsilon} {iota} {rho}  {omega}  {each}  {righttack}  {lefttack}  {disclose}  {pick} {enclose} {upshoe} {downshoe} {del} {delta} {delta_}  {deltilde}  {ibeam} {commabar} {jotdieresis} {circledieresis} {depth} {match}  {notmatch}  {zilde} {squad}  {find}  {iota_} {tildedieresis} {pounds} {cent} {yen} {uptackdieresis} {deldieresis} {stardieresis}  {quadjot}  {quadbackslash} {U+0000}  {U+263A}  {U+0007}  {U+0008} {U+0009} {U+000A} {U+000C}  {U+00F9}  {U+001B}  {U+007F} {U+00C7} {U+00FC} {U+00E9} {U+00E2} {U+00E4} {U+00E0} {U+00E7} {U+00EA} {U+00EB} {U+00E8} {U+00EF} {U+00EE} {U+00C4} {U+00C9} {U+00F4} {U+00F6} {U+00FB} {U+00D6} {U+00DC} {U+00E1} {U+00ED} {U+00F3} {U+00FA} {U+00F1} {U+00D1} {U+00BF} {U+00A1} {U+00AB} {U+00BB} {U+2591} {U+2592} {U+2593} {U+2502} {U+2524} {U+2561} {U+2562} {U+2556} {U+2555} {U+2563} {U+2551} {U+2557} {U+255D} {U+255C} {U+255B} {U+2510} {U+2514} {U+2534} {U+252C} {U+251C} {U+2500} {U+253C} {U+255E} {U+255F} {U+255A} {U+2554} {U+2569} {U+2566} {U+2560} {U+2550} {U+256C} {U+2567} {U+2568} {U+2564} {U+2565} {U+2559} {U+2558} {U+2552} {U+2553} {U+256B} {U+256A} {U+2518} {U+250C} {U+2588} {U+2584} {U+258C} {U+2590} {U+2580} {U+00DF} {U+201E} {U+00A0} L fF0 (ܜ,.00M D,.0, p ,.6 ,$   , $0 t@,. 00 <P,.^}0 X[\]^_` !t f Z A B T <!! !"#$%&'()*+,-./0123456789:;<=>?@ C}<3 61'Installed transliteration workspace, version 1.4 (1995.10.15)For instructions, see DESCRIBE in the APLASCII workspace. '  y[H f0   ܣ06 / 00ua u  h6 / 0|} \ f& fȵIPSALx44ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzL0si o  L6 / {04 { _"  ģ|6   {4K f f ; T fȵ f_@H5 6 ̥؝6 䥇6 ,+ /quH APL68K~ ,! ئ , / ,$+'D ( ,  , , ,  {residue} D4 # , ,,   4 f" fD0 /  , ,/,, "D4 0$  `, /4((  " ( f  D *  ,  , ,+ / LD0o 4,.0ZD ' p"8@   )Å>DD0 7' L"8@  0142144147148DD16 1' X"8@  8118218318418D4abcdefghijklmnopqrstuvwxyz} 4 fdescri f@ U APLPLUS ̠A,Z A4ABCDEFGHIJKLMNOPQRSTUVWXYZui4< fD . ",8@   ɅD f6$(HI K c(IPSA(P ̛ (t{}~ fAPLP f TZ A B  { hDYALOG   TDYALOGS $$;LZ B| fZ A8 f55(@A C    Z[(,   ,$+D 1 \6 Բg6 , D f `VTOMOBJC`RJUSTOBJh OVEROBJC TOUPPEROBJCB DLBOBJCh MTOVOBJCDTBOBJCIPSAD11 2' "8@   1961971981992D fDLTBOBJCh LJUSTOBJ MATIOTAOBJC @ APLASCII.APLPLUS2 version 1.4 (1995.10.15)@L`) Copyright (c) 1994 Jim Weigang. All rights reserved.L8 (B''(STPTR'Z B')CALL VTOMOBJ)08`?Q#\\p ` ZTCNL   @ APLASCII.APLPLUS2 version 1.4 (1995.10.15)@, Carriage return (newline),  ZTC[IO+1] @ APLASCII.APLPLUS2 version 1.4 (1995.10.15)@t# ZLJUST AMTOVX ERROR(5 7 8A)'RANK ERROR' 'VALUE ERROR' 'WS FULL' 'DOMAIN ERROR'X$|( ZA MATIOTA B;TRC$L) Use an APL version for mixed types, Booleans, or nested:L8 (A''(STPTR'Z A')CALL DTBOBJ)08`?Q#dĮPD|$`t# ZDLTB A, S0 1SB(21 1,B)B,@ APLASCII.APLPLUS2 version 1.4 (1995.10.15)@t# ZDTB A ( ZA MTOV B TCNL@ APLASCII.APLPLUS2 version 1.4 (1995.10.15)@`?Q#ܬ첇p䮇`DTBT# Deletes leading and trailing blank columns in vector or matrix CT  RC @ Copyright (c) 1988, '92, '94 by Jim Weigang@?Q#0 LP0 p OVER   @ APLASCII.APLPLUS2 version 1.4 (1995.10.15)@< Copyright (c) 1988, 1994 by Jim Weigang <XA2T ERROR(1 2 3B)'WS FULL' 'LENGTH ERROR' 'RANK ERROR' 'DOMAIN ERROR'RTX  P @MAC APLASCII.APLPLUS2 version 1.4 (1995.10.15)TF@DIT Copyright (c) 1988, 1989, 1994 by Jim Weigang DXUMS ERROR(1 2 3T)'RANK ERROR' 'WS FULL' 'SYNTAX ERROR' 'DOMAIN ERROR'L XXOAW ERROR(5 7 8A)'RANK ERROR' 'VALUE ERROR' 'WS FULL' 'DOMAIN ERROR'IPTX8PL (A''(STPTR'Z A')CALL DLTBOBJ)08LJUSTPMATIOTA< Copyright (c) 1992, 1994 by Jim Weigang<<+&   $  $  ZA OVER B;S H Deletes trailing blank columns in vector or matrix AHL`) Converts delimited vector  to matrix. Delimiter is 1.LDLTBh&' +' / INSTALL    6        3 ` P  OP M 8#:&925<@7A`,  L ,,   ,4 $   O  44 " M 4(  (l Z TWYZ[\]^_`acefgh'i.j0k6l8m;nBoJpNqPl TVWXYZ[\]^_`abcdef g"h-iKjPkUlZmengompnqqrusvt{uvwxyz{H 6  OKP>L?2HL < K>L M/L fH X @ ( x`췇H,''XNUMS @  APLASCII.APLPLUS2 version 1.4 (1995.10.15)at@<ontL3:ERR'' indicate success If<4plt ZFI A the numbers4Dk o (0VI A)/0 quit if any numbers are badD4p o ERR'contains invalid numbers'>N+4T  A0 EJCASE A convert E/J in numbers to primary alphabet Taxt< @هD  ܇$ ,|  \  万 h X Arguments: D form (matrix or vector) as the argument.DT Z - text with no line wider than W[1] columns. Has the sameTX W[2] - optional indent used for continuation lines. The defaultX@ W[1] - maximum width for an output line.@HÇ ÇćLÇ X ‡`pÇd‡‡\‡@LĿ|4 !̾"#@$%&P'(ش)*H+,-@./0D124345x68H4 ERR'contains complex numbers'4$A WITHTTM TTABM$H (~C[T])/L5 If max would split a name,HLL4:TW-2 max that can be put on this lineL M0 0''H CC^'{'1L,' ' zero out chars to left of {HH C(LV)\L'{}' 1s mark words and {phrases}HT Form C, in which 0s mark chars that can be the last on a line:T4 LDTB Z[J[I];] the line4PL3:(0=II-1)/L6 Loop for each long line, last to firstP I1+''JDL2:JJ/J((0,W)Z).' ' indices of long linesDD ZVTOM TCNL,Z convert vector to matrixD (R=2)/L2\ V'}{0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_'\\ V is all the characters considered 'letters' (may be part of a name):\PL1:H20W-N+1 num chars to look back for cut pointP< 0 exit without result<< N0(W,0)[2] continuation indent< RZA\8ZWSID$ is zero.$<;JK Executes statement with TTABX set to < X (W>N+4)/L1 PTA A - text whose long lines should be wrapped. May be aAP<LACZW WRAPLNS A;C;H;I;J;L;M;N;R;S;T;V;IO I<L character matrix or newline-delimited vector. tLLAWITHTTX@rs[ APLASCII.APLPLUS2 version 1.4 (1995.10.15)ni@@g.{ R[;2]S[J;B/I] insert appropriate lettera@<d e JS[;1]'A' row holding uppercaseK<<epa R((+/B),4)'{A_}' replacement prototypet<T(A Z[M]V insert 3 blanks to left of 3rd case letters3] T<  0 Else, transliterate (c<Pm e A/L1 If user doesn't want to preserve 3rd case,PDet`L8$p\H0<(T@,|h !|`D00l8g&x  ߈߈<l߈8߈$߈߈4ވވވ9ވ:ވ;ވ>Hވ# \/FBJEG@p0ˈ(t`L8$S$*6OdK2+-p\H4 p qrHVLTوdm [|(%?UP8tГ 쓈zhT$쎈ot|)Ȅ_,q{x5x|$x|qvHlm84l3q4k~gke]ZV8S'hKBkk@T:I>pE TF=VTXX13W(6hC]0n ,h.!X v u"(! x@ Ih L`< hLp Hއ݇ڇههׇ$هl`lhć仇 0 P乇䳇X|LLJd8#d$#weੇܧ8cĨh[Pਇ%0NX0t1hdDTP A[I;]T[I;] left-justify continuation linesolTTth II(TOLOWER((1T),8)T)^.='{cont''d}' and the {cont'd} ones tTTh, I(((1T),2)T)^.='+}' find +} style continuation linestT܈ HReu Restores long wrapped lines in CR-delimited vector /HD@V JS[S[;1]'A';]A[I-1] look up the letters11DT), I((A[I-2]='{')^A[I+1]='}')/I those that are part of {*_} phraseTL  I((3I)^I1+A)/I exclude those too close to either endL15  F܇ ׇ<ׇև< ܇ Dڇ D \0>ZA USLTOASC V;B;I;J;M;R;S;W08 IS[3;]V lookup in 3rd case8USLTOAPL@bUSLTOASC$  $$M Z(1M+\W)' 'a$$A WITHTTX TTABX$101UNWRAPLNS |d PW2PW,999999 \ A long line may be indicated in two ways: Either {+ at the\4M B(A)1@ APLASCII.APLPLUS2 version 1.4 (1995.10.15)@H ERROR(7 8T)'VALUE ERROR' 'WS FULL' 'DOMAIN ERROR'H`d8ڇ߇`ڇp `8 Copyright (c) 1994-95 Jim WeigangTr8era B(A)1 tPin I((2PW[1]+20XhpZ ,ه x ݇ x tP83$1hއd\ ݇ އX4p Copyright (c) 1994 Jim Weigang4$ AVTOM TCNL,A2$TELPRINT$ (PW[2](W)N)/0$( YD0 2(,X.C)/Y($ X/S(/SN,R)W$\L2:N1(W)(2+1PW)C1/W min number of "supercolumns" that will fit\@ APLASCII.APLPLUS2 version 1.4 (1995.10.15)@TCNLSRCWDPm (3>1S)/0 no change if only 2 alphabetsD\xV (~1(Z='{')^(1Z)'+cC')/0 return arg unchanged if no continuations\T any necessary spaces must be included in the text to the leftTT are added when either of these continuation marks is removed;T<II386P23"d$Ef]EEffEfEfPX.xPXu$&mfPX.xPXu$&rLl$}u>}mfPX.pPXu$&sf=l$3G}"3}u A }uÍ}cau ]"Mת+"\8<T S end of the line, followed by +} on the next line, or by {cont'd}T <ZTOLOWER Z;T 8 Y(R,CN)2 1 3(N,R,C)((NR),C)M8P If D=0, converts names to the primary alphabet (ALPHS[1;])PP Wraps matrix  in multiple columns across the pagehe case of P W(RN)Wt D0 01,tTCLFrcDPm Translates uppercase letters to lowercase in ERD`NS Returns a linefeed character (which may be the same as TCNL on some APLs)S `Lh݇0L(X\ZUNWRAPLNS A;B;I;T@V@(<PLS (T''(1,STPTR'Z')CALL TOUPPEROBJ)0<(LEZUSLTOAPL A;B;I;J;K;S(,d U+/X2/S(/SN,R)WNT ,$UPEL1:W2++/\M' 'US$POAC D0 3 amount to drop from wrapped result below P  w ZZ OVER YT 8XY M is a character or numeric matrix8L A[1;] is what we look for; A[2;] is what we change it toLD Z[J]A[2;A[1;]Z[J]] convert to lowercasenDQVARSP ZVTOM B Lp Z is a character matrix not more than PW[1] columns wideLHVTM PW[1] is the page width, PW[2] is the page length H\\386P23@d$2fD$f\$EEEEffEfEfE0fPX.xPXuT$DfPX.xPXuT$Dl$2}u}+E<wx+B<tT$U6fEfE>fEfEfPX.LPXuT$Dr>fE>fEEEfPX.PXuT$Dr}t_ %H} M U6l$ +l$$\$$|$ |$:\$6Kt AG;\$:|+@LZ0@th Converts the case of quad names in array @s (D=0)/L1X Transliterates third-case letters in  to lowercase or {A_} {B_} {C_}X4 Result:@8VTOMSRCW@8VTOMOB2W@ APLASCII.APLPLUS2 version 1.4 (1995.10.15)@H B[I.+2 0 1]0 0s mark where the { and _} areH\ A[I-1]S[K;B/J] replace A in {A_} with underscored/lowercase letters\T K2+3=''S 3 if this APL has underscored letters, else 2TP BJ1S 0s mark any unrecognized ones, e.g. {+_}P@ SALPHS alphabets on this system@ 0] (010M)/L1 L J(Z[J]A[1;])/J indices of uppercase lettersLLL1:J(,^\Z[J]A)/,J indices of letters of namesL Ji  X  ERROR(5 7 8B)'RANK ERROR' 'VALUE ERROR' 'WS FULL' 'DOMAIN ERROR' X@ APLASCII.APLPLUS2 version 1.4 (1995.10.15)@ZQVARSP Li`$݇|L0 j 'Page width is too narrow'0Lxeuهl4ÇP̲݇L0i L3 Endloop0]]386P237d$2fD$f\$EEEEffEfEfE0fPX.xPXuT$;mfPX.xPXuT$;rkl$2}uU}wS33҃} t_F} tX]$E633ҋ}$GߋM I:uF+K;vӋF+;v 3uEEuUp#uމEEfPX.PXuT$;rl$2M+} e6UM u$} +ڬ:tڋ+7LZ8 ,E ZDLTB WSID  ` Returns the names of workspace-related quad variables on the current system`d ERROR(5 7 8A)'RANK ERROR' 'VALUE ERROR' 'WS FULL' 'DOMAIN ERROR'd quad variabled`ret̴h @, p `D Z[B/B]S[2;B/I] convert to secondary caseT DtZTCLF@VTM APLASCII.APLPLUS2 version 1.4 (1995.10.15)@X Z,MLMUE Converts names to uppercase if D=1, to lowercase if D=1LQ ZA< A(D=1)A,[.5]'abcdefghijklmnopqrstuvwxyz'<n0qt<D `  8 h4pZPW TELPRINT M;C;D;N;R;S;U;W;X;Y4 TOUPPEROB2W 4p Copyright (c) 1995 Jim Weigang4P Z'OUT A(2A)/L1A1TCNL MTOV AL1:ZZ,TCNL,A'P@s APLASCII.APLPLUS2 version 1.4 (1995.10.15)@ZRJUST AL or right of the {+ +} or to the right of the {cont'd}.LH ZVTOM'.ALX.CT.ELX.IO.LX.PP.PR.RL.SA.SEG'HH386P23pmdfE2f]fMEEE7EEE6+fElfEfEfE0fEHfPX.xPXuT$tfPX.xPXuT$tr$+@EJENE<t:<t"<t& %#EEN EEJEENmlfPX.%PXuT$trl$d+@EREVE<t<t<t 덋E(EV E(ERE,EVE:EqE4<t <t <t]E_<E_ MJMRUN;UV}UVU[E5M@UD);!E8l$ll$lfPX.hPXuT$tl$d}`e,(؋Ee5;lr;b]+ɱ+@;vMFE>E|E}EE>ExfPX.LPXu$Ol$8+HETEPE +EEEHEE>EBuZtUBUUE)Emy͋ElEEhE E0‰E$ut@eETuM,:u E;EwM( u CE0]B뻋EEE0E$9E0r}l}E0؉]$E,]Ut$T+E|$f;u0 L$(;T$~u ;T$} tD$,|$0/D$,;T$~t$(E;~|$|$D$0|$0;|$$u+Ī+ҋM,3+M,tt t3ºmA+ҊMF‹LZ48 ZB/A remove the { _}80  A'ABCDEFGHIJKLMNOPQRSTUVWXYZ'0LTCF AALPHS[2 1;] convert secondary to primaryTOLLC V J(Z)((Z='')/Z).+12 indices of chars following LMTOVOB2WаOUT AOVEROB2W8 Copyright (c) 1994-95 Jim Weigang8XQPLBLOADSUB@ APLASCII.APLPLUS2 version 1.4 (1995.10.15)@8 ZZ OVER' ',' ',(PW-2)TELPRINT F8<4:Z'The following objects were defined:'< 0< Z'No objects were found in the file.'<< 2 Endloop<D X0 reclaim storageDH FF OVER DEFINEFNS X define the objectH ENEH C(N,0)C and related infoHX Extracts numbers from character vector , similar to S;T;X;NOUNWX teWSIDpa@O APLASCII.APLPLUS2 version 1.4 (1995.10.15)0@<]  Returns the name of the active workspace]<L'  ‡L  LP (/'Jj'A)/0 no complex numbers on this APLactive woPX Z Sets ERR to an error message if invalid numbers, else sets it to ''X Z0ȄZXNUMS A ,MATIOTASRCW $ M'',' ',' ',Mi$ L2OVERSRCW\ Captures and returns the OUT output generated by statement  OVER JU\< Copyright (c) 1988, 1994 by Jim Weigang<PGWID NB,A< (A''(STPTR'Z A')CALL RJUSTOBJ)0<܈PW@ APLASCII.APLPLUS2 version 1.4 (1995.10.15)RC@LTOO<$ LD Wraps long lines in  to a maximum of columnsDDL1:W1+3B width of each char in outputQDRJUST$  $I.PQUADCASEsi [RJUSTOB2\ The result is a vector with TCNL at the front of each line. n defn30\`?Q#̯|@h,쯇`< 19 (B''(STPTR'Z A B')CALL MTOVOBJ)0LA<@2 e Converts matrix  to an -delimited vector @< Z'' output buffer<@VB Right-justifies character vector or matrix I@0Z Z0 0''Q ZVLTOO("1xL < XX~TCNL 4p Requires the OVER subroutine4< ESC[;1]=' ' find ends<D S(((1C),3)C)^.='[0]' find [0] startsDH (0C)/1 read more if nothingHD NOUNWRAP0 turn unwrapping onDP  Use MUTE to suppress error messages from chopped keywordsP4|$@T4 #  t% 0%  $ $('l'D<'H L!  "P !"l(#$%T&'1(p)*+,T--. P LNSIZE T Z H1] PTCNL partial last line readay,HL [] F0 0'' names of objects we defined [L<SCI B0 0'' input buffer.< < (~0F)/4O XC L SMUTE'CASCII2APL C' get the first few symbols on each lineX\PW NOUNWRAP1 prevent ASCII2APL from unwrapping linesTO\DNWA X0 reclaim storageHTTD$ OUT'Reading...'$,LJUSTSRCа 0 ,LJUSTOB2H AQGETVAL, F NTIE T-1+0/-NNUMS,@ APLASCII.APLPLUS2 version 1.4 (1995.10.15)@< ERR'' indicate success<LL8:S(1Z)/Z scalar if singleton, else vectorLP (~(Z)0,1/S)/0 make sure element count is correctPHL7:(2=S)/L8 If an explicit shape was found,H@ Z[I]X enclose and store it@P (0ERR)/0 give up if a problem's been foundPP QGETVAL L[I](R[I]-1)C extract the value between ( )sPDL6:(EfEfEfPX.LPXuT$Dr>fE>fEEEfPX.PXuT$Dr}tZ %C} M U6l$ +l$$\$$|$ |$:t AO;\$:|+@LZ00L C((1B),31+1TTABM)B0TTIT BB OVER LJUST VTOM(-P)X append whole lines to bufferATT J P(-(X)TCNL)X partial last line in this blockNWRTXAP XP,X add partial line from previous block fX SNSMUTE@  APLASCII.APLPLUS2 version 1.4 (1995.10.15) @H sn Z(DR A)326 807 326 is nested, 807 is heterogenousHTict Returns 1 if  is a nested/heterogeneous/boxed array, 0 if simpleTH D+\L-R depth of parenthesis nestingle Hg ih p< P Z1Q/C get character value< P].L10:Q\C='''' L78' CDTB C drop any blanks past closing quoteZL xe (0ERR)/0 P L2:(' ('''=1C)/L4,L4,L3 jump if nested or character type (1P   (' '1C)/L2e < J1IC' (''' check for shapeR<MAI XSC Sets global variable ERR to a character vector error message if theXPRJS form to the right of the assignment arrow. (In APL form.)PTUST C is a character vector containing the portion of the transfer wT( ((D.<0)01D)/0P@( L7 pG (' '1C)/L1 @ wa APLASCII.APLPLUS2 version 1.4 (1995.10.15)ir@P Z I(1 1 2,[.5]1 2 2)[1+P;''H] row containing the fn/op nameP@ hw H(H.' ')H matrix of names in H @H nL2:H[(H='}')/H]' ' change {A}FOO B to {A FOO Bp HL]  H(1+H';')H get the stuff between  and ;+LD'' L2 Else, it's a function,7] DP  H(H'(')H get the stuff between the parens PTse (~P'('H)/L1 If it's an operator [e.g., Z(F OP) B],T, (~(~1Q)^^/Q11,Q)/0;E,T  The argument is the header line, without any leading [0] or PLVTH^.6 Extracts function or operator name from header line HH (J.1I)/L2 If occurs before ( or ',HD nm Extracts value from formatted representation  heD8L4:ERR'nested/heterogeneous array'84X Repeat for the {cont'd} phrases:4LMAI3 ()T(蠇(p L83:NUNTIE T Endloop84 Copyright (c) 1994 Jim Weigang4( ((N4m24J42]21t0DZGETVAL C;D;E;I;J;L;Q;R;S;X0(L3:RPW[2](W)NN+1(tZIFNEST A P,P$L3:(' '1C)/L10$H;CI CJC drop it from the value3, H<ace SXNUMS(J-1)C get the shape<Tte L1:(~(1C)'0123456789')/L2 If the value starts with a digit, [4TT0,t CDLB C delete leading blanks, only if necessary [6TD]  ZS0 00 no-shape-found indicatorrimDT  value couldn't be extracted, or to '' if there was no problem.T i 3 0,+`+5L+h5, 5 4 + / 4<4*9*Y*,44**X/)T)\0 !"H#$%&L'()|)*@+\,,-D./012<3$456p7 89@:;<=Dr>4?Ԉ@A1BCl 0TN D If D=0, they're converted to the primary alphabet (ALPHS[1;])F TLnae If D=1, e and j in numbers are converted to uppercase L 8 H(1+H')')H < Formats array value  for A2A transferN <h A,A CDLB CL3:I0, Z'. ',((N' ')/N),'',:EJCASE@  APLASCII.APLPLUS2 version 1.4 (1995.10.15)ec@X00L J(V[I]12A)/J weed out E/Js that occur in names, not numbers X\abt IB[(T>B)/+\TB] index of 1st char of name/number each E/J occurs in \OVR TB,J<I;T J(VC[1;])/V indices of Es and Js<PA b B(B>10,B)/B index of first char in each name/numberbP( Fast blind wrappin':(XNAE Z''(1 2)[1 02 2]  is mix in evlevel 1, first in evlevel 2MAXLTO 2 - use newer APL2 definitionsSLTUS 1 - use old APL*PLUS/NARS definitionsLNTTUL Possible results are: 0 - err on use of any changed feature [TD C(D=1)2 2'EJej' flip if going lower  upperDFMTVARLL2:ZZ,Aw aDstn ZI/(S),'' start with "shape " DD ak I(2S)E=0 If rank 2 or A is emptyD<ac E/SA element countNL< ZGENSYM P 0 i EVLEVELle @  APLASCII.APLPLUS2 version 1.4 (1995.10.15) @0 Z(1PGWID)WRAPLNS(1,Z)Z0<VA L1:A'''',((1+A='''')/A),'''' quote it<<IOA L2 Else, character,<DPW AA format the numbersSRDDTL (E=0)/'A0' reshape 0 if emptyVTD<SC (IFNEST A)/L3 jump if nesteder<  (N=0)/L2 p T TFWRITE F 0 ERR'unbalanced parentheses'0L F((1+F'')F),'A' append rest without askingLP T TFWRITE F ask now about any existing filePX On APL*PLUS (in which TFWRITE has a noninteractive append option),X< OUT' ',' ',(PW-2)TELPRINT NDLTB N<L NQVARS OVER N write quad variables tooLsrkN fRbl~tR db X~ ~ } Y|}LBDB(KXjc|NAnhAAd}PPRP O!O"PO#@$P[%`&['Z( O)H*`+|N,LVH II(E=1)^1=S or if A is a 1-elt vector,H@h2:OUT'Writing the following objects to file:'@ ELX'0'P Returns the current )EVLEVEL setting for APL*PLUS II or IIIP|lYL E$=<<HE,<?|4|2 PP(16 15 17)[E1] maximize4(p0  OK (@ R E('DYALOG'^.=6APLVER),'APL68K'^.=6APLVERS@P2] ls`98HFEx>4>|D=|9̊ t@ Z 0@ ? ?t?pL슇xL,=8ldLL:K VUUhU,UDTp P0 0 Else,0  T TFWRITE F d Adjusts the case of Es and Js (e.g. 1E3, 2J3) in character array d Z0,ZD EJCASE V;A;B;C;I;J;S;T,8 V[J]C[2;C[1;]V[J]] change the E/JsR8NSMHĵ(H49Y8@ZXZbj x= a a (a d];x;``;;:H~fl:0D Z((Z)0 1P)Z(1P)NL 20`  ?Q#H,eJ JeeLep `<99 (A''(STPTR'Z A')CALL LJUSTOBJ)0 A<@LU2 Left-justifies character vector or matrix  @@X T'---- APLASCII version: ',A2AVER,TCNL@XDUMPSUBH Z[''Z;1 0+1Z]' ' blank out {+ on last lineHH (0S)/'A1A' get prototype if A is emptyHP Recurse on each item of a nested/heterogeneous/boxed arrayPL Z(~(E=0)^1=S)/Z omit the 0 for empty vectorLT ***  The / is replicate; may not be available on all systemsTH (PGWIDK\$B3۰ t|$Bl$BuI+I;sN}݉\$FT$J+}+l$N|$tD$l$D$D$D$6D$l$D$l$2fPX.PXuT$Vl$2} M \$$T$ l$ND$6t$F\$:ՋH}+RLZe,8 2 Else,8L (0=10N)/1 If names were specified,L@ TINSERTFNS'',N[I;],TCNL get the defn@DTBSRCWX Smart (but slow) wrappin'. Avoids splitting keywords across lineX<L1: wrap lines...<< Z(1,Z)Z do no wrapping<X  Use MUTE to avoid warning messages about any braces in the valueXFNNAME L7FMTVAL@ APLASCII.APLPLUS2 version 1.4 (1995.10.15)@< ZZ,(1(E>1)' ('),(FMTVALS),(E>1)/')'<@L4:(EA[I]' how to pick the Ith element of AL@ S'IPSA'^.=4APLVER 1 if on Sharp APL@@ APLASCII.APLPLUS2 version 1.4 (1995.10.15)@DTBOB2WXZDNM(:\M`MLTM T G S S hSd`D?>TS<(`__\_ _@^K^^P^^X4 ERR'improperly quoted string'4$ Z(Z' ')/ZH[I;]N$INl/4/.9d. .DY- - L- , 4X,4p ZXNUMS C get numbers4(L1:H((''H)H'')H@( 6ZEVLEVEL;ELX < TGRPA2A OVER VTOM';QIO;N;F;I;T'<@ If D=1, E and J are converted to lowercaseA@8 (' '=10A)/L1 If numeric,8 SV V,V< , > ?M<$ZN FMTVAR V;T;W$8CL 5:TT,TCNL MTOV INSERTFNS'',NOB8H S On other systems, build the whole result in memory:HD X 6yy386P23Rd$2fD$f\$EEEEffEfEfE0fPX.xPXuT$V %afPX.xPXuT$Vr΋l$2}u+Aett uM(U,U(щM6U:u+++\\$$\$>K\$Bڰ @t|$>l$>uI+I;sكt|$Bl$BuI+I;sN}\$FT$J+}+l$N|$tD$l$D$D$D$6D$l$D$l$2fPX.PXuT$Vl$2} M \$$T$ l$ND$6t$F\$:ՋH}+RLZ+@ BVA 1s mark names/numbers@DLTBSRCW8 Z,'0',,' ',(0 1P)Z the suffixes8IFNEST@ APLASCII.APLPLUS2 version 1.4 (1995.10.15)@< APL2ASCII MUTE accessed thru < 0@L2:ZT,[1]Z add the 1st line@@ Z((N,2)'+}'),Z,(N,2)'{+' add the {+ +}s@< Z(N,W)(NW)Z wrap the defn<@ N(Z)W num rows required@L WPGWID-'+}{+' how much data fits on each lineL@ Z(PGWID-2)Z rest of the data@< T((PGWID-2)Z),'{+' the first line<T breaks, which is useful if you want to search or edit the text.TLH J(^/V[1(V)J.+1 1]12A)/J those between digitsH\ A'0123456789._',,ALPHS characters that can occur in names/numbers2 \DUT L1:(~/C[1;]V)/L2 quit if nothing to convertRJDPB2 C[1;] is what we look for, C[2;] is what we change them toTOPLC V CALPHS[2 1;5 10] convert secondary e/j to primary e/jLP1:NNL 2 3 write all fns and varsI symbPLth NVTOM,' ',N get the list as a matrixL8 TT,'---- Workspace: ',WSID,TCNL8qq386P23Rd$2fD$f\$EEEEffEfEfE0fPX.xPXuT$V %BmfPX.xPXuT$Vr΋l$2}u+Aett uM(U,U(щM6U:u+++>\$$\$>K\$B3Ұ t|$>l$>uI+I;sN}݉\$FT$J+}+l$N|$tD$l$D$D$D$6D$l$D$,$fPX.PXuT$Vl$2} M \$$T$ l$ND$6t$F\$:ՋH}+R\VTOM   @RO( APLASCII.APLPLUS2 version 1.4 (1995.10.15)'D@< C Copyright (c) 1988, 1994 by Jim Weigang <X  ERROR(5 7 8A)'RANK ERROR' 'VALUE ERROR' 'WS FULL' 'DOMAIN ERROR' X@ IO1  Z[IO+124]'|' T Returns all 128 ASCII characters, with for nonprinting charsT4 Copyright (c) 1995 Jim Weigang4@ASI I(AX)/A,A indices of chars to translate@@rat YAV[IO+ 13 167 192] change to APL symbols@D t XAV[IO+219 235 238] ASCII quote, caret, stileDD  (~('APLPLUS'^.=7APLVER)'IPSA'^.=4APLVER)/L1ZD"#% (X568 because of their system-dependent nature, are not usually wanted.]XTkln This function eliminates the nonfunctional ASCII symbols, which,TX.6 ASCII symbol. For example, APL*PLUS has two vertical bars, one219XT u with one copy being an APL functional symbol and the other an TTan Some APL systems have two copies of certain characters in AV,/0TTO+2 Translates ASCII symbols in  to the corresponding APL charactersTD8 ('DYALOG'.6APLVER)/L1 On Dyalog,Dd L2D TT,'---- Source APL system: ',APLNAME,TCNLDX (D=0)/L1@ APLASCII.APLPLUS2 version 1.4 (1995.10.15)@< Copyright (c) 1992, 1994 by Jim Weigang<`xqwun }jj`0  Subroutine called by DUMPWS0DLTBOB2WEDRANKnng $` N(N.' ')N$YDEDUBL@ APLASCII.APLPLUS2 version 1.4 (1995.10.15)@DL3:ZA no doubled characters on this APLD 0< ZSA restore original shape< 8 L 0< ZZ,' with Evlevel=',EVLEVEL000L1:('DYALOG'.6APLVER)/L3D0BR(oiTiihLoThgg g |w xr @j m`g g{ftlll`l4, write one object at a time:48 (A''(STPTR'Z A')CALL DLBOBJ)08$ZDEDUBL A;I;S;X;Y$D used for residue and the other as ASCII stile.D@2 D APLASCII.APLPLUS2 version 1.4 (1995.10.15)AL@DNAEL1:(~('APLPLUS'^.=7APLVER)'IPSA'^.=4APLVER)/0DO2 0XTO Z[IO+39 94 124]AV[IO+219 235 238] use ASCII quote/caret/stileX$B2 Z[123+4]'{}~'LP$8R T Z[97+26]'abcdefghijklmnopqrstuvwxyz'8@VO Z[32+33]' !"#$%&''()*+,-./0123456789:;<=>?@'@\VES Returns a 2- or 3-by-26 matrix of the alphabets available on this systemD\XZDLB A(8 >O (DLBA2AVERSWASCII< ,^Y\af ghi"j'k+<4 ERR'item count wrong for shape'4< Y,'' replace with APL stileDLB<LT TTBO that maps to the ASCII character when written by TFWRITE orNAMT,N DUMPSUB F;I;T;IO,$ Z[91+6]'[\]^_`'S$(\ZFMTVAL A;E;I;S;PPO@( Z128'' ZASCII@SR APLASCII.APLPLUS2 version 1.4 (1995.10.15)LT@$SC ZZ,'/',IPSAVER $,HTXL3:('IPSA'.4APLVER)/0s,@ APLASCII.APLPLUS2 version 1.4 (1995.10.15)@ZAPLNAME0 A[I]Y[XA[I]] replace 'em] 0, (l ZZ,', Level ',LEVEL'I's,Hcu ZDLTB(APLVER'-')APLVER APL system descriptionbHXchn Returns a string identifying the current APL system and environmentinX$ ZZ,' for ',OPSYS$H Deletes leading blank columns in vector or matrix  HTBB If a character occurs twice in AV, this fn returns the versionET( read by TFREAD.(s OP> !'3PPREP2RUN taRENAMEh4L2:'File ',F,' already exists.'4(j and path)D@(8 & 8MAKETTABlT h00H< | `ػ  4$##4#"|"8"!t ,!"#D$%&䚈'L()쨈*+H,览-./ț0<12覈34ء5d6<78|90:;Ԡ<P=>H?@AB@CDExF,GܮHIPJKL MNdO|PDQR SܩlQUADLXPT[PLUSOBJ,MATCHOW l Arguments: $ZLOADWS F;QIO$D (Referenced only if IO is inserted.)DX QIO - (optional global) the value of IO outside this function.XT PGWID - (global) the page width to use in wrapping the result,TX Lines in the message that begin with "name" are replacedX f_ faD ' "8@  D(  , ( f  | I1+''J , (0 2 3=NC G)/6,7,8,X A - message into which function definitions should be inserted.X@t3 quad names, so we handle them separately.@< 7 Endif<H HG(G' ')/GF[I;] the object nameH\3:(0=II-1)/12 Loop for each insertion (last to first)\X F0 1(F[;1]='.')' ',F delete . which may have followed XD F0 1ASCII2APL LJUST Z[J;] the fn/var namesDL (0=J)/12 quit if nothing to insertLP J(A[J;2]':')/J skip rows that start with :PL JJ/JA[;1]='' rows to insert fns/varsLH A((1A),2)A need only 1st 2 colsHL NOUNWRAP0 turn line unwrapping onL\N+2)/L5 If this results in nothing,18LP.+3 TT-SSH back up to avoid breaking a word9PLng[ S1+((-H)TC)0 look for a good place to cut@L@ APLASCII.APLPLUS2 version 1.4 (1995.10.15)@Lu ZB/A remove continuation marksLT B[I.+1+9]0 zero out were CR{cont'd} occursTX I((TOLOWER A[I.+8])^.='{cont''d}')/I CRs followed by {cont'd}XP I(T8+A)/T CRs not too close to the endPP B[I.+3-5]0 zero out where {+CR+} occursPX I(A[I.+2 1 1 2]^.='{++}')/I those that are part of a continuationXP(ևه,և H $ Lއ HևՇ4݇Շ,܇ۇۇdۇ0ķl̶HۇP0> I(A='_')/A find _s0@ Writes all objects in the workspace to file @  Result:\le, May be either a character matrix or newline-delimited vector.C\@ 7 Else,@X W2PGWID,3 page width and continuation indentUT'XLwa, but long lines in the rest of the text are not.LX 2 Long lines in function and variable listings are wrapped,orXT with the function or variable's definition.TKtKT0  F((1M),32+1TTABM)M0 ;U message.ns Xpha A line that begins with - marks a separator (start/end of WS, etc.)X\, i A line that begins with : marks the start of a statement to execute.[5]\Xioa QIO - (optional global) If this var is defined, any value of IOsXX Results: L ms7:('.'.13C)/15 jump if not a variable L@ree . prefix -- extract a variable definition @ [4 1  3 Xs  3C If error, execute 3 to restart L1X(UNR6:(':'.13C)/7O(deied NWA 3 Xki For now, we assume that future versions will be upward compatiblenuaXP19 5: arg is older, but not 1.3r 2P[2] 31] \e h OUT'You should obtain version ',(C),' of APLASCII and rerun this job.'[\TT OUT'version of APLASCII. There may be compatibility problems.'ndT( variable VAR.d (XKT found in the message will be assigned to QIO. If it isn'trXD11:G,'V' define the varDH  14 Else, a vector, HLe k OUT K it's a bad erroraLTor} OUT TCNL,'Unrecognized keywords in non-vector variable ',N,':' TH34 (1=V)/8 If non-vector,luHT+P (0=K)/9 If any unrecognized keywords,AT pik (0ERR)/13 D  VGETVAL V the array valueDXe e GN(N' ')/N3N the variable name (drop NL and .)uXP},{ V(1+N)C value portion of listingallP$ ky N(1+C'')C$8 Copyright (c) 1994-95 Jim Weigang8T  Use MUTE to suppress error messages from chopped keywords TXm TMUTE'FASCII2APL F' get the first few symbols on each lineX\MO NOUNWRAP1 prevent ASCII2APL from unwrapping lines ig\ nrc2:MLJUST M D  MVTOM TCNL,M break on CRs:A[D1] 0@ variable CR (where is an integer).@X A line that begins with . marks the start of a variable definition.XP Z character) marks the start of a definition in the message.PT5 i A line that begins with either [0] or (as the first nonblank T  C(V)C A \M;; matrix M to become extremely wide from unwrapping the continuation D\Xnsa  We untransliterate objects one at a time because we don't want theXTTI 'KMUTE''CASCII2APL C'''WITHTTM TTABM OVER TCNL,' {nl}' 'TP df Convert to APL, and capture unrecognized-keyword messages:1PPaP2 CTCNL MTOV C work with it as a vectorCR P@' 1 RCM[I+1+N;] the defn3] @HX N(IE)1 num lines in defn00HLV2' (I>S)/0 quit if no more objsV4LH0 13:IS1 Loop for each objectheHR50 [<A'. ESF[;1]=' ' and ends(<<D6 ) S(F[;1]='')F[;3]^.='[0]' find defn startsDLV (0F)/0L 2 NOUNWRAP0 turn line unwrapping on)^(L'3؈h0Ո`ՈՈ  ཈ ,ڈ و و ƈƈTƈ,ԼۈۈXۈƈۈڈ0ވ؈ڈڈƈ و!ň"ň#$@ň%Ĉ&Ĉ'ʈ(ʈ)t*ʈ+Hʈ,4ʈ-Ɉ.Ɉ/XɈ0Ɉ1Ȉ2\3xȈ4$Ȉ5Lj6pLj7X؈8؈9׈:X׈;׈<ֈ=ֈ>݈?@݈A`ֈBPLjC ֈDԈEHԈFӈGӈHHӈI҈J҈KT҈LшMN4OP̿QtR\SHTT݈U VȾWXY\Z[8Ĉ\È]È^LÈ_,È`ˆaˆb<ˆcde$fgth(ij|klmLndopqrPstuv0wxyzh{|}x~ l, t  p  8 \ x P hL (t8$\Ĉ4 N DUMPSUB F do the work4\ OUT TCNL,'Warning: This transliteration was produced using a newer'tes \Linm4:(C1.3)/4 warn of v1.3 incompatibilityPTndf (C=N)/3 done if versions are indenticalTP;], N1XNUMS(1+A2AVER'(')A2AVER our version numberAPLP0 L9 Else,s 0Dt matrix or a newline-delimited vector. fuDX in definitions should be extracted. May be either a characterLXT  M - the transliterated message from which function/variable TTS R C1XNUMS(1+C'(')C version number in the argumentBTTBJP (V.(V)C)/3 skip all but version markersPL T@VES - prefix -- marker; check version numberDL@OB DLTPB2 (which may be a closing ) to be the start of an object.AMPTETA  If this object is a function, don't consider the ending line TXOVS S[I,(~(23C)'.:-')/(S)I+N]0 mark this one as processedXTCN K(KTCNL)K(KTCNL)K list of bad keywords, if any T<OMS lines in long variable definitions.S <`ZDEFINEFNS M;C;E;F;G;H;I;K;N;R;S;T;V;W;ERR;NOUNWRAP;IO[35] ` Z0 0''D1:(2=M)/2 If not a matrix,DQIO,  ,Xe e QIO - (global) value of IO found in the message. (See above.)aseX< were defined in the workspace.pl<T,[ Z - character matrix containing the names of objects that TPh OUT'The DEFINEFNS argument must be in transliterated form.'P x (~''M)/1 HS/ T AL If a variable can't be defined, its value is placed in a globaltTTcae If a function can't be defined, its CR is placed in a globall rT Cp gX95J A definition ends with a blank line, a closing , or the end of the XH OUT'If it has, you can use ASCII2APL to restore it.'AHXDEI alphabetic case is transliterated as {A_} {B_} {C_} etc.,TXP LA KEEPUS - (optional global variable) If KEEPUS=1, the thirdPLCRP TTABX - (global) translate table created by MAKETTAB.SL4 : prefix -- execute a statement4( V'APLASCII version:'(L5:(P2)/0$L1:(~/'{}'A)/L22$(@ ('-'.13C)/66@( IO1, IO1A2ATESTSUB IO1h Result:L23L22L21L20L19L18L17L16L15 , Arguments: UMA2ATEST2L Result:TCIS OUT'Warning: The APL2ASCII argument contains braces. Check the'T<TFS KKEEPUS get the valueUS<< QA (0=NC'KEEPUS')/L1 If it's defined, V<@ 2 K0 default is KEEPUS=0DE@TLBO Has the same representation (matrix or vector) as A.ETXAL Z - transliterated message (contains only ASCII characters).MXTMAI the secondary case (ALPH[2;]), and ASCII synonyms areTXRS If KEEPUS=0 or is undefined, the third case is mapped toAPXXL U and ASCII synonyms of APL symbols become {'} {^} {} etc.X D1 (2DA)/L1 If arg is a matrix,FINDhE E|XHL ߈ h T ވ8l$H|0 !L"#$t%T&`'(()*X+,-p.8/(01234<5678\9h8 newline-delimited vector.8X A A - the message to transliterate, either a character matrix orXHCRi Translates APL symbols in message  to ASCII stringsrH<d'[ZAPL2ASCII A;B;C;D;I;K;M;N;P;R;S;W;X;IOn <  ts L߈H݈܈`܈0  |ވ ,dވ\ ݈߈t܈4l0P !d"#$%&P'()X*+t,4-./݈0h12( 4 ZASCII2APL A;D;I;J;K;L;M;P;R;U;IO48 Copyright (c) 1994-95 Jim Weigang8L (31ALPHS)/L5 If this APL has three alphabets,L@ Z[(~B)/B]X insert replacements@\ B[C/M]0 put 0 in posn for last char of each replacement\8 X(X' ')/X sans blanks8H CIS 1s mark input chars to replaceHT B[M]1 0s mark places where new space is neededTL N(W,1 1)[I] width of each input char in outputLX II+D^A=(S,' ')[I+D] use 2nd keyword (if there is one) for dyadicXL A - the message, either a character matrix orLH Translates ASCII phrases to APL symbols in message H P(1+A)1CRMATCHDUMPWSL < > L !#')+L$< F(0 3F)F$8 newline-delimited vector8XPKAPL2ASCII@ APLASCII.APLPLUS2 version 1.4 (1995.10.15)@@ ZVTOM Z restore original rank@L ZK USLTOASC Z transliterate the third caseL , B(1M+\N)0 P DD(1A,' ')'/\' force dyadic if next is reduce/scanP@ D(1' ',A)'''.)]0123456789_',,ALPHS@L Guess which symbols are dyadic (1=dyadic, 0=monadic):L@' R0 2TTABX replacement strings@<L4:STTABX[;1] chars to replace<P ADEDUBL A change ASCII synonyms to APL charsP8L3:K/L4 If KEEPUS=0,8@ ATCNL MTOV A convert to vector@@L2:(2PA)/L3 If arg is a matrix,@T OUT'result to make sure it has not been transliterated twice!'T< KTTABM[I;3]A[J] look 'em up<PL1:(0=NC'NOUNWRAP')/L2 unwrap if NOUNWRAP is undefinedP \ Has the same representation (matrix or vector) as the arg.\H Z - message with APL characters restored.H@ line unwrapping is performed.@X bypassed. If it's 0 or undefined (the usual condition),XX NOUNWRAP - (optional global) If NOUNWRAP=1, line unwrapping isXL TTABM - (global) translate table created by MAKETTABLL A[J]TTABM[I[K];1] replace 'em with APL symbolsL@ J(A[1J-1]'{')/J not preceded by {@P JJ/JATTABM[I;3] find special chars in the inputPHX I(TTABM[;3]'{')/1TTABM rows for special charsH\ Translate the special single characters to APL (e.g.,  )\\L3:AUSLTOAPL A translate {A_}{B_}{C_} to 3rd or 2nd alphabet\HL2:AUNWRAPLNS A combine continuation linesHH NOUNWRAP/L3 skip unwrapping if it's 1H  Arguments:  ISAC3HC2C1 A2ATEST  MK MTOV M H K''(~AVM)/AV pick a char not found in MHD R+/P width of each keywordDL UM(P)/M delete trailing blank columnsLH M(M)(,P)\(,P)/,M blank out stuff past the }HT P0 11,^\M'}' 1s mark the {keyword} part, 0s beyondTH M(A,' ')[P1+A] the {keywords} and beyondHLL4:PL.+1+1TTABM indices where keywords occurLH LL/LA='{' indices of keyword startsH< Translate the multi-character phrases<KEEPUSF3KF2F1V3V2RV2V1RV1DV0RV0D L4 restart this phaseD8 OUT'Warning--unrecognized keywords:'8D P((P MATIOTA P)=1P)P remove duplicatesD` P(I=0)U get the phrases (as originally found in text)`D (~0I)/L5 If any were not found,DD I(0 2TTABM)MATIOTA M look up keywds in msgDH MTOLOWER VTOM M allow uppercase keywordsHD (We must leave {->}, {delta_}, etc. unchanged.)D8 M((~M' _-')('{'=1M)'}'=1M)/M8T Remove imbedded blank, _, and -, but not those next to { or }:T$ CDLB(C' ')C$LJASCII2APL@ APLASCII.APLPLUS2 version 1.4 (1995.10.15)@8 Copyright (c) 1994-95 Jim Weigang8D ZVTOM Z restore original rankD (D2)/0H Z(=\1P)/A remove the keyword} partHL P[(L+1),L+R]0 put 0s to the right of { and }LLL5:A[L]TTABM[I;1] replace { with the APL symbolLT L(I0)/L ignore { for unrecognized phrasesT@ OUT' 'MTOV' ',P inform the user@H Defines functions and variables found in message HfXPXC G'QIO' assign IO value to surrogateX`LLI (2NC'QIO')/12 balk if we weren't called by LOADWSR`P VR (/TOLOWER'IO ',[.5]4N)/11 If the var is IO,UP\O2 (0=QVARS MATIOTA N)/12 err if not available on this APLFM\L N GN0 QUADCASE N normalize the caseB LT A9:(''1N)/10 If this is a quad variable,ID T\VAS OUT K just a warning this time, misterN\TUL8:OUT TCNL,'Warning--unrecognized keywords in variable ',N,':'TTTABXTTABMZZ0M TFWRITE F;B;E;I;P;T;ELX;IOS0@IIA C(H)C rest of fn @@AIS H(1+CTCNL)C header line@XSEL17:C0 EJCASE C convert E/J in nums to primary caseX\VAC16:C0 QUADCASE C convert quad names to the primary case\X2 D (LEVEL>1)/17 Level II tolerates either caseFMTXDGN ('APL68K'.6APLVER)/16 In APL.68000...DTMT ('APLPLUS'^.=7APLVER)/17 APL*PLUS tolerates either caseTXAR 15:C(2+2'['=C[2])C drop initial newline and or [0]RAX@PL prefix -- extract a function definition: @D X 220   O>  0@ A OUT'Transfer form stored in variable ',N,'.'@T 14:(NGENSYM'VAR'),'R' save the untransliterated valueTXMPU13:OUT TCNL,'Unable to extract value of variable ',N,' (',ERR,').'XGN 22 \ I OUT TCNL,'Unable to assign variable ',H,'. Value stored in ',N,'.'RC \H T (NGENSYM'VAR'),'V' assign to surrogateHP  12:HN remember the original namePC  22RILER  G is usually the same as N, except when N is 'IO'ML\MR10:(~EX G)/12 jump if assignment will likely fail\xL13L12xL11 L10L9L14 22H C' ',C indent all linesHD (/(C[;1]=' ')^C.' ')/18 If no exdents,DP (0C)/19 careful--may be empty nowP\ CDLTB C delete leading and trailing blank cols\T C(-W)(C)W((C)+0,/W)C remove the line numbersTX WWC[;1]='[' zero width for lines w/o numbersXX W1++/^\C']' width of line number on each lineXL (0C)/19 jump if body is emptyL@ CVTOM C as a matrix@P N,'C' save the CRPH20:NGENSYM'CR' available nameHD (010N)/21 If FX failed,DD NFX C define as fnDX (~EX W)/20 erase first, in case defined as varXP WFNNAME H name of fcn (or operator)PH19:C(' ',DLTB H)OVER C restore the headerHL  If we don't do this, APL.68000 deletes the blank linesLT C[(C^.=' ')/1C;1]'' make blank line be commentsTH18:('APL68K'.6APLVER)/19 If on APL.68000,H ?  ?OUTCR1~aSCII2APLaPL2ASCIII2PiNSERTFNSAMPX V5RNENV5 DEAV4R  V4E2A V3R LOADWSOASINSTALLASCIISAMP K'',N DUMPWS F;KEEPUS;QIO,@ APLASCII.APLPLUS2 version 1.4 (1995.10.15)@D ASCII2APL accessed thru D< 3 Endloop<P22:ZZ OVER N remember what we definedP OUT KH OUT TCNL,'Warning--unrecognized keywords in ',W,':'H$21:(0=K)/22$ OUT K\ OUT'And, by the way, it contains the following unrecognized keywords:'\  (0=K)/22 X OUT TCNL,'Unable to define ',W,'. CR stored in variable ',N,'.'XL optionally followed by the continuation indent.L87654321< F - the name of the file to write<NOUNWRAPERRWVTSRNKIHGFECMDEFINEFNSZL  KEEPUS1 preserve all character distinctionsLX If N is omitted or is numeric, all objects are written.X RZADETAILSGREETINGW$v ^Y"$2221201918171615141312111090} Establish the correct shapeM00 L6 Endloop0ASCIISAMPXDESCRIBEW0 ('APLPLUS'.7APLVER)/5] 0Xn S defined, IO will be placed in one of the VARi variables.2 vX  Arguments: |/ (~0C)/9 8! ZLOADSUB F do most of the workPR8`X Epl`D& replaced by their APL counterparts.D 8  @ped APLASCII.APLPLUS2 version 1.4 (1995.10.15)')@PN 1 QIOIO setting this serves as a flag for DEFINEFNSrsPT TN Reads transliterated file , defining objects in the workspace TD8* W+/R' ' width of each replacementDD IOQIO set value imported from the fileD 8 TY IPSACASED0. ZB\A insert space for phrasesDD1 X,R[C/I;] replacement for each charDD ATCNL MTOV A convert to vector3DL8 Z(R),E)Ds' flC',USAVEL7L6L5L4L3L2L1SWIVHTGSEIBHAGNEULABANF:Zct,ZEULOAD   DM  X     4Y Copyright (c) 1994-5 Jim Weigang44ZGRPA2A/ IO1@ APLASCII.APLPLUS2 version 1.4 (1995.10.15)@Tt QIOIO capture global value for use by INSERTFNSTp 0L2:ZNREAD T,82,(NSIZE T),0CA0PKET  Use MUTE to prevent warnings caused by chopped keywords TPX WR SMUTE'AASCII2APL A' get first few characters of each rowX\2 D NOUNWRAP1 prevent ASCII2APL from unwrapping linesR \HSY ZAPL2ASCII Z transliterate itAHLSC (~/TZ)/2 If msg isn't all ASCII, LHAR 1:T(~AV32127ASCII)/AV non-ASCII charactersOHLNWA ZVTOM TCNL,Z convert vector to matrixTLWI (R=2)/1dXY\]}^abc7ys=R"QP|A~D Mfijkl