Merge branch 'master' of git://factorcode.org/git/factor

db4
Slava Pestov 2008-11-08 20:36:29 -06:00
commit f53e9c654c
12 changed files with 76 additions and 46 deletions

View File

@ -1,7 +1,7 @@
! Copyright (C) 2008 Slava Pestov, Eduardo Cavazos. ! Copyright (C) 2008 Slava Pestov, Eduardo Cavazos.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: kernel sequences combinators parser splitting math USING: kernel sequences combinators parser splitting math
quotations arrays make qualified words ; quotations arrays make words ;
IN: fry IN: fry
: _ ( -- * ) "Only valid inside a fry" throw ; : _ ( -- * ) "Only valid inside a fry" throw ;

View File

@ -32,3 +32,14 @@ HELP: RENAME:
"RENAME: + math => -" "RENAME: + math => -"
"2 3 - ! => 5" } } ; "2 3 - ! => 5" } } ;
ARTICLE: "qualified" "Qualified word lookup"
"The " { $vocab-link "qualified" } " vocabulary provides a handful of parsing words which give more control over word lookup than is offered by " { $link POSTPONE: USE: } " and " { $link POSTPONE: USING: } "."
$nl
"These words are useful when there is no way to avoid using two vocabularies with identical word names in the same source file."
{ $subsection POSTPONE: QUALIFIED: }
{ $subsection POSTPONE: QUALIFIED-WITH: }
{ $subsection POSTPONE: FROM: }
{ $subsection POSTPONE: EXCLUDE: }
{ $subsection POSTPONE: RENAME: } ;
ABOUT: "qualified"

View File

@ -1,24 +1,33 @@
USING: tools.test qualified ; USING: tools.test qualified eval accessors parser ;
IN: foo IN: qualified.tests.foo
: x 1 ; : x 1 ;
IN: bar : y 5 ;
IN: qualified.tests.bar
: x 2 ; : x 2 ;
IN: baz : y 4 ;
IN: qualified.tests.baz
: x 3 ; : x 3 ;
QUALIFIED: foo QUALIFIED: qualified.tests.foo
QUALIFIED: bar QUALIFIED: qualified.tests.bar
[ 1 2 3 ] [ foo:x bar:x x ] unit-test [ 1 2 3 ] [ qualified.tests.foo:x qualified.tests.bar:x x ] unit-test
QUALIFIED-WITH: bar p QUALIFIED-WITH: qualified.tests.bar p
[ 2 ] [ p:x ] unit-test [ 2 ] [ p:x ] unit-test
RENAME: x baz => y RENAME: x qualified.tests.baz => y
[ 3 ] [ y ] unit-test [ 3 ] [ y ] unit-test
FROM: baz => x ; FROM: qualified.tests.baz => x ;
[ 3 ] [ x ] unit-test [ 3 ] [ x ] unit-test
[ 3 ] [ y ] unit-test
EXCLUDE: bar => x ; EXCLUDE: qualified.tests.bar => x ;
[ 3 ] [ x ] unit-test [ 3 ] [ x ] unit-test
[ 4 ] [ y ] unit-test
[ "USE: qualified IN: qualified.tests FROM: qualified.tests => doesnotexist ;" eval ]
[ error>> no-word-error? ] must-fail-with
[ "USE: qualified IN: qualified.tests RENAME: doesnotexist qualified.tests => blah" eval ]
[ error>> no-word-error? ] must-fail-with

View File

@ -1,12 +1,12 @@
! Copyright (C) 2007, 2008 Daniel Ehrenberg. ! Copyright (C) 2007, 2008 Daniel Ehrenberg.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: kernel sequences assocs hashtables parser lexer USING: kernel sequences assocs hashtables parser lexer
vocabs words namespaces vocabs.loader debugger sets ; vocabs words namespaces vocabs.loader debugger sets fry ;
IN: qualified IN: qualified
: define-qualified ( vocab-name prefix-name -- ) : define-qualified ( vocab-name prefix-name -- )
[ load-vocab vocab-words ] [ CHAR: : suffix ] bi* [ load-vocab vocab-words ] [ CHAR: : suffix ] bi*
[ -rot >r append r> ] curry assoc-map '[ [ [ _ ] dip append ] dip ] assoc-map
use get push ; use get push ;
: QUALIFIED: : QUALIFIED:
@ -19,27 +19,27 @@ IN: qualified
: expect=> ( -- ) scan "=>" assert= ; : expect=> ( -- ) scan "=>" assert= ;
: partial-vocab ( words name -- assoc ) : partial-vocab ( words vocab -- assoc )
dupd [ '[ dup _ lookup [ no-word-error ] unless* ]
lookup [ "No such word: " swap append throw ] unless* { } map>assoc ;
] curry map zip ;
: partial-vocab-ignoring ( words name -- assoc )
[ load-vocab vocab-words keys swap diff ] keep partial-vocab ;
: EXCLUDE:
#! Syntax: EXCLUDE: vocab => words ... ;
scan expect=>
";" parse-tokens swap partial-vocab-ignoring use get push ; parsing
: FROM: : FROM:
#! Syntax: FROM: vocab => words... ; #! Syntax: FROM: vocab => words... ;
scan dup load-vocab drop expect=> scan dup load-vocab drop expect=>
";" parse-tokens swap partial-vocab use get push ; parsing ";" parse-tokens swap partial-vocab use get push ; parsing
: partial-vocab-excluding ( words vocab -- assoc )
[ load-vocab vocab-words keys swap diff ] keep partial-vocab ;
: EXCLUDE:
#! Syntax: EXCLUDE: vocab => words ... ;
scan expect=>
";" parse-tokens swap partial-vocab-excluding use get push ; parsing
: RENAME: : RENAME:
#! Syntax: RENAME: word vocab => newname #! Syntax: RENAME: word vocab => newname
scan scan dup load-vocab drop lookup [ "No such word" throw ] unless* scan scan dup load-vocab drop
dupd lookup [ ] [ no-word-error ] ?if
expect=> expect=>
scan associate use get push ; parsing scan associate use get push ; parsing

View File

@ -97,7 +97,7 @@ M: list focusable-child* drop t ;
] if ; ] if ;
: select-gadget ( gadget list -- ) : select-gadget ( gadget list -- )
swap over children>> index tuck children>> index
[ swap select-index ] [ drop ] if* ; [ swap select-index ] [ drop ] if* ;
: clamp-loc ( point max -- point ) : clamp-loc ( point max -- point )

View File

@ -41,7 +41,7 @@ scroller H{
dup model>> dependencies>> first <x-slider> >>x dup x>> @bottom grid-add dup model>> dependencies>> first <x-slider> >>x dup x>> @bottom grid-add
dup model>> dependencies>> second <y-slider> >>y dup y>> @right grid-add dup model>> dependencies>> second <y-slider> >>y dup y>> @right grid-add
swap over model>> <viewport> >>viewport tuck model>> <viewport> >>viewport
dup viewport>> @center grid-add ; dup viewport>> @center grid-add ;
: <scroller> ( gadget -- scroller ) scroller new-scroller ; : <scroller> ( gadget -- scroller ) scroller new-scroller ;

View File

@ -69,7 +69,7 @@ $nl
{ $subsection POSTPONE: PRIVATE> } { $subsection POSTPONE: PRIVATE> }
{ $subsection "vocabulary-search-errors" } { $subsection "vocabulary-search-errors" }
{ $subsection "vocabulary-search-shadow" } { $subsection "vocabulary-search-shadow" }
{ $see-also "words" } ; { $see-also "words" "qualified" } ;
ARTICLE: "reading-ahead" "Reading ahead" ARTICLE: "reading-ahead" "Reading ahead"
"Parsing words can consume input:" "Parsing words can consume input:"

View File

@ -71,10 +71,10 @@ ERROR: no-current-vocab ;
] keep ] keep
] { } map>assoc ; ] { } map>assoc ;
TUPLE: no-word-error name ; ERROR: no-word-error name ;
: no-word ( name -- newword ) : no-word ( name -- newword )
dup no-word-error boa dup \ no-word-error boa
swap words-named [ forward-reference? not ] filter swap words-named [ forward-reference? not ] filter
word-restarts throw-restarts word-restarts throw-restarts
dup vocabulary>> (use+) ; dup vocabulary>> (use+) ;

View File

@ -1,16 +1,14 @@
! Copyright (C) 2008 Eduardo Cavazos, Slava Pestov. ! Copyright (C) 2008 Eduardo Cavazos, Slava Pestov.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: kernel namespaces continuations debugger sequences fry USING: kernel namespaces continuations debugger sequences fry
io.files io.launcher mason.common mason.platform io.files io.launcher bootstrap.image qualified mason.common
mason.config ; mason.config ;
FROM: mason.config => target-os ;
IN: mason.release.tidy IN: mason.release.tidy
: common-files ( -- seq ) : common-files ( -- seq )
images [ boot-image-name ] map
{ {
"boot.x86.32.image"
"boot.x86.64.image"
"boot.macosx-ppc.image"
"boot.linux-ppc.image"
"vm" "vm"
"temp" "temp"
"logs" "logs"
@ -20,7 +18,8 @@ IN: mason.release.tidy
"unmaintained" "unmaintained"
"unfinished" "unfinished"
"build-support" "build-support"
} ; }
append ;
: remove-common-files ( -- ) : remove-common-files ( -- )
common-files [ delete-tree ] each ; common-files [ delete-tree ] each ;

View File

@ -10,14 +10,18 @@ and the callstack top is passed in EDX */
#define DS_REG %esi #define DS_REG %esi
#define RETURN_REG %eax #define RETURN_REG %eax
#define NV_TEMP_REG %rbx
#define CELL_SIZE 4 #define CELL_SIZE 4
#define STACK_PADDING 12 #define STACK_PADDING 12
#define PUSH_NONVOLATILE \ #define PUSH_NONVOLATILE \
push %ebx ; \ push %ebx ; \
push %ebp ; \
push %ebp push %ebp
#define POP_NONVOLATILE \ #define POP_NONVOLATILE \
pop %ebp ; \
pop %ebp ; \ pop %ebp ; \
pop %ebx pop %ebx

View File

@ -7,6 +7,8 @@
#define CELL_SIZE 8 #define CELL_SIZE 8
#define STACK_PADDING 56 #define STACK_PADDING 56
#define NV_TEMP_REG %rbp
#ifdef WINDOWS #ifdef WINDOWS
#define ARG0 %rcx #define ARG0 %rcx
@ -20,9 +22,11 @@
push %rdi ; \ push %rdi ; \
push %rsi ; \ push %rsi ; \
push %rbx ; \ push %rbx ; \
push %rbp ; \
push %rbp push %rbp
#define POP_NONVOLATILE \ #define POP_NONVOLATILE \
pop %rbp ; \
pop %rbp ; \ pop %rbp ; \
pop %rbx ; \ pop %rbx ; \
pop %rsi ; \ pop %rsi ; \
@ -41,9 +45,11 @@
push %rbx ; \ push %rbx ; \
push %rbp ; \ push %rbp ; \
push %r12 ; \ push %r12 ; \
push %r13 ; \
push %r13 push %r13
#define POP_NONVOLATILE \ #define POP_NONVOLATILE \
pop %r13 ; \
pop %r13 ; \ pop %r13 ; \
pop %r12 ; \ pop %r12 ; \
pop %rbp ; \ pop %rbp ; \

View File

@ -1,20 +1,21 @@
DEF(F_FASTCALL void,c_to_factor,(CELL quot)): DEF(F_FASTCALL void,c_to_factor,(CELL quot)):
PUSH_NONVOLATILE PUSH_NONVOLATILE
push ARG0 mov ARG0,NV_TEMP_REG
/* Save stack pointer */
lea -CELL_SIZE(STACK_REG),ARG0
/* Create register shadow area for Win64 */ /* Create register shadow area for Win64 */
sub $32,STACK_REG sub $32,STACK_REG
/* Save stack pointer */
lea -CELL_SIZE(STACK_REG),ARG0
call MANGLE(save_callstack_bottom) call MANGLE(save_callstack_bottom)
add $32,STACK_REG
/* Call quot-xt */ /* Call quot-xt */
mov (STACK_REG),ARG0 mov NV_TEMP_REG,ARG0
call *QUOT_XT_OFFSET(ARG0) call *QUOT_XT_OFFSET(ARG0)
pop ARG0 /* Tear down register shadow area */
add $32,STACK_REG
POP_NONVOLATILE POP_NONVOLATILE
ret ret