aboutsummaryrefslogtreecommitdiff
path: root/src/guile/skribilo/resolve.scm
diff options
context:
space:
mode:
authorLudovic Courtes2006-02-28 21:40:26 +0000
committerLudovic Courtes2006-02-28 21:40:26 +0000
commitbc9090d69ebe3c2612efd830b859d4c1c896aae0 (patch)
treef22905d7e16b7a76624e1def45e7491ba708d969 /src/guile/skribilo/resolve.scm
parent9c00c232438cb83430397080e1c810aa33da460a (diff)
downloadskribilo-bc9090d69ebe3c2612efd830b859d4c1c896aae0.tar.gz
skribilo-bc9090d69ebe3c2612efd830b859d4c1c896aae0.tar.lz
skribilo-bc9090d69ebe3c2612efd830b859d4c1c896aae0.zip
Slightly optimized the resolution process (added `ast-resolved?').
* src/guile/skribilo/ast.scm (<ast>): Added a `resolved?' slot, with accessor `ast-resolved?'. * src/guile/skribilo/resolve.scm (do-resolve!)[<node>]: Check whether `ast-resolved?' is true and set it once it's resolved. git-archimport-id: lcourtes@laas.fr--2005-mobile/skribilo--devel--1.2--patch-37
Diffstat (limited to 'src/guile/skribilo/resolve.scm')
-rw-r--r--src/guile/skribilo/resolve.scm41
1 files changed, 24 insertions, 17 deletions
diff --git a/src/guile/skribilo/resolve.scm b/src/guile/skribilo/resolve.scm
index cbb939d..34d6bde 100644
--- a/src/guile/skribilo/resolve.scm
+++ b/src/guile/skribilo/resolve.scm
@@ -85,24 +85,31 @@
(define-method (do-resolve! (node <node>) engine env)
- (let ((body (slot-ref node 'body))
- (options (slot-ref node 'options))
- (parent (slot-ref node 'parent)))
- (with-debug 5 'do-resolve<body>
- (debug-item "body=" body)
- (when (eq? parent 'unspecified)
- (let ((p (assq 'parent env)))
- (slot-set! node 'parent (and (pair? p) (pair? (cdr p)) (cadr p)))
- (when (pair? options)
- (debug-item "unresolved options=" options)
- (for-each (lambda (o)
- (set-car! (cdr o)
- (do-resolve! (cadr o) engine env)))
- options)
- (debug-item "resolved options=" options))))
- (slot-set! node 'body (do-resolve! body engine env))
- node)))
+ (if (ast-resolved? node)
+ node
+ (let ((body (slot-ref node 'body))
+ (options (slot-ref node 'options))
+ (parent (slot-ref node 'parent))
+ (unresolved? (*unresolved*)))
+ (with-debug 5 'do-resolve<body>
+ (debug-item "body=" body)
+ (parameterize ((*unresolved* #f))
+ (when (eq? parent 'unspecified)
+ (let ((p (assq 'parent env)))
+ (slot-set! node 'parent
+ (and (pair? p) (pair? (cdr p)) (cadr p)))
+ (when (pair? options)
+ (debug-item "unresolved options=" options)
+ (for-each (lambda (o)
+ (set-car! (cdr o)
+ (do-resolve! (cadr o) engine env)))
+ options)
+ (debug-item "resolved options=" options))))
+ (slot-set! node 'body (do-resolve! body engine env))
+ (slot-set! node 'resolved? (not (*unresolved*))))
+ (*unresolved* (or unresolved? (not (ast-resolved? node))))
+ node))))
(define-method (do-resolve! (node <container>) engine env0)