aboutsummaryrefslogtreecommitdiff
path: root/src/interp/ptrees.boot.pamphlet
diff options
context:
space:
mode:
Diffstat (limited to 'src/interp/ptrees.boot.pamphlet')
-rw-r--r--src/interp/ptrees.boot.pamphlet45
1 files changed, 44 insertions, 1 deletions
diff --git a/src/interp/ptrees.boot.pamphlet b/src/interp/ptrees.boot.pamphlet
index dea41bdc..414b09af 100644
--- a/src/interp/ptrees.boot.pamphlet
+++ b/src/interp/ptrees.boot.pamphlet
@@ -62,6 +62,9 @@ THE PFORM DATA STRUCTURE
<<*>>=
<<license>>
+import '"posit"
+import '"serror"
+
)package "BOOT"
--% SPECIAL NODES
@@ -741,7 +744,47 @@ pfFlattenApp x==
[x]
-
+--% Utility operations on Abstract Syntax Trees
+
+-- An S-expression which people can read.
+pfSexpr pform ==
+ strip pform where
+ strip pform ==
+ pfId? pform => pfIdSymbol pform
+ pfLiteral? pform => pfLiteralString pform
+ pfLeaf? pform => tokPart pform
+
+ pfApplication? pform =>
+ args :=
+ a := pfApplicationArg pform
+ if pfTuple? a then pf0TupleParts a else [a]
+ [strip p for p in cons(pfApplicationOp pform, args)]
+
+ cons(pfAbSynOp pform, [strip p for p in pfParts pform])
+
+pfCopyWithPos( pform , pos ) ==
+ pfLeaf? pform => pfLeaf( pfAbSynOp pform , tokPart pform , pos )
+ pfTree( pfAbSynOp pform , [ pfCopyWithPos( p , pos ) for p in pfParts pform ] )
+
+pfMapParts(f, pform) ==
+ pfLeaf? pform => pform
+ parts0 := pfParts pform
+ parts1 := [FUNCALL(f, p) for p in parts0]
+ -- Return the original if no changes.
+ same := true
+ for p0 in parts0 for p1 in parts1 while same repeat same := EQ(p0,p1)
+ same => pform
+ pfTree(pfAbSynOp pform, parts1)
+
+
+pf0ApplicationArgs pform ==
+ arg := pfApplicationArg pform
+ pf0FlattenSyntacticTuple arg
+
+pf0FlattenSyntacticTuple pform ==
+ not pfTuple? pform => [pform]
+ [:pf0FlattenSyntacticTuple p for p in pf0TupleParts pform]
+
@
\eject
\begin{thebibliography}{99}