Add M\ syntax for method literals
parent
42f3b0e16e
commit
3752c706da
|
@ -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 ;
|
||||||
|
|
|
@ -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 ;"
|
||||||
|
|
|
@ -62,6 +62,7 @@ IN: bootstrap.syntax
|
||||||
"W{"
|
"W{"
|
||||||
"["
|
"["
|
||||||
"\\"
|
"\\"
|
||||||
|
"M\\"
|
||||||
"]"
|
"]"
|
||||||
"delimiter"
|
"delimiter"
|
||||||
"f"
|
"f"
|
||||||
|
|
|
@ -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."
|
||||||
} ;
|
} ;
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue