1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- Step 8: Macros -->
3 <!-- input document must be in the following format -->
6 <stdin>...stdin text...</stdin>
7 <stdout> ... ignored, omitted ... </stdout>
8 <state> contains env and atoms </state>
11 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://www.w3.org/2005/02/xpath-functions" xmlns:env="ENV" xmlns:core="CORE" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:map="http://www.w3.org/2005/xpath-functions/map" version="3.0" exclude-result-prefixes="fn xs map env core">
12 <xsl:import href="reader.xslt"/>
13 <xsl:import href="printer.xslt"/>
14 <xsl:import href="env.xslt"/>
15 <xsl:import href="core.xslt"/>
16 <xsl:output method="xml" encoding="utf-8" indent="yes"/>
17 <xsl:template match="mal" name="rep">
18 <xsl:param name="display" select="false()" />
20 <xsl:when test="string(state/env/@data) = ''">
21 <xsl:variable name="argv">
24 <xsl:for-each select="argv/arg/text()">
25 <malval kind="string" value="{.}"/>
30 <xsl:variable name="vstate">
33 <env data="{env:serialise(env:empty() => env:bind-all(core:ns()/@name, core:ns()) => env:set('*ARGV*', $argv) => env:toReplEnv())}"/>
36 <stdin>(do (def! not (fn* (a) (if a false true))) (def! load-file (fn* (f) (eval (read-string (str "(do " (slurp f) "\nnil)"))))) (defmacro! cond (fn* (& xs) (if (> (count xs) 0) (list 'if (first xs) (if (> (count xs) 1) (nth xs 1) (throw "odd number of forms to cond")) (cons 'cond (rest (rest xs))))))))</stdin>
39 <xsl:variable name="new-state">
40 <xsl:for-each select="$vstate/mal">
41 <xsl:call-template name="rep"/>
44 <xsl:variable name="state-v">
45 <xsl:sequence select="$new-state/mal/state"/>
46 <xsl:sequence select="stdin"/>
48 <xsl:for-each select="$state-v">
49 <xsl:call-template name="rep">
50 <xsl:with-param name="display" select="$display"/>
56 <xsl:variable name="env" as="map(*)">
57 <xsl:sequence select="env:deserialise(state/env/@data)"/>
59 <xsl:sequence select="stdin"/>
60 <xsl:variable name="_read">
61 <xsl:call-template name="READ"/>
63 <xsl:variable name="_eval">
64 <xsl:for-each select="$_read">
65 <xsl:call-template name="EVAL">
66 <xsl:with-param name="env" select="$env"/>
70 <xsl:for-each select="$_eval">
71 <xsl:variable name="_print">
72 <xsl:variable name="data">
73 <xsl:sequence select="data/value"/>
74 <xsl:sequence select="atoms[1]"/>
76 <xsl:for-each select="$data">
77 <xsl:call-template name="PRINT"/>
80 <xsl:if test="$display">
82 <request kind="display" value="{$_print}"/>
86 <env data="{env/@data}"/>
87 <xsl:sequence select="atoms[1]"/>
94 <xsl:template name="PRINT">
95 <xsl:variable name="str">
96 <xsl:call-template name="malprinter-pr_str">
97 <xsl:with-param name="readably" select="true()"/>
100 <xsl:value-of select="$str"/>
102 <xsl:template name="eval_ast">
103 <xsl:param name="env"/>
104 <xsl:param name="atoms"/>
106 <xsl:when test="value/malval/@kind = 'symbol'">
107 <xsl:variable name="val">
108 <xsl:sequence select="env:get($env, value/malval/@value)"/>
111 <xsl:sequence select="$val"/>
114 <xsl:when test="value/malval/@kind = 'list' or value/malval/@kind = 'vector' or value/malval/@kind = 'hash'">
115 <xsl:variable name="myctx">
116 <xsl:iterate select="value/malval/lvalue/malval">
117 <xsl:param name="atoms" select="$atoms"/>
118 <xsl:param name="xctx" select="()"/>
120 <xsl:sequence select="$xctx/value/malval"/>
121 <xsl:sequence select="$atoms"/>
123 <xsl:variable name="ctx">
125 <xsl:sequence select="."/>
127 <xsl:sequence select="$atoms"/>
129 <xsl:variable name="xctxy">
130 <xsl:for-each select="$ctx">
131 <xsl:variable name="val">
132 <xsl:call-template name="EVAL">
133 <xsl:with-param name="env" select="$env"/>
134 <xsl:with-param name="encode-env" select="false()"/>
137 <xsl:sequence select="$val/data/value"/>
138 <xsl:sequence select="$val/atoms"/>
142 <xsl:with-param name="atoms" select="$xctxy/atoms"/>
143 <xsl:with-param name="xctx" select="$xctx, $xctxy"/>
144 </xsl:next-iteration>
148 <malval kind="{value/malval/@kind}">
150 <xsl:sequence select="$myctx/malval"/>
154 <xsl:sequence select="$myctx/atoms"/>
157 <xsl:sequence select="."/>
158 <xsl:sequence select="$atoms"/>
162 <!-- uapply[env, fn, args] -->
163 <xsl:template name="uapply">
164 <xsl:param name="func"/>
165 <xsl:param name="args"/>
166 <xsl:param name="env"/>
167 <xsl:variable name="nenv" select="$env => env:hier(env:deserialise($func/malval/env/@data)) => env:close-with-binds($func/malval/binds/malval/@value, $args/value/malval/lvalue/malval)"/>
168 <xsl:variable name="body">
170 <xsl:sequence select="$func/malval/body/malval"/>
172 <xsl:sequence select="atoms[1]"/>
174 <xsl:variable name="result">
175 <xsl:for-each select="$body">
176 <xsl:call-template name="EVAL">
177 <xsl:with-param name="env" select="$nenv"/>
181 <xsl:sequence select="$result/data/value"/>
182 <env data="{env:serialise(env:swap-replEnv($env, env:deserialise($result/env/@data) => env:replEnv()))}"/>
183 <xsl:sequence select="$result/atoms[1]"/>
185 <xsl:template name="quasiquote">
186 <xsl:param name="ast"/>
187 <xsl:variable name="result">
189 <xsl:when test="fn:is-pair($ast)">
191 <xsl:when test="let $fst := $ast/lvalue/malval[1]
192 return $fst/@kind = 'symbol' and
193 $fst/@value = 'unquote'">
194 <xsl:sequence select="$ast/lvalue/malval[2]"/>
196 <xsl:when test="let $fst := $ast/lvalue/malval[1]
197 return fn:is-pair($fst) and
198 (let $fstfst := $fst/lvalue/malval[1]
199 return $fstfst/@kind = 'symbol' and
200 $fstfst/@value = 'splice-unquote')">
203 <malval kind="symbol" value="concat"/>
204 <xsl:sequence select="$ast/lvalue/malval[1]/lvalue/malval[2]"/>
205 <xsl:variable name="rest" select="$ast/lvalue/malval[position() > 1]"/>
206 <xsl:variable name="rest-">
209 <xsl:sequence select="$rest"/>
213 <xsl:call-template name="quasiquote">
214 <xsl:with-param name="ast" select="$rest-"/>
222 <malval kind="symbol" value="cons"/>
223 <xsl:variable name="first" select="$ast/lvalue/malval[1]"/>
224 <xsl:variable name="rest" select="$ast/lvalue/malval[position() > 1]"/>
225 <xsl:variable name="rest-">
228 <xsl:sequence select="$rest"/>
232 <xsl:call-template name="quasiquote">
233 <xsl:with-param name="ast" select="$first"/>
235 <xsl:call-template name="quasiquote">
236 <xsl:with-param name="ast" select="$rest-/malval"/>
246 <malval kind="symbol" value="quote"/>
247 <xsl:sequence select="$ast"/>
253 <xsl:sequence select="$result"/>
255 <xsl:template name="macroexpand">
256 <xsl:param name="ast"/>
257 <xsl:param name="env"/>
258 <xsl:param name="encode-env"/>
260 <xsl:when test="fn:is-macro-call($ast, $env)">
261 <xsl:variable name="fn" select="env:get($env, $ast/lvalue/malval[1]/@value)"/>
262 <xsl:variable name="args">
266 <xsl:sequence select="$ast/lvalue/malval[position() > 1]"/>
271 <xsl:variable name="new">
272 <xsl:call-template name="uapply">
273 <xsl:with-param name="func" select="$fn"/>
274 <xsl:with-param name="args" select="$args"/>
275 <xsl:with-param name="env" select="$env"/>
278 <xsl:call-template name="macroexpand">
279 <xsl:with-param name="ast" select="$new/value/malval"/>
280 <xsl:with-param name="env" select="$env"/>
281 <xsl:with-param name="encode-env" select="$encode-env"/>
286 <xsl:sequence select="$ast"/>
288 <xsl:sequence select="atoms[1]"/>
289 <xsl:if test="$encode-env">
290 <env data="{$env => env:serialise()}"/>
295 <xsl:template name="EVAL">
296 <xsl:param name="env"/>
297 <xsl:param name="encode-env" select="true()"/>
298 <xsl:variable name="atoms" select="atoms[1]"/>
299 <xsl:variable name="data">
301 <xsl:when test="value/malval/@kind = 'list'">
303 <xsl:when test="count(value/malval/lvalue/malval) = 0">
304 <xsl:sequence select="."/>
305 <xsl:if test="$encode-env">
306 <env data="{env:serialise($env)}"/>
308 <xsl:sequence select="$atoms"/>
311 <xsl:variable name="mexp">
312 <xsl:call-template name="macroexpand">
313 <xsl:with-param name="ast" select="value/malval"/>
314 <xsl:with-param name="env" select="$env"/>
315 <xsl:with-param name="encode-env" select="$encode-env"/>
318 <xsl:for-each select="$mexp">
320 <xsl:when test="value/malval/@kind != 'list'">
321 <xsl:variable name="ctx">
322 <xsl:sequence select="value"/>
324 <xsl:for-each select="$ctx">
325 <xsl:call-template name="eval_ast">
326 <xsl:with-param name="atoms" select="$atoms"/>
327 <xsl:with-param name="env" select="$env"/>
329 <xsl:if test="$encode-env">
330 <env data="{env:serialise($env)}"/>
332 <!-- <xsl:sequence select="$atoms"/> -->
335 <xsl:when test="let $fn := value/malval/lvalue/malval[1]
336 return $fn/@kind = 'symbol' and
337 $fn/@value = 'def!'">
338 <xsl:variable name="name">
339 <xsl:value-of select="value/malval/lvalue/malval[2]/@value"/>
341 <xsl:variable name="xvalue">
343 <xsl:sequence select="value/malval/lvalue/malval[3]"/>
345 <xsl:sequence select="$atoms"/>
347 <xsl:variable name="value">
348 <xsl:for-each select="$xvalue">
349 <xsl:call-template name="EVAL">
350 <xsl:with-param name="env" select="$env"/>
351 <xsl:with-param name="encode-env" select="false()"/>
355 <xsl:sequence select="$value/data/value"/>
356 <xsl:if test="$encode-env">
357 <env data="{env:serialise(env:set($env, $name, $value/data/value/malval))}"/>
359 <xsl:sequence select="$value/atoms[1]"/>
361 <xsl:when test="let $fn := value/malval/lvalue/malval[1]
362 return $fn/@kind = 'symbol' and
363 $fn/@value = 'defmacro!'">
364 <xsl:variable name="name">
365 <xsl:value-of select="value/malval/lvalue/malval[2]/@value"/>
367 <xsl:variable name="xvalue">
369 <xsl:sequence select="value/malval/lvalue/malval[3]"/>
371 <xsl:sequence select="$atoms"/>
373 <xsl:variable name="value">
374 <xsl:for-each select="$xvalue">
375 <xsl:call-template name="EVAL">
376 <xsl:with-param name="env" select="$env"/>
377 <xsl:with-param name="encode-env" select="false()"/>
381 <xsl:variable name="resv">
383 <malval kind="{$value/data/value/malval/@kind}" value="{$value/data/value/malval/@value}">
384 <xsl:sequence select="$value/data/value/malval/*[name() != 'is_macro']"/>
385 <is_macro>true</is_macro>
389 <xsl:sequence select="$resv"/>
390 <xsl:if test="$encode-env">
391 <env data="{env:serialise(env:set($env, $name, $resv/value/malval))}"/>
393 <xsl:sequence select="$resv/atoms[1]"/>
395 <xsl:when test="let $fn := value/malval/lvalue/malval[1]
396 return $fn/@kind = 'symbol' and
397 $fn/@value = 'let*'">
398 <xsl:variable name="xvalue">
400 <xsl:sequence select="value/malval/lvalue/malval[3]"/>
402 <xsl:sequence select="$atoms"/>
404 <xsl:iterate select="fn:group_consec(value/malval/lvalue/malval[2]/lvalue/malval)">
405 <xsl:param name="new_env" select="env:close($env)"/>
406 <xsl:param name="new_atoms" select="$atoms"/>
408 <xsl:variable name="xvalue">
409 <xsl:sequence select="$xvalue/value"/>
410 <xsl:sequence select="$new_atoms"/>
412 <xsl:variable name="value">
413 <xsl:for-each select="$xvalue">
414 <xsl:call-template name="EVAL">
415 <xsl:with-param name="env" select="$new_env"/>
416 <xsl:with-param name="encode-env" select="$encode-env"/>
420 <xsl:sequence select="$value/data/value"/>
421 <xsl:if test="$encode-env">
422 <env data="{env:serialise(env:swap-replEnv($env, env:deserialise($value/env/@data) => env:replEnv()))}"/>
424 <xsl:sequence select="$value/atoms[1]"/>
426 <xsl:variable name="name">
427 <xsl:value-of select="node()[name() = 'first']/malval/@value"/>
429 <xsl:variable name="xvalue">
431 <xsl:sequence select="node()[name() = 'second']/malval"/>
433 <xsl:sequence select="$new_atoms"/>
435 <xsl:variable name="value">
436 <xsl:for-each select="$xvalue">
437 <xsl:call-template name="EVAL">
438 <xsl:with-param name="env" select="$new_env"/>
439 <xsl:with-param name="encode-env" select="false()"/>
444 <xsl:with-param name="new_env" select="env:set($new_env, $name, $value/data/value/malval)"/>
445 <xsl:with-param name="new_atoms" select="$value/atoms[1]"/>
446 </xsl:next-iteration>
449 <xsl:when test="let $fn := value/malval/lvalue/malval[1]
450 return $fn/@kind = 'symbol' and
452 <xsl:iterate select="value/malval/lvalue/malval[position() > 1]">
453 <xsl:param name="new_env" select="$env"/>
454 <xsl:param name="atoms" select="$atoms"/>
455 <xsl:param name="previous_res" select="()"/>
457 <xsl:sequence select="$previous_res"/>
458 <xsl:if test="$encode-env">
459 <env data="{env:serialise($new_env)}"/>
461 <xsl:sequence select="$atoms"/>
463 <xsl:variable name="xvalue">
465 <xsl:sequence select="."/>
467 <xsl:sequence select="$atoms"/>
469 <xsl:variable name="value">
470 <xsl:for-each select="$xvalue">
471 <xsl:call-template name="EVAL">
472 <xsl:with-param name="env" select="$new_env"/>
477 <xsl:with-param name="new_env" select="env:deserialise($value/env/@data)"/>
478 <xsl:with-param name="previous_res" select="$value/data/value"/>
479 <xsl:with-param name="atoms" select="$value/atoms[1]"/>
480 </xsl:next-iteration>
483 <xsl:when test="let $fn := value/malval/lvalue/malval[1]
484 return $fn/@kind = 'symbol' and
486 <xsl:variable name="cond">
487 <xsl:for-each select="value/malval/lvalue/malval[2]">
488 <xsl:variable name="context">
490 <xsl:sequence select="."/>
492 <xsl:sequence select="$atoms"/>
494 <xsl:for-each select="$context">
495 <xsl:call-template name="EVAL">
496 <xsl:with-param name="env" select="$env"/>
497 <xsl:with-param name="encode-env" select="false()"/>
502 <xsl:variable name="ptrue">
503 <xsl:for-each select="value/malval/lvalue/malval[3]">
505 <xsl:sequence select="."/>
507 <xsl:sequence select="$cond/atoms[1]"/>
510 <xsl:variable name="pfalse">
511 <xsl:for-each select="value/malval/lvalue/malval[4]">
513 <xsl:sequence select="."/>
515 <xsl:sequence select="$cond/atoms[1]"/>
518 <xsl:variable name="xfalse">
520 <xsl:when test="empty($pfalse/value)">
524 <xsl:sequence select="$cond/atoms[1]"/>
527 <xsl:sequence select="$pfalse/value"/>
528 <xsl:sequence select="$pfalse/atoms[1]"/>
532 <xsl:variable name="res">
534 <xsl:when test="let $kind := $cond/data/value/malval/@kind
535 return $kind = 'nil' or
537 <xsl:for-each select="$xfalse">
538 <xsl:call-template name="EVAL">
539 <xsl:with-param name="env" select="$env"/>
540 <xsl:with-param name="encode-env" select="$encode-env"/>
545 <xsl:for-each select="$ptrue">
546 <xsl:call-template name="EVAL">
547 <xsl:with-param name="env" select="$env"/>
548 <xsl:with-param name="encode-env" select="$encode-env"/>
554 <xsl:sequence select="$res/data/value"/>
555 <xsl:if test="$encode-env">
556 <env data="{env:serialise($env)}"/>
558 <xsl:sequence select="$res/atoms[1]"/>
560 <xsl:when test="let $fn := value/malval/lvalue/malval[1]
561 return $fn/@kind = 'symbol' and
564 <malval kind="userfunction">
565 <is_macro>false</is_macro>
567 <xsl:sequence select="value/malval/lvalue/malval[2]/lvalue/malval"/>
570 <xsl:sequence select="value/malval/lvalue/malval[3]"/>
572 <env data="{env:serialise(env:noReplEnv($env))}"/>
573 <!-- capture current env -->
576 <xsl:if test="$encode-env">
577 <env data="{env:serialise($env)}"/>
579 <xsl:sequence select="$atoms"/>
581 <xsl:when test="let $fn := value/malval/lvalue/malval[1]
582 return $fn/@kind = 'symbol' and
583 $fn/@value = 'quote'">
585 <xsl:sequence select="value/malval/lvalue/malval[2]"/>
587 <xsl:if test="$encode-env">
588 <env data="{env:serialise($env)}"/>
590 <xsl:sequence select="$atoms"/>
592 <xsl:when test="let $fn := value/malval/lvalue/malval[1]
593 return $fn/@kind = 'symbol' and
594 $fn/@value = 'quasiquote'">
595 <xsl:variable name="exp">
597 <xsl:call-template name="quasiquote">
598 <xsl:with-param name="ast" select="value/malval/lvalue/malval[2]"/>
601 <xsl:sequence select="$atoms"/>
603 <xsl:variable name="res">
604 <xsl:for-each select="$exp">
605 <xsl:call-template name="EVAL">
606 <xsl:with-param name="env" select="$env"/>
607 <xsl:with-param name="encode-env" select="$encode-env"/>
611 <xsl:sequence select="$res/data/value"/>
612 <xsl:if test="$encode-env">
613 <xsl:sequence select="$res/env"/>
615 <xsl:sequence select="$res/atoms[1]"/>
617 <xsl:when test="let $fn := value/malval/lvalue/malval[1]
618 return $fn/@kind = 'symbol' and
619 $fn/@value = 'macroexpand'">
620 <xsl:variable name="exp">
621 <xsl:call-template name="macroexpand">
622 <xsl:with-param name="ast" select="value/malval/lvalue/malval[2]"/>
623 <xsl:with-param name="env" select="$env"/>
624 <xsl:with-param name="encode-env" select="false()"/>
626 <xsl:sequence select="$atoms"/>
628 <xsl:sequence select="$exp/value"/>
629 <xsl:if test="$encode-env">
630 <env data="{env:serialise($env)}"/>
632 <xsl:sequence select="$atoms"/>
635 <xsl:variable name="new_list">
636 <xsl:call-template name="eval_ast">
637 <xsl:with-param name="atoms" select="$atoms"/>
638 <xsl:with-param name="env" select="$env"/>
641 <xsl:variable name="func">
642 <xsl:for-each select="$new_list">
643 <xsl:sequence select="value/malval/lvalue/malval[1]"/>
646 <xsl:variable name="args">
647 <xsl:for-each select="$new_list">
651 <xsl:for-each select="value/malval/lvalue/node()[position() != 1]">
652 <xsl:sequence select="."/>
657 <xsl:sequence select="$new_list/atoms"/>
660 <xsl:variable name="resultv">
662 <xsl:when test="$func/malval/@kind = 'userfunction'">
663 <xsl:call-template name="uapply">
664 <xsl:with-param name="env" select="$env"/>
665 <xsl:with-param name="func" select="$func"/>
666 <xsl:with-param name="args" select="$args"/>
671 <xsl:when test="$func/malval/@name = 'env??'">
672 <!-- needs access to env -->
673 <xsl:variable name="nev" select="env:dump($env)"/>
674 <xsl:variable name="value">
675 <malval kind="string" value="{$env => serialize(map{'method':'json'})}"/>
678 <xsl:sequence select="$value"/>
680 <xsl:if test="$encode-env">
681 <env data="{env:serialise($env)}"/>
683 <xsl:sequence select="$value/atoms[1]"/>
685 <xsl:when test="$func/malval/@name = 'eval'">
686 <!-- needs access to env -->
687 <xsl:variable name="venv" select="env:replEnv($env)"/>
688 <xsl:variable name="form">
690 <xsl:sequence select="$args/value/malval/lvalue/malval[1]"/>
692 <xsl:sequence select="$atoms"/>
694 <xsl:variable name="value">
695 <xsl:for-each select="$form">
696 <xsl:call-template name="EVAL">
697 <xsl:with-param name="env" select="$venv"/>
698 <xsl:with-param name="encode-env" select="$encode-env"/>
702 <xsl:sequence select="$value/data/value"/>
703 <xsl:if test="$encode-env">
704 <env data="{env:serialise(env:swap-replEnv($env, env:deserialise($value/env/@data)))}"/>
706 <xsl:sequence select="$value/atoms[1]"/>
708 <xsl:when test="$func/malval/@name = 'atom'">
709 <!-- needs access to atoms -->
710 <xsl:variable name="atom-ident" select="count($atoms/atom)"/>
712 <malval kind="atom" value="{$atom-ident}"/>
715 <xsl:for-each select="$atoms/atom">
716 <xsl:sequence select="."/>
718 <atom identity="{$atom-ident}">
719 <xsl:sequence select="$args/value/malval/lvalue/malval[1]"/>
723 <xsl:when test="$func/malval/@name = 'deref'">
724 <!-- needs access to atoms -->
726 <xsl:sequence select="$atoms/atom[@identity = $args/value/malval/lvalue/malval[1]/@value]/malval"/>
728 <xsl:sequence select="$atoms"/>
730 <xsl:when test="$func/malval/@name = 'reset!'">
731 <!-- needs access to atoms -->
732 <xsl:variable name="atom-ident" select="$args/value/malval/lvalue/malval[1]/@value"/>
733 <xsl:variable name="newv" select="$args/value/malval/lvalue/malval[2]"/>
735 <xsl:sequence select="$newv"/>
738 <xsl:for-each select="$atoms/atom[@identity != $atom-ident]">
739 <xsl:sequence select="."/>
741 <atom identity="{$atom-ident}">
742 <xsl:sequence select="$newv"/>
746 <xsl:when test="$func/malval/@name = 'swap!'">
747 <!-- needs access to atoms -->
748 <xsl:variable name="atom-ident" select="$args/value/malval/lvalue/malval[1]/@value"/>
749 <xsl:variable name="atom-value" select="$atoms/atom[@identity = $atom-ident]/malval"/>
750 <xsl:variable name="fn" select="$args/value/malval/lvalue/malval[2]"/>
751 <xsl:variable name="newlist">
755 <xsl:sequence select="$fn"/>
756 <xsl:sequence select="$atom-value"/>
757 <xsl:sequence select="$args/value/malval/lvalue/malval[position() > 2]"/>
761 <xsl:sequence select="$atoms"/>
763 <xsl:variable name="newv">
764 <xsl:for-each select="$newlist">
765 <xsl:call-template name="EVAL">
766 <xsl:with-param name="env" select="$env"/>
767 <xsl:with-param name="encode-env" select="false()"/>
771 <xsl:sequence select="$newv/data/value"/>
773 <xsl:for-each select="$newv/atoms[1]/atom[@identity != $atom-ident]">
774 <xsl:sequence select="."/>
776 <atom identity="{$atom-ident}">
777 <xsl:sequence select="$newv/data/value/malval"/>
780 <xsl:sequence select="$newv/env"/>
783 <xsl:call-template name="core-apply">
784 <xsl:with-param name="func" select="$func"/>
785 <xsl:with-param name="args" select="$args"/>
787 <xsl:sequence select="$atoms"/>
793 <xsl:for-each select="$resultv">
795 <xsl:when test="empty(env)">
796 <xsl:if test="$encode-env">
797 <env data="{env:serialise($env)}"/>
801 <xsl:sequence select="env"/>
804 <xsl:sequence select="atoms[1]"/>
805 <xsl:sequence select="value"/>
814 <xsl:call-template name="eval_ast">
815 <xsl:with-param name="atoms" select="$atoms"/>
816 <xsl:with-param name="env" select="$env"/>
818 <xsl:if test="$encode-env">
819 <env data="{env:serialise($env)}"/>
821 <!-- <xsl:sequence select="$atoms"/> -->
826 <xsl:sequence select="$data/value"/>
828 <xsl:if test="$encode-env">
829 <env data="{$data/env/@data}"/>
831 <xsl:sequence select="$data/atoms[1]"/>
833 <xsl:template name="READ">
834 <xsl:variable name="context">
836 <xsl:copy-of select="stdin/text()"/>
839 <xsl:variable name="form">
840 <xsl:sequence select="state/atoms[1]"/>
841 <xsl:for-each select="$context">
842 <xsl:call-template name="malreader-read_str"/>
845 <xsl:for-each select="$form">
846 <xsl:if test="error">
847 <xsl:value-of select="error(QName('MAL', 'Error'), string(error))"/>
849 <xsl:sequence select="."/>
852 <xsl:function name="fn:group_consec">
853 <xsl:param name="nodes"/>
854 <xsl:variable name="groups">
855 <xsl:for-each-group select="$nodes" group-by="position() mod 2">
857 <xsl:when test="position() = 1">
859 <xsl:sequence select="current-group()"/>
864 <xsl:sequence select="current-group()"/>
868 </xsl:for-each-group>
870 <xsl:iterate select="1 to count($groups/first/*)">
872 <xsl:variable name="idx" select="number(.)"/>
874 <xsl:sequence select="$groups/first/node()[position() = $idx]"/>
877 <xsl:sequence select="$groups/second/node()[position() = $idx]"/>
882 <xsl:function name="fn:is-pair">
883 <xsl:param name="list"/>
884 <xsl:sequence select="($list/@kind = 'list' or $list/@kind = 'vector') and
885 count($list/lvalue/malval) != 0"/>
887 <xsl:function name="fn:is-macro-call">
888 <xsl:param name="ast"/>
889 <xsl:param name="env"/>
892 select="$ast/@kind = 'list' and
893 $ast/lvalue/malval[1]/@kind = 'symbol' and
894 (let $fn := env:get-noerror($env, $ast/lvalue/malval[1]/@value)
895 return not(empty($fn)) and
896 $fn/malval/is_macro/text() = 'true')"/>
897 <xsl:sequence select="$res"/>