diff --git a/extra/fuel/eval/authors.txt b/extra/fuel/eval/authors.txt new file mode 100644 index 0000000000..48f802a3cd --- /dev/null +++ b/extra/fuel/eval/authors.txt @@ -0,0 +1 @@ +Jose Antonio Ortega Ruiz \ No newline at end of file diff --git a/extra/fuel/eval/eval-tests.factor b/extra/fuel/eval/eval-tests.factor new file mode 100644 index 0000000000..845e912762 --- /dev/null +++ b/extra/fuel/eval/eval-tests.factor @@ -0,0 +1,4 @@ +! Copyright (C) 2009 Jose Antonio Ortega Ruiz. +! See http://factorcode.org/license.txt for BSD license. +USING: tools.test fuel.eval ; +IN: fuel.eval.tests diff --git a/extra/fuel/eval/eval.factor b/extra/fuel/eval/eval.factor new file mode 100644 index 0000000000..c3b1a8a3f2 --- /dev/null +++ b/extra/fuel/eval/eval.factor @@ -0,0 +1,75 @@ +! Copyright (C) 2009 Jose Antonio Ortega Ruiz. +! See http://factorcode.org/license.txt for BSD license. +USING: accessors arrays compiler.units continuations debugger +fuel.pprint io io.streams.string kernel namespaces parser sequences +vectors vocabs.parser ; + +IN: fuel.eval + +TUPLE: fuel-status in use restarts ; + +SYMBOL: fuel-status-stack +V{ } clone fuel-status-stack set-global + +SYMBOL: fuel-eval-result +f fuel-eval-result set-global + +SYMBOL: fuel-eval-output +f fuel-eval-result set-global + +SYMBOL: fuel-eval-res-flag +t fuel-eval-res-flag set-global + +: fuel-eval-restartable? ( -- ? ) + fuel-eval-res-flag get-global ; inline + +: fuel-push-status ( -- ) + in get use get clone restarts get-global clone + fuel-status boa + fuel-status-stack get push ; + +: fuel-pop-restarts ( restarts -- ) + fuel-eval-restartable? [ drop ] [ clone restarts set-global ] if ; inline + +: fuel-pop-status ( -- ) + fuel-status-stack get empty? [ + fuel-status-stack get pop + [ in>> in set ] + [ use>> clone use set ] + [ restarts>> fuel-pop-restarts ] tri + ] unless ; + +: fuel-forget-error ( -- ) f error set-global ; inline +: fuel-forget-result ( -- ) f fuel-eval-result set-global ; inline +: fuel-forget-output ( -- ) f fuel-eval-output set-global ; inline +: fuel-forget-status ( -- ) + fuel-forget-error fuel-forget-result fuel-forget-output ; inline + +: fuel-send-retort ( -- ) + error get fuel-eval-result get-global fuel-eval-output get-global + 3array fuel-pprint flush nl "<~FUEL~>" write nl flush ; + +: (fuel-begin-eval) ( -- ) + fuel-push-status fuel-forget-status ; inline + +: (fuel-end-eval) ( output -- ) + fuel-eval-output set-global fuel-send-retort fuel-pop-status ; inline + +: (fuel-eval) ( lines -- ) + [ [ parse-lines ] with-compilation-unit call ] curry + [ print-error ] recover ; inline + +: (fuel-eval-each) ( lines -- ) + [ 1vector (fuel-eval) ] each ; inline + +: (fuel-eval-usings) ( usings -- ) + [ "USING: " prepend " ;" append ] map + (fuel-eval-each) fuel-forget-error fuel-forget-output ; + +: (fuel-eval-in) ( in -- ) + [ dup "IN: " prepend 1vector (fuel-eval) in set ] when* ; inline + +: (fuel-eval-in-context) ( lines in usings -- ) + (fuel-begin-eval) + [ (fuel-eval-usings) (fuel-eval-in) (fuel-eval) ] with-string-writer + (fuel-end-eval) ; diff --git a/extra/fuel/fuel.factor b/extra/fuel/fuel.factor index 587537adcf..a399ab2776 100644 --- a/extra/fuel/fuel.factor +++ b/extra/fuel/fuel.factor @@ -1,34 +1,14 @@ ! Copyright (C) 2008, 2009 Jose Antonio Ortega Ruiz. ! See http://factorcode.org/license.txt for BSD license. -USING: accessors arrays assocs classes.tuple combinators -compiler.units continuations debugger definitions help help.crossref -help.markup help.topics io io.pathnames io.streams.string kernel lexer -make math math.order memoize namespaces parser prettyprint quotations -sequences sets sorting source-files strings summary tools.crossref -tools.scaffold tools.vocabs tools.vocabs.browser vectors vocabs -vocabs.loader vocabs.parser words ; +USING: accessors arrays assocs compiler.units definitions fuel.eval +fuel.help help.markup help.topics io.pathnames kernel math math.order +memoize namespaces parser sequences sets sorting tools.crossref +tools.scaffold tools.vocabs vocabs vocabs.loader vocabs.parser words ; IN: fuel -! Evaluation status: - -TUPLE: fuel-status in use restarts ; - -SYMBOL: fuel-status-stack -V{ } clone fuel-status-stack set-global - -SYMBOL: fuel-eval-result -f fuel-eval-result set-global - -SYMBOL: fuel-eval-output -f fuel-eval-result set-global - -SYMBOL: fuel-eval-res-flag -t fuel-eval-res-flag set-global - -: fuel-eval-restartable? ( -- ? ) - fuel-eval-res-flag get-global ; inline +! Evaluation : fuel-eval-restartable ( -- ) t fuel-eval-res-flag set-global ; inline @@ -36,156 +16,64 @@ t fuel-eval-res-flag set-global : fuel-eval-non-restartable ( -- ) f fuel-eval-res-flag set-global ; inline -: fuel-push-status ( -- ) - in get use get clone restarts get-global clone - fuel-status boa - fuel-status-stack get push ; - -: fuel-pop-restarts ( restarts -- ) - fuel-eval-restartable? [ drop ] [ clone restarts set-global ] if ; inline - -: fuel-pop-status ( -- ) - fuel-status-stack get empty? [ - fuel-status-stack get pop - [ in>> in set ] - [ use>> clone use set ] - [ restarts>> fuel-pop-restarts ] tri - ] unless ; - -! Lispy pretty printing - -GENERIC: fuel-pprint ( obj -- ) - -M: object fuel-pprint pprint ; inline - -: fuel-maybe-scape ( ch -- seq ) - dup "\\\"?#()[]'`" member? [ CHAR: \ swap 2array ] [ 1array ] if ; - -M: word fuel-pprint - name>> V{ } clone [ fuel-maybe-scape append ] reduce >string write ; - -M: f fuel-pprint drop "nil" write ; inline - -M: integer fuel-pprint pprint ; inline - -M: string fuel-pprint pprint ; inline - -: fuel-pprint-sequence ( seq open close -- ) - [ write ] dip swap [ " " write ] [ fuel-pprint ] interleave write ; inline - -M: sequence fuel-pprint "(" ")" fuel-pprint-sequence ; inline - -M: quotation fuel-pprint "[" "]" fuel-pprint-sequence ; inline - -M: tuple fuel-pprint tuple>array fuel-pprint ; inline - -M: continuation fuel-pprint drop ":continuation" write ; inline - -M: restart fuel-pprint name>> fuel-pprint ; inline - -SYMBOL: :restarts - -: fuel-restarts ( obj -- seq ) - compute-restarts :restarts prefix ; inline - -M: condition fuel-pprint - [ error>> ] [ fuel-restarts ] bi 2array condition prefix fuel-pprint ; - -M: lexer-error fuel-pprint - { - [ line>> ] - [ column>> ] - [ line-text>> ] - [ fuel-restarts ] - } cleave 4array lexer-error prefix fuel-pprint ; - -M: source-file-error fuel-pprint - [ file>> ] [ error>> ] bi 2array source-file-error prefix - fuel-pprint ; - -M: source-file fuel-pprint path>> fuel-pprint ; - -! Evaluation vocabulary +: fuel-eval-in-context ( lines in usings -- ) + (fuel-eval-in-context) ; : fuel-eval-set-result ( obj -- ) clone fuel-eval-result set-global ; inline -: fuel-retort ( -- ) - error get fuel-eval-result get-global fuel-eval-output get-global - 3array fuel-pprint flush nl "<~FUEL~>" write nl flush ; - -: fuel-forget-error ( -- ) f error set-global ; inline -: fuel-forget-result ( -- ) f fuel-eval-result set-global ; inline -: fuel-forget-output ( -- ) f fuel-eval-output set-global ; inline -: fuel-forget-status ( -- ) - fuel-forget-error fuel-forget-result fuel-forget-output ; inline - -: (fuel-begin-eval) ( -- ) - fuel-push-status fuel-forget-status ; inline - -: (fuel-end-eval) ( output -- ) - fuel-eval-output set-global fuel-retort fuel-pop-status ; inline - -: (fuel-eval) ( lines -- ) - [ [ parse-lines ] with-compilation-unit call ] curry - [ print-error ] recover ; inline - -: (fuel-eval-each) ( lines -- ) - [ 1vector (fuel-eval) ] each ; inline - -: (fuel-eval-usings) ( usings -- ) - [ "USING: " prepend " ;" append ] map - (fuel-eval-each) fuel-forget-error fuel-forget-output ; - -: (fuel-eval-in) ( in -- ) - [ dup "IN: " prepend 1vector (fuel-eval) in set ] when* ; inline - -: fuel-eval-in-context ( lines in usings -- ) - (fuel-begin-eval) - [ (fuel-eval-usings) (fuel-eval-in) (fuel-eval) ] with-string-writer - (fuel-end-eval) ; +: fuel-retort ( -- ) fuel-send-retort ; inline ! Loading files +<PRIVATE + SYMBOL: :uses : fuel-set-use-hook ( -- ) [ amended-use get clone :uses prefix fuel-eval-set-result ] print-use-hook set ; +: (fuel-get-uses) ( lines -- ) + [ parse-fresh drop ] curry with-compilation-unit ; inline + +PRIVATE> + : fuel-run-file ( path -- ) [ fuel-set-use-hook run-file ] curry with-scope ; inline : fuel-with-autouse ( ... quot: ( ... -- ... ) -- ... ) [ auto-use? on fuel-set-use-hook call ] curry with-scope ; inline -: (fuel-get-uses) ( lines -- ) - [ parse-fresh drop ] curry with-compilation-unit ; inline - : fuel-get-uses ( lines -- ) [ (fuel-get-uses) ] curry fuel-with-autouse ; ! Edit locations +<PRIVATE + : fuel-normalize-loc ( seq -- path line ) [ dup length 0 > [ first (normalize-path) ] [ drop f ] if ] [ dup length 1 > [ second ] [ drop 1 ] if ] bi ; -: fuel-get-edit-location ( word -- ) - where fuel-normalize-loc 2array fuel-eval-set-result ; inline +: fuel-get-loc ( object -- ) + fuel-normalize-loc 2array fuel-eval-set-result ; + +PRIVATE> + +: fuel-get-edit-location ( word -- ) where fuel-get-loc ; inline : fuel-get-vocab-location ( vocab -- ) >vocab-link fuel-get-edit-location ; inline -: fuel-get-doc-location ( word -- ) - props>> "help-loc" swap at - fuel-normalize-loc 2array fuel-eval-set-result ; +: fuel-get-doc-location ( word -- ) props>> "help-loc" swap at fuel-get-loc ; -: fuel-get-article-location ( name -- ) - article loc>> fuel-normalize-loc 2array fuel-eval-set-result ; +: fuel-get-article-location ( name -- ) article loc>> fuel-get-loc ; ! Cross-references +<PRIVATE + : fuel-word>xref ( word -- xref ) [ name>> ] [ vocabulary>> ] [ where fuel-normalize-loc ] tri 4array ; @@ -195,6 +83,11 @@ SYMBOL: :uses : fuel-format-xrefs ( seq -- seq' ) [ word? ] filter [ fuel-word>xref ] map ; inline +: (fuel-index) ( seq -- seq ) + [ [ >link name>> ] [ article-title ] bi 2array \ $subsection prefix ] map ; + +PRIVATE> + : fuel-callers-xref ( word -- ) usage fuel-format-xrefs fuel-sort-xrefs fuel-eval-set-result ; inline @@ -207,23 +100,19 @@ SYMBOL: :uses : fuel-vocab-xref ( vocab -- ) words fuel-format-xrefs fuel-eval-set-result ; inline +: fuel-index ( quot: ( -- seq ) -- ) + call (fuel-index) fuel-eval-set-result ; inline + ! Completion support +<PRIVATE + : fuel-filter-prefix ( seq prefix -- seq ) [ drop-prefix nip length 0 = ] curry filter prune ; inline : (fuel-get-vocabs) ( -- seq ) all-vocabs-seq [ vocab-name ] map ; inline -: fuel-get-vocabs ( -- ) - (fuel-get-vocabs) fuel-eval-set-result ; inline - -: fuel-get-vocabs/prefix ( prefix -- ) - (fuel-get-vocabs) swap fuel-filter-prefix fuel-eval-set-result ; inline - -: fuel-vocab-summary ( name -- ) - >vocab-link summary fuel-eval-set-result ; inline - MEMO: (fuel-vocab-words) ( name -- seq ) >vocab-link words [ name>> ] map ; @@ -237,151 +126,48 @@ MEMO: (fuel-vocab-words) ( name -- seq ) [ fuel-vocabs-words ] [ fuel-current-words ] if* natural-sort swap fuel-filter-prefix ; +PRIVATE> + +: fuel-get-vocabs ( -- ) + (fuel-get-vocabs) fuel-eval-set-result ; + +: fuel-get-vocabs/prefix ( prefix -- ) + (fuel-get-vocabs) swap fuel-filter-prefix fuel-eval-set-result ; + : fuel-get-words ( prefix names -- ) - (fuel-get-words) fuel-eval-set-result ; inline + (fuel-get-words) fuel-eval-set-result ; ! Help support -MEMO: fuel-articles-seq ( -- seq ) - articles get values ; +: fuel-get-article ( name -- ) article fuel-eval-set-result ; -: fuel-find-articles ( title -- seq ) - [ [ article-title ] dip = ] curry fuel-articles-seq swap filter ; +MEMO: fuel-get-article-title ( name -- ) + articles get at [ article-title ] [ f ] if* fuel-eval-set-result ; -MEMO: fuel-find-article ( title -- article/f ) - fuel-find-articles dup empty? [ drop f ] [ first ] if ; +: fuel-word-help ( name -- ) (fuel-word-help) fuel-eval-set-result ; -MEMO: fuel-article-title ( name -- title/f ) - articles get at [ article-title ] [ f ] if* ; +: fuel-word-see ( name -- ) (fuel-word-see) fuel-eval-set-result ; -: fuel-get-article ( name -- ) - article fuel-eval-set-result ; +: fuel-vocab-help ( name -- ) (fuel-vocab-help) fuel-eval-set-result ; -: fuel-value-str ( word -- str ) - [ pprint-short ] with-string-writer ; inline - -: fuel-definition-str ( word -- str ) - [ see ] with-string-writer ; inline - -: fuel-methods-str ( word -- str ) - methods dup empty? not [ - [ [ see nl ] each ] with-string-writer - ] [ drop f ] if ; inline - -: fuel-related-words ( word -- seq ) - dup "related" word-prop remove ; inline - -: fuel-parent-topics ( word -- seq ) - help-path [ dup article-title swap 2array ] map ; inline - -: (fuel-word-help) ( word -- element ) - \ article swap dup article-title swap - [ - { - [ fuel-parent-topics [ \ $doc-path prefix , ] unless-empty ] - [ \ $vocabulary swap vocabulary>> 2array , ] - [ word-help % ] - [ fuel-related-words [ \ $related swap 2array , ] unless-empty ] - [ get-global [ \ $value swap fuel-value-str 2array , ] when* ] - [ \ $definition swap fuel-definition-str 2array , ] - [ fuel-methods-str [ \ $methods swap 2array , ] when* ] - } cleave - ] { } make 3array ; - -MEMO: fuel-find-word ( name -- word/f ) - [ [ name>> ] dip = ] curry all-words swap filter - dup empty? not [ first ] [ drop f ] if ; - -: fuel-word-help ( name -- ) - fuel-find-word [ [ auto-use? on (fuel-word-help) ] with-scope ] [ f ] if* - fuel-eval-set-result ; inline - -: (fuel-word-see) ( word -- elem ) - [ name>> \ article swap ] - [ [ see ] with-string-writer \ $code swap 2array ] bi 3array ; inline - -: fuel-word-see ( name -- ) - fuel-find-word [ [ auto-use? on (fuel-word-see) ] with-scope ] [ f ] if* - fuel-eval-set-result ; inline - -: fuel-vocab-help-row ( vocab -- element ) - [ vocab-status-string ] [ vocab-name ] [ summary ] tri 3array ; - -: fuel-vocab-help-root-heading ( root -- element ) - [ "Children from " prepend ] [ "Other children" ] if* \ $heading swap 2array ; - -SYMBOL: vocab-list - -: fuel-vocab-help-table ( vocabs -- element ) - [ fuel-vocab-help-row ] map vocab-list prefix ; - -: fuel-vocab-list ( assoc -- seq ) - [ - [ drop f ] [ - [ fuel-vocab-help-root-heading ] - [ fuel-vocab-help-table ] bi* - [ 2array ] [ drop f ] if* - ] if-empty - ] { } assoc>map [ ] filter ; - -: fuel-vocab-children-help ( name -- element ) - all-child-vocabs fuel-vocab-list ; inline - -: fuel-vocab-describe-words ( name -- element ) - [ describe-words ] with-string-writer \ describe-words swap 2array ; inline - -: (fuel-vocab-help) ( name -- element ) - dup require \ article swap dup >vocab-link - [ - { - [ vocab-authors [ \ $authors prefix , ] when* ] - [ vocab-tags [ \ $tags prefix , ] when* ] - [ summary [ { $heading "Summary" } swap 2array , ] when* ] - [ drop \ $nl , ] - [ vocab-help [ article content>> % ] when* ] - [ name>> fuel-vocab-describe-words , ] - [ name>> fuel-vocab-children-help % ] - } cleave - ] { } make 3array ; - -: fuel-vocab-help ( name -- ) - dup empty? [ fuel-vocab-children-help ] [ (fuel-vocab-help) ] if - fuel-eval-set-result ; inline - -: (fuel-index) ( seq -- seq ) - [ [ >link name>> ] [ article-title ] bi 2array \ $subsection prefix ] map ; - -: fuel-index ( quot: ( -- seq ) -- ) - call (fuel-index) fuel-eval-set-result ; inline - -MEMO: (fuel-get-vocabs/author) ( author -- element ) - [ "Vocabularies by " prepend \ $heading swap 2array ] - [ authored fuel-vocab-list ] bi 2array ; - -: fuel-get-vocabs/author ( author -- ) - (fuel-get-vocabs/author) fuel-eval-set-result ; - -MEMO: (fuel-get-vocabs/tag) ( tag -- element ) - [ "Vocabularies tagged " prepend \ $heading swap 2array ] - [ tagged fuel-vocab-list ] bi 2array ; +: fuel-vocab-summary ( name -- ) + (fuel-vocab-summary) fuel-eval-set-result ; : fuel-get-vocabs/tag ( tag -- ) (fuel-get-vocabs/tag) fuel-eval-set-result ; +: fuel-get-vocabs/author ( author -- ) + (fuel-get-vocabs/author) fuel-eval-set-result ; + ! Scaffold support : fuel-scaffold-vocab ( root name devname -- ) - developer-name set - [ scaffold-vocab ] 2keep [ (normalize-path) ] dip dup - append-path append-path ".factor" append fuel-eval-set-result ; + developer-name set dup [ scaffold-vocab ] dip + dup require vocab-source-path (normalize-path) fuel-eval-set-result ; : fuel-scaffold-help ( name devname -- ) developer-name set dup require dup scaffold-help vocab-docs-path (normalize-path) fuel-eval-set-result ; -! -run=fuel support - -: fuel-startup ( -- ) "listener" run-file ; inline - -MAIN: fuel-startup +: fuel-scaffold-get-root ( name -- ) find-vocab-root fuel-eval-set-result ; \ No newline at end of file diff --git a/extra/fuel/help/authors.txt b/extra/fuel/help/authors.txt new file mode 100644 index 0000000000..48f802a3cd --- /dev/null +++ b/extra/fuel/help/authors.txt @@ -0,0 +1 @@ +Jose Antonio Ortega Ruiz \ No newline at end of file diff --git a/extra/fuel/help/help-tests.factor b/extra/fuel/help/help-tests.factor new file mode 100644 index 0000000000..3c6ca6f8b5 --- /dev/null +++ b/extra/fuel/help/help-tests.factor @@ -0,0 +1,4 @@ +! Copyright (C) 2009 Jose Antonio Ortega Ruiz. +! See http://factorcode.org/license.txt for BSD license. +USING: tools.test fuel.help ; +IN: fuel.help.tests diff --git a/extra/fuel/help/help.factor b/extra/fuel/help/help.factor new file mode 100644 index 0000000000..537e92ddd8 --- /dev/null +++ b/extra/fuel/help/help.factor @@ -0,0 +1,108 @@ +! Copyright (C) 2009 Jose Antonio Ortega Ruiz. +! See http://factorcode.org/license.txt for BSD license. + +USING: accessors arrays assocs combinators help help.crossref +help.markup help.topics io io.streams.string kernel make memoize +namespaces parser prettyprint sequences summary tools.vocabs +tools.vocabs.browser vocabs vocabs.loader words ; + +IN: fuel.help + +<PRIVATE + +MEMO: fuel-find-word ( name -- word/f ) + [ [ name>> ] dip = ] curry all-words swap filter + dup empty? not [ first ] [ drop f ] if ; + +: fuel-value-str ( word -- str ) + [ pprint-short ] with-string-writer ; inline + +: fuel-definition-str ( word -- str ) + [ see ] with-string-writer ; inline + +: fuel-methods-str ( word -- str ) + methods dup empty? not [ + [ [ see nl ] each ] with-string-writer + ] [ drop f ] if ; inline + +: fuel-related-words ( word -- seq ) + dup "related" word-prop remove ; inline + +: fuel-parent-topics ( word -- seq ) + help-path [ dup article-title swap 2array ] map ; inline + +: (fuel-word-element) ( word -- element ) + \ article swap dup article-title swap + [ + { + [ fuel-parent-topics [ \ $doc-path prefix , ] unless-empty ] + [ \ $vocabulary swap vocabulary>> 2array , ] + [ word-help % ] + [ fuel-related-words [ \ $related swap 2array , ] unless-empty ] + [ get-global [ \ $value swap fuel-value-str 2array , ] when* ] + [ \ $definition swap fuel-definition-str 2array , ] + [ fuel-methods-str [ \ $methods swap 2array , ] when* ] + } cleave + ] { } make 3array ; + +: fuel-vocab-help-row ( vocab -- element ) + [ vocab-status-string ] [ vocab-name ] [ summary ] tri 3array ; + +: fuel-vocab-help-root-heading ( root -- element ) + [ "Children from " prepend ] [ "Other children" ] if* \ $heading swap 2array ; + +SYMBOL: vocab-list + +: fuel-vocab-help-table ( vocabs -- element ) + [ fuel-vocab-help-row ] map vocab-list prefix ; + +: fuel-vocab-list ( assoc -- seq ) + [ + [ drop f ] [ + [ fuel-vocab-help-root-heading ] + [ fuel-vocab-help-table ] bi* + [ 2array ] [ drop f ] if* + ] if-empty + ] { } assoc>map [ ] filter ; + +: fuel-vocab-children-help ( name -- element ) + all-child-vocabs fuel-vocab-list ; inline + +: fuel-vocab-describe-words ( name -- element ) + [ describe-words ] with-string-writer \ describe-words swap 2array ; inline + +: (fuel-vocab-element) ( name -- element ) + dup require \ article swap dup >vocab-link + [ + { + [ vocab-authors [ \ $authors prefix , ] when* ] + [ vocab-tags [ \ $tags prefix , ] when* ] + [ summary [ { $heading "Summary" } swap 2array , ] when* ] + [ drop \ $nl , ] + [ vocab-help [ article content>> % ] when* ] + [ name>> fuel-vocab-describe-words , ] + [ name>> fuel-vocab-children-help % ] + } cleave + ] { } make 3array ; + +PRIVATE> + +: (fuel-word-help) ( object -- object ) + fuel-find-word [ [ auto-use? on (fuel-word-element) ] with-scope ] [ f ] if* ; + +: (fuel-word-see) ( word -- elem ) + [ name>> \ article swap ] + [ [ see ] with-string-writer \ $code swap 2array ] bi 3array ; inline + +: (fuel-vocab-summary) ( name -- str ) >vocab-link summary ; inline + +: (fuel-vocab-help) ( name -- str ) + dup empty? [ fuel-vocab-children-help ] [ (fuel-vocab-element) ] if ; + +MEMO: (fuel-get-vocabs/author) ( author -- element ) + [ "Vocabularies by " prepend \ $heading swap 2array ] + [ authored fuel-vocab-list ] bi 2array ; + +MEMO: (fuel-get-vocabs/tag) ( tag -- element ) + [ "Vocabularies tagged " prepend \ $heading swap 2array ] + [ tagged fuel-vocab-list ] bi 2array ; diff --git a/extra/fuel/pprint/authors.txt b/extra/fuel/pprint/authors.txt new file mode 100644 index 0000000000..48f802a3cd --- /dev/null +++ b/extra/fuel/pprint/authors.txt @@ -0,0 +1 @@ +Jose Antonio Ortega Ruiz \ No newline at end of file diff --git a/extra/fuel/pprint/pprint-tests.factor b/extra/fuel/pprint/pprint-tests.factor new file mode 100644 index 0000000000..a9868eacbe --- /dev/null +++ b/extra/fuel/pprint/pprint-tests.factor @@ -0,0 +1,4 @@ +! Copyright (C) 2009 Jose Antonio Ortega Ruiz. +! See http://factorcode.org/license.txt for BSD license. +USING: tools.test fuel.pprint ; +IN: fuel.pprint.tests diff --git a/extra/fuel/pprint/pprint.factor b/extra/fuel/pprint/pprint.factor new file mode 100644 index 0000000000..25f3aec14d --- /dev/null +++ b/extra/fuel/pprint/pprint.factor @@ -0,0 +1,63 @@ +! Copyright (C) 2009 Jose Antonio Ortega Ruiz. +! See http://factorcode.org/license.txt for BSD license. + +USING: accessors arrays classes.tuple combinators continuations io +kernel lexer math prettyprint quotations sequences source-files +strings words ; + +IN: fuel.pprint + +GENERIC: fuel-pprint ( obj -- ) + +<PRIVATE + +: fuel-maybe-scape ( ch -- seq ) + dup "\\\"?#()[]'`" member? [ CHAR: \ swap 2array ] [ 1array ] if ; + +SYMBOL: :restarts + +: fuel-restarts ( obj -- seq ) + compute-restarts :restarts prefix ; inline + +: fuel-pprint-sequence ( seq open close -- ) + [ write ] dip swap [ " " write ] [ fuel-pprint ] interleave write ; inline + +PRIVATE> + +M: object fuel-pprint pprint ; inline + +M: word fuel-pprint + name>> V{ } clone [ fuel-maybe-scape append ] reduce >string write ; + +M: f fuel-pprint drop "nil" write ; inline + +M: integer fuel-pprint pprint ; inline + +M: string fuel-pprint pprint ; inline + +M: sequence fuel-pprint "(" ")" fuel-pprint-sequence ; inline + +M: quotation fuel-pprint "[" "]" fuel-pprint-sequence ; inline + +M: tuple fuel-pprint tuple>array fuel-pprint ; inline + +M: continuation fuel-pprint drop ":continuation" write ; inline + +M: restart fuel-pprint name>> fuel-pprint ; inline + +M: condition fuel-pprint + [ error>> ] [ fuel-restarts ] bi 2array condition prefix fuel-pprint ; + +M: lexer-error fuel-pprint + { + [ line>> ] + [ column>> ] + [ line-text>> ] + [ fuel-restarts ] + } cleave 4array lexer-error prefix fuel-pprint ; + +M: source-file-error fuel-pprint + [ file>> ] [ error>> ] bi 2array source-file-error prefix + fuel-pprint ; + +M: source-file fuel-pprint path>> fuel-pprint ; diff --git a/misc/fuel/README b/misc/fuel/README index 2f3417a6b5..678bd25365 100644 --- a/misc/fuel/README +++ b/misc/fuel/README @@ -32,6 +32,7 @@ beast. (require 'factor-mode) * Basic usage +*** Running the listener If you're using the default factor binary and images locations inside the Factor's source tree, that should be enough to start using FUEL. @@ -97,6 +98,7 @@ beast. - C-cC-xs : extract innermost sexp (up to point) as a separate word - C-cC-xr : extract region as a separate word + - C-cC-xv : extract region as a separate vocabulary *** In the listener: diff --git a/misc/fuel/fuel-base.el b/misc/fuel/fuel-base.el index f168cdf9b8..5e8364e3a7 100644 --- a/misc/fuel/fuel-base.el +++ b/misc/fuel/fuel-base.el @@ -1,6 +1,6 @@ ;;; fuel-base.el --- Basic FUEL support code -;; Copyright (C) 2008 Jose Antonio Ortega Ruiz +;; Copyright (C) 2008 Jose Antonio Ortega Ruiz ;; See http://factorcode.org/license.txt for BSD license. ;; Author: Jose Antonio Ortega Ruiz <jao@gnu.org> diff --git a/misc/fuel/fuel-connection.el b/misc/fuel/fuel-connection.el index f9cc1fb0f3..14c4d0b36f 100644 --- a/misc/fuel/fuel-connection.el +++ b/misc/fuel/fuel-connection.el @@ -160,7 +160,7 @@ (fuel-con--send-string/wait buffer fuel-con--init-stanza 'fuel-con--establish-connection-cont - 20000) + 60000) conn)) (defun fuel-con--establish-connection-cont (ignore) diff --git a/misc/fuel/fuel-debug-uses.el b/misc/fuel/fuel-debug-uses.el index 7b90093c21..d37cf7b58d 100644 --- a/misc/fuel/fuel-debug-uses.el +++ b/misc/fuel/fuel-debug-uses.el @@ -1,6 +1,6 @@ ;;; fuel-debug-uses.el -- retrieving USING: stanzas -;; Copyright (C) 2008 Jose Antonio Ortega Ruiz +;; Copyright (C) 2008, 2009 Jose Antonio Ortega Ruiz ;; See http://factorcode.org/license.txt for BSD license. ;; Author: Jose Antonio Ortega Ruiz <jao@gnu.org> @@ -32,6 +32,9 @@ ;;; Utility functions: +(defsubst fuel-debug--chomp (s) + (replace-regexp-in-string "[\n\r\f]" "" s)) + (defun fuel-debug--file-lines (file) (when (file-readable-p file) (with-current-buffer (find-file-noselect file) @@ -40,7 +43,8 @@ (let ((lines) (in-usings)) (while (not (eobp)) (when (looking-at "^USING: ") (setq in-usings t)) - (let ((line (substring-no-properties (thing-at-point 'line) 0 -1))) + (let ((line (fuel-debug--chomp + (substring-no-properties (thing-at-point 'line))))) (when in-usings (setq line (concat "! " line))) (push line lines)) (when (and in-usings (looking-at ".*\\_<;\\_>")) (setq in-usings nil)) diff --git a/misc/fuel/fuel-listener.el b/misc/fuel/fuel-listener.el index c6835ede6b..3ad1b77978 100644 --- a/misc/fuel/fuel-listener.el +++ b/misc/fuel/fuel-listener.el @@ -73,7 +73,7 @@ buffer." (error "Could not run factor: %s is not executable" factor)) (unless (file-readable-p image) (error "Could not run factor: image file %s not readable" image)) - (message "Starting FUEL listener ...") + (message "Starting FUEL listener (this may take a while) ...") (pop-to-buffer (fuel-listener--buffer)) (make-comint-in-buffer "fuel listener" (current-buffer) factor nil "-run=listener" (format "-i=%s" image)) diff --git a/misc/fuel/fuel-markup.el b/misc/fuel/fuel-markup.el index 9e5e1c8af2..696e4ff080 100644 --- a/misc/fuel/fuel-markup.el +++ b/misc/fuel/fuel-markup.el @@ -71,7 +71,7 @@ (defun fuel-markup--article-title (name) (fuel-eval--retort-result - (fuel-eval--send/wait `(:fuel* ((,name fuel-article-title :get)) "fuel")))) + (fuel-eval--send/wait `(:fuel* ((,name fuel-get-article-title)) "fuel")))) (defun fuel-markup--link-at-point () (let ((button (condition-case nil (forward-button 0) (error nil)))) diff --git a/misc/fuel/fuel-mode.el b/misc/fuel/fuel-mode.el index f448e67d57..ed0104d1cb 100644 --- a/misc/fuel/fuel-mode.el +++ b/misc/fuel/fuel-mode.el @@ -196,6 +196,7 @@ interacting with a factor listener is at your disposal. (fuel-mode--key ?x ?s 'fuel-refactor-extract-sexp) (fuel-mode--key ?x ?r 'fuel-refactor-extract-region) +(fuel-mode--key ?x ?v 'fuel-refactor-extract-vocab) (fuel-mode--key ?d ?> 'fuel-show-callees) (fuel-mode--key ?d ?< 'fuel-show-callers) diff --git a/misc/fuel/fuel-refactor.el b/misc/fuel/fuel-refactor.el index 4bb83c06c8..38367b4cd8 100644 --- a/misc/fuel/fuel-refactor.el +++ b/misc/fuel/fuel-refactor.el @@ -13,6 +13,7 @@ ;;; Code: +(require 'fuel-scaffold) (require 'fuel-stack) (require 'fuel-syntax) (require 'fuel-base) @@ -70,7 +71,46 @@ word." (if (looking-at-p ";") (point) (fuel-syntax--end-of-symbol-pos)))) + +;;; Extract vocab: +(defun fuel-refactor--insert-using (vocab) + (save-excursion + (goto-char (point-min)) + (let ((usings (sort (cons vocab (fuel-syntax--usings)) 'string<))) + (fuel-debug--replace-usings (buffer-file-name) usings)))) + +(defun fuel-refactor--vocab-root (vocab) + (let ((cmd `(:fuel* (,vocab fuel-scaffold-get-root) "fuel"))) + (fuel-eval--retort-result (fuel-eval--send/wait cmd)))) + +(defun fuel-refactor--extract-vocab (begin end) + (when (< begin end) + (let* ((str (buffer-substring begin end)) + (buffer (current-buffer)) + (vocab (fuel-syntax--current-vocab)) + (vocab-hint (and vocab (format "%s." vocab))) + (root-hint (fuel-refactor--vocab-root vocab)) + (vocab (fuel-scaffold-vocab t vocab-hint root-hint))) + (with-current-buffer buffer + (delete-region begin end) + (fuel-refactor--insert-using vocab)) + (newline) + (insert str) + (newline) + (save-buffer) + (fuel-update-usings)))) + +(defun fuel-refactor-extract-vocab (begin end) + "Creates a new vocab with the words in current region. +The region is extended to the closest definition boundaries." + (interactive "r") + (fuel-refactor--extract-vocab (save-excursion (goto-char begin) + (mark-defun) + (point)) + (save-excursion (goto-char end) + (mark-defun) + (mark)))) (provide 'fuel-refactor) ;;; fuel-refactor.el ends here diff --git a/misc/fuel/fuel-scaffold.el b/misc/fuel/fuel-scaffold.el index 8026371def..05d825593c 100644 --- a/misc/fuel/fuel-scaffold.el +++ b/misc/fuel/fuel-scaffold.el @@ -41,25 +41,26 @@ ;;; User interface: -(defun fuel-scaffold-vocab () +(defun fuel-scaffold-vocab (&optional other-window name-hint root-hint) "Creates a directory in the given root for a new vocabulary and adds source, tests and authors.txt files. You can configure `fuel-scaffold-developer-name' (set by default to `user-full-name') for the name to be inserted in the generated files." (interactive) - (let* ((name (read-string "Vocab name: ")) + (let* ((name (read-string "Vocab name: " name-hint)) (root (completing-read "Vocab root: " (fuel-scaffold--vocab-roots) - nil t "resource:")) + nil t (or root-hint "resource:"))) (cmd `(:fuel* ((,root ,name ,fuel-scaffold-developer-name) (fuel-scaffold-vocab)) "fuel")) (ret (fuel-eval--send/wait cmd)) (file (fuel-eval--retort-result ret))) (unless file (error "Error creating vocab (%s)" (car (fuel-eval--retort-error ret)))) - (find-file file) - (goto-char (point-max)))) + (if other-window (find-file-other-window file) (find-file file)) + (goto-char (point-max)) + name)) (defun fuel-scaffold-help (&optional arg) "Creates, if it does not already exist, a help file with