+
+ 2over 2over ( env exp env exp )
+ operator ( env exp env opname )
+
+ 2dup apply-symbol objeq? if
+
+ 2drop 2swap ( env env exp )
+ cdr 2dup car 2rot ( env expbody real-opname env )
+ eval ( env expbody proc )
+ 2swap cdr
+ nil? false = if car then ( env proc real-operand )
+
+ 2rot eval ( proc argvals )
+
+ pair-type istype? false = if
+ bold fg red ." Error: apply requires a list of operand arguments." cr
+ reset-term abort
+ then
+
+ apply
+ exit
+ then
+
+ 2dup lookup-macro nil? false = if
+ \ Macro function evaluation
+
+ ( env exp env opname mproc )
+ 2swap 2drop -2rot 2drop cdr ( env mproc body )
+
+ 2dup print cr
+ macro-expand
+ 2dup print cr
+
+ 2swap
+ ['] eval goto-deferred
+ then
+
+ \ Regular function application
+
+ 2drop ( env exp env opname )
+
+ 2swap eval ( env exp proc )
+ -2rot ( proc env exp )
+ operands 2swap ( proc operands env )
+ list-of-vals ( proc argvals )