aboutsummaryrefslogtreecommitdiff
path: root/src/interp/ptrees.boot.pamphlet
diff options
context:
space:
mode:
authordos-reis <gdr@axiomatics.org>2007-09-13 13:06:59 +0000
committerdos-reis <gdr@axiomatics.org>2007-09-13 13:06:59 +0000
commit499600fdff22b717a57aaee6934d1dbabe2723ef (patch)
tree858e70f56a8439a1a642dcb5cf1635e3bdecb6e8 /src/interp/ptrees.boot.pamphlet
parent7491a064401ff3493d32513d9028afecf29f2e5b (diff)
downloadopen-axiom-499600fdff22b717a57aaee6934d1dbabe2723ef.tar.gz
* Makefile.pamphlet (OBJS): Don't include ptrop.$(FASLEXT).
(ptrees.$(FASLEXT)): New rule. (cparse.$(FASLEXT)): Likewise. * ptrop.boot.pamphlet: Move content to ptrees.boot.pamphlet. * ptrees.boot.pamphlet: Import posit, serror. * cparse.boot: New. Import ptrees. * cparse.boot.pamphlet: Move content to cparse.boot. Remove. * serror.boot: New. (pfSourceStok): Move to posit.boot. (npMissingMate): Move to cparse.boot. (npMissing): Likewise. (npCompMissing): Likewise. (npRecorverTrap): Likewise. (npListAndRecover): Likewise. (npMoveTo): Likewise. * serror.boot.pamphlet: Move content to serror.boot. Remove.
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}