Add M\ syntax for method literals

db4
Slava Pestov 2009-04-06 02:57:39 -05:00
parent 42f3b0e16e
commit 3752c706da
5 changed files with 22 additions and 38 deletions

View File

@ -41,18 +41,18 @@ M: effect pprint* effect>string "(" ")" surround text ;
: pprint-prefix ( word quot -- ) : pprint-prefix ( word quot -- )
<block swap pprint-word call block> ; inline <block swap pprint-word call block> ; inline
M: parsing-word pprint*
\ POSTPONE: [ pprint-word ] pprint-prefix ;
M: word pprint* M: word pprint*
dup parsing-word? [ [ pprint-word ] [ ?start-group ] [ ?end-group ] tri ;
\ POSTPONE: [ pprint-word ] pprint-prefix
] [ M: method-body pprint*
{ <block
[ "break-before" word-prop line-break ] \ M\ pprint-word
[ pprint-word ] [ "method-class" word-prop pprint-word ]
[ ?start-group ] [ "method-generic" word-prop pprint-word ] bi
[ ?end-group ] block> ;
[ "break-after" word-prop line-break ]
} cleave
] if ;
M: real pprint* number>string text ; M: real pprint* number>string text ;
@ -206,8 +206,8 @@ M: curry pprint* pprint-object ;
M: compose pprint* pprint-object ; M: compose pprint* pprint-object ;
M: wrapper pprint* M: wrapper pprint*
dup wrapped>> word? [ {
<block \ \ pprint-word wrapped>> pprint-word block> { [ dup wrapped>> method-body? ] [ wrapped>> pprint* ] }
] [ { [ dup wrapped>> word? ] [ <block \ \ pprint-word wrapped>> pprint-word block> ] }
pprint-object [ pprint-object ]
] if ; } cond ;

View File

@ -180,28 +180,6 @@ DEFER: parse-error-file
"string-layout-test" string-layout check-see "string-layout-test" string-layout check-see
] unit-test ] unit-test
! Define dummy words for the below...
: <NSRect> ( a b c d -- e ) ;
: <PixelFormat> ( -- fmt ) ;
: send ( obj -- ) ;
\ send soft "break-after" set-word-prop
: final-soft-break-test ( -- str )
{
"USING: kernel sequences ;"
"IN: prettyprint.tests"
": final-soft-break-layout ( class dim -- view )"
" [ \"alloc\" send 0 0 ] dip first2 <NSRect>"
" <PixelFormat> \"initWithFrame:pixelFormat:\" send"
" dup 1 \"setPostsBoundsChangedNotifications:\" send"
" dup 1 \"setPostsFrameChangedNotifications:\" send ;"
} ;
[ t ] [
"final-soft-break-layout" final-soft-break-test check-see
] unit-test
: narrow-test ( -- str ) : narrow-test ( -- str )
{ {
"USING: arrays combinators continuations kernel sequences ;" "USING: arrays combinators continuations kernel sequences ;"

View File

@ -62,6 +62,7 @@ IN: bootstrap.syntax
"W{" "W{"
"[" "["
"\\" "\\"
"M\\"
"]" "]"
"delimiter" "delimiter"
"f" "f"

View File

@ -167,6 +167,8 @@ $nl
ARTICLE: "syntax" "Syntax" ARTICLE: "syntax" "Syntax"
"Factor has two main forms of syntax: " { $emphasis "definition" } " syntax and " { $emphasis "literal" } " syntax. Code is data, so the syntax for code is a special case of object literal syntax. This section documents literal syntax. Definition syntax is covered in " { $link "words" } ". Extending the parser is the main topic of " { $link "parser" } "." "Factor has two main forms of syntax: " { $emphasis "definition" } " syntax and " { $emphasis "literal" } " syntax. Code is data, so the syntax for code is a special case of object literal syntax. This section documents literal syntax. Definition syntax is covered in " { $link "words" } ". Extending the parser is the main topic of " { $link "parser" } "."
{ $subsection "parser-algorithm" } { $subsection "parser-algorithm" }
{ $subsection "vocabulary-search" }
{ $subsection "top-level-forms" }
{ $subsection "syntax-comments" } { $subsection "syntax-comments" }
{ $subsection "syntax-literals" } { $subsection "syntax-literals" }
{ $subsection "syntax-immediate" } ; { $subsection "syntax-immediate" } ;
@ -762,7 +764,9 @@ HELP: >>
{ $description "Marks the end of a parse time code block." } ; { $description "Marks the end of a parse time code block." } ;
HELP: call-next-method HELP: call-next-method
{ $syntax "call-next-method" }
{ $description "Calls the next applicable method. Only valid inside a method definition. The values at the top of the stack are passed on to the next method, and they must be compatible with that method's class specializer." } { $description "Calls the next applicable method. Only valid inside a method definition. The values at the top of the stack are passed on to the next method, and they must be compatible with that method's class specializer." }
{ $notes "This word looks like an ordinary word but it is a parsing word. It cannot be factored out of a method definition, since the code expansion references the current method object directly." }
{ $errors { $errors
"Throws a " { $link no-next-method } " error if this is the least specific method, and throws an " { $link inconsistent-next-method } " error if the values at the top of the stack are not compatible with the current method's specializer." "Throws a " { $link no-next-method } " error if this is the least specific method, and throws an " { $link inconsistent-next-method } " error if the values at the top of the stack are not compatible with the current method's specializer."
} ; } ;

View File

@ -104,6 +104,7 @@ IN: bootstrap.syntax
"POSTPONE:" [ scan-word parsed ] define-core-syntax "POSTPONE:" [ scan-word parsed ] define-core-syntax
"\\" [ scan-word <wrapper> parsed ] define-core-syntax "\\" [ scan-word <wrapper> parsed ] define-core-syntax
"M\\" [ scan-word scan-word method <wrapper> parsed ] define-core-syntax
"inline" [ word make-inline ] define-core-syntax "inline" [ word make-inline ] define-core-syntax
"recursive" [ word make-recursive ] define-core-syntax "recursive" [ word make-recursive ] define-core-syntax
"foldable" [ word make-foldable ] define-core-syntax "foldable" [ word make-foldable ] define-core-syntax