aboutsummaryrefslogtreecommitdiff
path: root/src/boot
diff options
context:
space:
mode:
Diffstat (limited to 'src/boot')
-rw-r--r--src/boot/strap/utility.clisp25
-rw-r--r--src/boot/utility.boot16
2 files changed, 39 insertions, 2 deletions
diff --git a/src/boot/strap/utility.clisp b/src/boot/strap/utility.clisp
index e399057f..f10a1749 100644
--- a/src/boot/strap/utility.clisp
+++ b/src/boot/strap/utility.clisp
@@ -9,7 +9,13 @@
|scalarMember?| |listMember?| |reverse| |reverse!|
|lastNode| |append| |append!| |copyList| |substitute|
|substitute!| |setDifference| |applySubst| |applySubst!|
- |remove| |removeSymbol|))
+ |applySubstNQ| |remove| |removeSymbol|))
+
+(DECLAIM (FTYPE (FUNCTION (|%Thing| |%Thing| |%Thing|) |%Thing|)
+ |substitute|))
+
+(DECLAIM (FTYPE (FUNCTION (|%Thing| |%Thing| |%Thing|) |%Thing|)
+ |substitute!|))
(DECLAIM (FTYPE (FUNCTION ((|%List| |%Thing|) (|%List| |%Thing|))
(|%List| |%Thing|))
@@ -204,6 +210,23 @@
(CDR |p|))
(T |t|)))))
+(DEFUN |applySubstNQ| (|sl| |t|)
+ (PROG (|p| |tl| |hd|)
+ (RETURN
+ (COND
+ ((AND (CONSP |t|)
+ (PROGN (SETQ |hd| (CAR |t|)) (SETQ |tl| (CDR |t|)) T))
+ (COND
+ ((EQ |hd| 'QUOTE) |t|)
+ (T (SETQ |hd| (|applySubstNQ| |sl| |hd|))
+ (SETQ |tl| (|applySubstNQ| |sl| |tl|))
+ (COND
+ ((AND (EQ |hd| (CAR |t|)) (EQ |tl| (CDR |t|))) |t|)
+ (T (CONS |hd| |tl|))))))
+ ((AND (SYMBOLP |t|) (SETQ |p| (|assocSymbol| |t| |sl|)))
+ (CDR |p|))
+ (T |t|)))))
+
(DEFUN |setDifference| (|x| |y|)
(PROG (|a| |l| |p|)
(RETURN
diff --git a/src/boot/utility.boot b/src/boot/utility.boot
index 39973783..b00eac00 100644
--- a/src/boot/utility.boot
+++ b/src/boot/utility.boot
@@ -35,7 +35,10 @@ namespace BOOTTRAN
module utility (objectMember?, symbolMember?, stringMember?,
charMember?, scalarMember?, listMember?, reverse, reverse!,
lastNode, append, append!, copyList, substitute, substitute!,
- setDifference, applySubst, applySubst!,remove,removeSymbol) where
+ setDifference, applySubst, applySubst!, applySubstNQ,
+ remove,removeSymbol) where
+ substitute: (%Thing,%Thing,%Thing) -> %Thing
+ substitute!: (%Thing,%Thing,%Thing) -> %Thing
append: (%List %Thing,%List %Thing) -> %List %Thing
append!: (%List %Thing,%List %Thing) -> %List %Thing
copyList: %List %Thing -> %List %Thing
@@ -190,6 +193,17 @@ applySubst!(sl,t) ==
symbol? t and (p := assocSymbol(t,sl)) => rest p
t
+++ Like applySubst, but skip quoted materials.
+applySubstNQ(sl,t) ==
+ t is [hd,:tl] =>
+ hd is "QUOTE" => t
+ hd := applySubstNQ(sl,hd)
+ tl := applySubstNQ(sl,tl)
+ sameObject?(hd,first t) and sameObject?(tl,rest t) => t
+ [hd,:tl]
+ symbol? t and (p := assocSymbol(t,sl)) => rest p
+ t
+
--% set operations
setDifference(x,y) ==