NEUQJ7FRWFVZ7HPXGLLBU55FH6OSB374SQSRGIAAA233KFGEKTDAC
DLKX5ORVHGLKOQD2ZDBDQKZBSN5XQ7WXMZPCZNMTMJV2JRKS664AC
7KF6CLZGZ4I2FTAFXZV5EL7XDQ2HC3VDELT3RHCABEAXU2C3UUTQC
PAKJWJ4I5Q4YOY4CAQEZP3HHGCOCOIF32FT3IIZVT5SIRJZGXQVQC
IHDDXPBATRVMS6VIJQLXBEMNI3ERHIO5JW6RB5DHO2R4NZBI2V7QC
IDGMNM2XJX6P4IOFOT735OYKWGUOL6U4TX7MWFAHE3FNZBLB6RBQC
GSH2PRGCOOMP2GMHQUC2V5NQT5MJCFGVEI7TAMPQFCMT7E4DFHPQC
WBTTOVECBHVLVJKWBGXUGPA3C5L5G7CIIQP6SK4H4YLGCA4R2X3AC
CBEBMHUSOH3BUSNKD2372DXTAZQBF5UPZCOYFSBPDX5J5QV5PMXQC
6WM2DD32XSC2HFLOXBDPFCU6BI2BD5ZYFGBIEIVEQOKWRCNTXROQC
ICGJDX2EHUCWPATWZRMDCSSTRXGSPW5M4NGU5MAFG6R7QDUC5KPQC
UW27LKXM2BJ77FQLTY4WPKDSSWI2RFNFRJ7CB4U3TS7KYVIV72LQC
TN5RCIH3OI5AW756GICACN24TBABGLNDQ7LZJTUYHXYVW3ARGBBQC
JDZASPALXSFZOL3MXCKBPX74CUD3W743ZJ6W2422FIJ7NJOD67ZAC
MDCE6UHRABRWF7Z7NOQ3OTB5WXRIHPY7A625V5E6COPS44ETZSQQC
5XO7IKBGCVXGVWMDJDE5MELS4FWRITKAU6NNV36NQ4TOZRR7UQ7QC
LTFZUIG6XMN6MAXJFV2F4TZNHWGOFTDKR56G264UNNDVNL447UAQC
4YBBAZM32EOQGX736RWC6NDEDRIIL64RFHFDNTRCATUS4KD77Y7AC
VIEK2XMYJX37ELGVE2P5PZQU47NJ3GBXPV3XY2RWG2TDHIZEV57QC
KBD2A5MUJHKGV4JD6MLJXTKNAYZ5D44LX5WRB2ZXX5YCWBODWR3AC
IJPPBZNLPL4X6WDFWFBNMZ32WNJM7QZ6EFSUTNSN74AZJEZKEARAC
I3MID22EURRK26C4JZ2U5FBEZ57GZVMBT44KFKTU4BBYXKLILWRAC
OUNA3ZMTTISFWX3HHIJ46WTYQJBX4OFSNU4SU3GOJMBLLHQDFT7AC
A2JAXDJWT2FAKADYOY6QOQ7LQRMTTCDIOYT7STSESVHLZQEQJBMAC
GW4AAYNF7I66D72G5PMFTQRK7B4KZVYKAHKRPC2IY7IX37JKEHJQC
NBEO3TPNOUG7MRFYRSDDFB5TQKTEDL6GHHFQVOB5MXVPIBKFNZKAC
IMQIKAOEZWNPCBOYMBV5QGUEAZUZ3B3FIKQ7HDNMSXPHV7322GFQC
6XHALMLUA5B5BBYFSWIFHSJ2BXCL6RSAW5TCKRGJEI2LURH2TQ4AC
O6PFGAUDYCMK6SC6V5RB5ELXZ7W54OB7XPYCMECCA4BSBUVLFAPAC
2UOWJD64KBUHIWGZTPGUWWJXH5ZIAMOEJRDNZQOW5QWBJDEACURQC
PXI442CY2KQHHAIJ3UNCWKTAI4IFYNGYEBRQMDR6T53YZTY2VMMQC
K3OVRFE3Y23DN47XNAISH6XM5JGSCNRR6TOEO5KAKBNB54MFO27AC
7SNXCC5KSDXU3MBJT2FBEPAISWPY62DHPC2RLEYXC2WVTWX5TKKQC
BEOFPS76OOYENP76QFENC7BFGH6GDLEZODWIHFFQOIK3ZHD7IPBAC
RCUBQKTURAMSYYFNNI4JPXDBZDGF6ZGWVGQYTDEKA6EOMG4QUZOAC
QPW27WXKZFJFFXH2QIDDSM7HQTGZJ26ACF22RE6Q5CJV7LJ3G7FQC
TR7MDG2JZKE2XJTMGJQT3W4JTYNYPSDEZN5G4D464WCWCMVA75NQC
7NGDT5EF45AF26SWO5BL4UUIA4ZFWZDEBY2FGIMGQ7KJWPLKHTNQC
OUSD2SQASHZTD2KRWOVMU7LUSE73NXKECFIOD7M76NMOXMD7Q4RQC
return _substr3(_eval3(_cadr(form), env, env, d+1),
_eval3(_caddr(form), env, env, d+1),
_eval3(_car(_cdddr(form)), env, env, d+1))
return _substr3(_eval3(_cadr(form), env, env, d+1, hdlrs, st, errp),
_eval3(_caddr(form), env, env, d+1, hdlrs, st, errp),
_eval3(_car(_cdddr(form)), env, env, d+1, hdlrs, st, errp))
return _gsub3(_eval3(_cadr(form), env, env, d+1),
_eval3(_caddr(form), env, env, d+1),
_eval3(_car(_cdddr(form)), env, env, d+1))
return _gsub3(_eval3(_cadr(form), env, env, d+1, hdlrs, st, errp),
_eval3(_caddr(form), env, env, d+1, hdlrs, st, errp),
_eval3(_car(_cdddr(form)), env, env, d+1, hdlrs, st, errp))
lisp_eval_should_be '(abort "it is a format string %d" 42)' '' 'abort' 87
lisp_eval_should_be '(error "oh no")' '' 'error' 87
lisp_eval_should_be '(abort "what if we %s?" (abort "aaaaaaa"))' '' 'abort while aborting' 88
lisp_eval_should_be '(handle (lambda (st) "be cool") (error "oh no"))' '"be cool"' 'handle'
_abort(_cdr(form), env, d)
_abort(_cdr(form), env, d+1, hdlrs, st, errp)
else if(car == _symbol("error")) {
# logg_err("_eval3", "error raised!", d)
errp[1] = 1
if(_is_null(hdlrs)) {
_abort(_cdr(form), #_cons(_string("unhandled error"), _nil()),
env, d+1, hdlrs, st, errp)
} else {
# we have to get back to the (awk) frame where the handler
# was added. there are checks for errp[1] in plenty of
# places above that forestall further evaluation until the
# handler kicks in.
return _nil()
}
} else if(car == _symbol("handle")) {
hdlrs = _cons(_cadr(form), hdlrs) # unevaluated fwiw
x = _evprog(_cddr(form), env, env, d+1, hdlrs, st, errp)
if(errp[1]) {
# don't pass a true errp in: the eval will quit
delete no_errp
no_errp[1] = 0
return _eval3(_cons(_car(hdlrs),
_cons(_cons(_symbol("quote"),
_cons(st, _nil())),
_nil())),
env, env, d+1, _cdr(hdlrs), st, no_errp)
} else {
return x
}
}
s = _sprintf(_eval3(_car(form), env, env, d+1),
_cdr(form), env, d+1)
print "GLOTAWK ABORT: " _STRING[s] > "/dev/stderr"
abort_errp[1] = 0
# we are going to exit. don't deal with the handlers at this point.
s = _sprintf(_eval3(_car(form), env, env, d+1, _nil(), st, abort_errp),
_cdr(form), env, d+1, _nil(), st, abort_errp)
print "****** GLOTAWK ABORTING: " _STRING[s] > "/dev/stderr"
if(st) {
print "****** ENVIRONMENT" > "/dev/stderr"
for(; !_is_null(env); env=_cdr(env)) {
if(env && _car(env))
print " " _repr(_car(env)) > "/dev/stderr"
}
print "****** STACK TRACE" > "/dev/stderr"
for(; !_is_null(st); st=_cdr(st)) {
if(st && _car(st))
print " evaling " _repr(_car(st)) > "/dev/stderr"
}
print "******" > "/dev/stderr"
}
(let ((problem false))
(label ((shellquote-string
(lambda (x)
(cond ((stringp x) (shellquote x))
((eq x :pipe) "|")
((eq x :gt) ">")
((eq x :gtgt) ">>")
((eq x :lt) "<")
((keywordp x) (keyword-name x)) ; unquoted!
(true (setq problem true))))))
(let ((words (mapcar shellquote-string argv)))
(cond
(problem (abort "make-safe-shell-command: could not with argv %s"
(repr argv)))
(true (apply string-join " " words)))))))
(label ((shellquote-string
(lambda (x)
(cond ((stringp x) (shellquote x))
((eq x :pipe) "|")
((eq x :gt) ">")
((eq x :gtgt) ">>")
((eq x :lt) "<")
((keywordp x) (keyword-name x)) ; unquoted!
(true (error "cannot use %s to make-safe-shell-command"
(repr x)))))))
(apply string-join " " (mapcar shellquote-string argv))))
return _with_ors(_eval3(_cadr(form), env, env, d+1),
_cddr(form), env, d+1) # to be evaluated using evprog
return _with_ors(_eval3(_cadr(form), env, env, d+1, hdlrs, st, errp),
_cddr(form), env, d+1, hdlrs, st, errp) # to be evaluated using evprog
return _with_output_to(_eval3(_cadr(form), env, env, d+1),
_eval3(_caddr(form), env, env, d+1),
_cdddr(form), env, d+1) # to be evprogged
return _with_output_to(_eval3(_cadr(form), env, env, d+1, hdlrs, st, errp),
_eval3(_caddr(form), env, env, d+1, hdlrs, st, errp),
_cdddr(form), env, d+1, hdlrs, st, errp) # to be evprogged
return _with_input_from(_eval3(_cadr(form), env, env, d+1),
_eval3(_caddr(form), env, env, d+1),
_cdddr(form), env, d+1) # to be evprogged
return _with_input_from(_eval3(_cadr(form), env, env, d+1, hdlrs, st, errp),
_eval3(_caddr(form), env, env, d+1, hdlrs, st, errp),
_cdddr(form), env, d+1, hdlrs, st, errp) # to be evprogged
return _eval3_io(form, env, d)
else return _eval3_other_special_forms(form, env, d)
return _eval3_io(form, env, d, hdlrs, st, errp)
else return _eval3_other_special_forms(form, env, d, hdlrs, st, errp)
function _eval(form, depth) {
return _eval3(_expand(form, depth+1), _nil(), _nil(), depth)
function _eval(form, depth, hdlrs, st, errp) {
if(!hdlrs) hdlrs = _nil()
if(!st) st = _nil()
delete errp
errp[1] = 0
return _eval3(_expand(form, depth+1), _nil(), _nil(), depth, hdlrs, st, errp)