diff options
-rw-r--r-- | ChangeLog | 55 | ||||
-rw-r--r-- | src/guile/skribilo/ast.scm | 13 | ||||
-rw-r--r-- | src/guile/skribilo/resolve.scm | 41 |
3 files changed, 90 insertions, 19 deletions
@@ -2,6 +2,61 @@ # arch-tag: automatic-ChangeLog--lcourtes@laas.fr--2005-mobile/skribilo--devel--1.2 # +2006-02-28 21:40:26 GMT Ludovic Courtes <ludovic.courtes@laas.fr> patch-37 + + Summary: + Slightly optimized the resolution process (added `ast-resolved?'). + Revision: + skribilo--devel--1.2--patch-37 + + * 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. + + modified files: + ChangeLog src/guile/skribilo/ast.scm + src/guile/skribilo/resolve.scm + + +2006-02-28 20:08:45 GMT Ludovic Courtes <ludovic.courtes@laas.fr> patch-36 + + Summary: + Merge from lcourtes@laas.fr--2004-libre + Revision: + skribilo--devel--1.2--patch-36 + + Patches applied: + + * lcourtes@laas.fr--2004-libre/skribilo--devel--1.2 (patch 55-59) + + - Made `make-string-replace' faster. + - `eq': Implemented the text-based markup writers. + - `eq': Added the `:renderer' option to `eq'. Support `lout'. + - Changed the way `slide' implementations are loaded. Doc is buildable now. + - Doc: Added a chapter (stub) about the `eq' package. + + new files: + doc/user/eq.skb doc/user/src/.arch-ids/eq1.skb.id + doc/user/src/.arch-ids/eq2.skb.id doc/user/src/eq1.skb + doc/user/src/eq2.skb + + modified files: + ChangeLog doc/user/user.skb src/guile/skribilo/package/eq.scm + src/guile/skribilo/package/slide.scm + src/guile/skribilo/package/slide/html.scm + src/guile/skribilo/package/slide/latex.scm + src/guile/skribilo/package/slide/lout.scm + + new patches: + lcourtes@laas.fr--2004-libre/skribilo--devel--1.2--patch-55 + lcourtes@laas.fr--2004-libre/skribilo--devel--1.2--patch-56 + lcourtes@laas.fr--2004-libre/skribilo--devel--1.2--patch-57 + lcourtes@laas.fr--2004-libre/skribilo--devel--1.2--patch-58 + lcourtes@laas.fr--2004-libre/skribilo--devel--1.2--patch-59 + + 2006-02-25 13:02:20 GMT Ludovic Courtes <ludovic.courtes@laas.fr> patch-35 Summary: diff --git a/src/guile/skribilo/ast.scm b/src/guile/skribilo/ast.scm index 1856389..3968b18 100644 --- a/src/guile/skribilo/ast.scm +++ b/src/guile/skribilo/ast.scm @@ -25,6 +25,7 @@ :use-module (skribilo utils syntax) :export (<ast> ast? ast-loc ast-loc-set! ast-parent ast->string ast->file-location + ast-resolved? <command> command? command-fmt command-body <unresolved> unresolved? unresolved-proc @@ -71,8 +72,16 @@ ;;; ====================================================================== ;;FIXME: set! location in <ast> (define-class <ast> () - (parent :accessor ast-parent :init-keyword :parent :init-value 'unspecified) - (loc :init-value #f)) + ;; Parent of this guy. + (parent :accessor ast-parent :init-keyword :parent :init-value 'unspecified) + + ;; Its source location. + (loc :init-value #f) + + ;; This slot is used as an optimization when resolving an AST: sub-parts of + ;; the tree are marked as resolved as soon as they are and don't need to be + ;; traversed again. + (resolved? :accessor ast-resolved? :init-value #f)) (define (ast? obj) (is-a? obj <ast>)) 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) |