add initial-quot: syntax for tuples
							parent
							
								
									46a50fe0b9
								
							
						
					
					
						commit
						059eb399f0
					
				| 
						 | 
					@ -80,6 +80,7 @@ IN: bootstrap.syntax
 | 
				
			||||||
    ">>"
 | 
					    ">>"
 | 
				
			||||||
    "call-next-method"
 | 
					    "call-next-method"
 | 
				
			||||||
    "initial:"
 | 
					    "initial:"
 | 
				
			||||||
 | 
					    "initial-quot:"
 | 
				
			||||||
    "read-only"
 | 
					    "read-only"
 | 
				
			||||||
    "call("
 | 
					    "call("
 | 
				
			||||||
    "execute("
 | 
					    "execute("
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
IN: classes.tuple.parser.tests
 | 
					IN: classes.tuple.parser.tests
 | 
				
			||||||
USING: accessors classes.tuple.parser lexer words classes
 | 
					USING: accessors classes.tuple.parser lexer words classes
 | 
				
			||||||
sequences math kernel slots tools.test parser compiler.units
 | 
					sequences math kernel slots tools.test parser compiler.units
 | 
				
			||||||
arrays classes.tuple eval ;
 | 
					arrays classes.tuple eval multiline ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TUPLE: test-1 ;
 | 
					TUPLE: test-1 ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -142,3 +142,17 @@ TUPLE: parsing-corner-case x ;
 | 
				
			||||||
        "    x 3 }"
 | 
					        "    x 3 }"
 | 
				
			||||||
    } "\n" join eval( -- tuple )
 | 
					    } "\n" join eval( -- tuple )
 | 
				
			||||||
] [ error>> unexpected-eof? ] must-fail-with
 | 
					] [ error>> unexpected-eof? ] must-fail-with
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[ ] [
 | 
				
			||||||
 | 
					    <" USE: sequences
 | 
				
			||||||
 | 
					    IN: classes.tuple.tests
 | 
				
			||||||
 | 
					    TUPLE: book { name initial-quot: [ "Lord of the " "Rings" append ] } ;">
 | 
				
			||||||
 | 
					    eval( -- )
 | 
				
			||||||
 | 
					] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[ ] [
 | 
				
			||||||
 | 
					    <" IN: classes.tuple.tests
 | 
				
			||||||
 | 
					    TUPLE: monster { hp virtual } ;">
 | 
				
			||||||
 | 
					    eval( -- )
 | 
				
			||||||
 | 
					] unit-test
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -50,8 +50,19 @@ M: tuple class layout-of 2 slot { word } declare ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PRIVATE>
 | 
					PRIVATE>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					: initial-value ( slot -- obj )
 | 
				
			||||||
 | 
					    dup initial>> [
 | 
				
			||||||
 | 
					        nip
 | 
				
			||||||
 | 
					    ] [
 | 
				
			||||||
 | 
					        dup initial-quot>> [
 | 
				
			||||||
 | 
					            nip call( -- obj )
 | 
				
			||||||
 | 
					        ] [
 | 
				
			||||||
 | 
					            drop f
 | 
				
			||||||
 | 
					        ] if*
 | 
				
			||||||
 | 
					    ] if* ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: initial-values ( class -- slots )
 | 
					: initial-values ( class -- slots )
 | 
				
			||||||
    all-slots [ initial>> ] map ;
 | 
					    all-slots [ initial-value ] map ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: pad-slots ( slots class -- slots' class )
 | 
					: pad-slots ( slots class -- slots' class )
 | 
				
			||||||
    [ initial-values over length tail append ] keep ; inline
 | 
					    [ initial-values over length tail append ] keep ; inline
 | 
				
			||||||
| 
						 | 
					@ -176,7 +187,7 @@ ERROR: bad-superclass class ;
 | 
				
			||||||
: compute-slot-permutation ( new-slots old-slots -- triples )
 | 
					: compute-slot-permutation ( new-slots old-slots -- triples )
 | 
				
			||||||
    [ [ [ name>> ] map ] bi@ [ index ] curry map ]
 | 
					    [ [ [ name>> ] map ] bi@ [ index ] curry map ]
 | 
				
			||||||
    [ drop [ class>> ] map ]
 | 
					    [ drop [ class>> ] map ]
 | 
				
			||||||
    [ drop [ initial>> ] map ]
 | 
					    [ drop [ initial-value ] map ]
 | 
				
			||||||
    2tri 3array flip ;
 | 
					    2tri 3array flip ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: update-slot ( old-values n class initial -- value )
 | 
					: update-slot ( old-values n class initial -- value )
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,10 +3,10 @@
 | 
				
			||||||
USING: arrays byte-arrays kernel kernel.private math namespaces
 | 
					USING: arrays byte-arrays kernel kernel.private math namespaces
 | 
				
			||||||
make sequences strings effects generic generic.standard
 | 
					make sequences strings effects generic generic.standard
 | 
				
			||||||
classes classes.algebra slots.private combinators accessors
 | 
					classes classes.algebra slots.private combinators accessors
 | 
				
			||||||
words sequences.private assocs alien quotations hashtables ;
 | 
					words sequences.private assocs alien quotations hashtables summary ;
 | 
				
			||||||
IN: slots
 | 
					IN: slots
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TUPLE: slot-spec name offset class initial read-only ;
 | 
					TUPLE: slot-spec name offset class initial initial-quot read-only ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PREDICATE: reader < word "reader" word-prop ;
 | 
					PREDICATE: reader < word "reader" word-prop ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -190,6 +190,7 @@ ERROR: bad-slot-attribute key ;
 | 
				
			||||||
    dup empty? [
 | 
					    dup empty? [
 | 
				
			||||||
        unclip {
 | 
					        unclip {
 | 
				
			||||||
            { initial: [ [ first >>initial ] [ rest ] bi ] }
 | 
					            { initial: [ [ first >>initial ] [ rest ] bi ] }
 | 
				
			||||||
 | 
					            { initial-quot: [ [ first >>initial-quot ] [ rest ] bi ] }
 | 
				
			||||||
            { read-only [ [ t >>read-only ] dip ] }
 | 
					            { read-only [ [ t >>read-only ] dip ] }
 | 
				
			||||||
            [ bad-slot-attribute ]
 | 
					            [ bad-slot-attribute ]
 | 
				
			||||||
        } case
 | 
					        } case
 | 
				
			||||||
| 
						 | 
					@ -197,7 +198,17 @@ ERROR: bad-slot-attribute key ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ERROR: bad-initial-value name ;
 | 
					ERROR: bad-initial-value name ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ERROR: duplicate-initial-values slot ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					M: duplicate-initial-values summary
 | 
				
			||||||
 | 
					    drop "Slots can either define initial: or initial-quot:, but not both" ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					: check-duplicate-initial-values ( slot-spec -- slot-spec )
 | 
				
			||||||
 | 
					    dup [ initial>> ] [ initial-quot>> ] bi and
 | 
				
			||||||
 | 
					    [ duplicate-initial-values ] when ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: check-initial-value ( slot-spec -- slot-spec )
 | 
					: check-initial-value ( slot-spec -- slot-spec )
 | 
				
			||||||
 | 
					    check-duplicate-initial-values
 | 
				
			||||||
    dup initial>> [
 | 
					    dup initial>> [
 | 
				
			||||||
        [ ] [
 | 
					        [ ] [
 | 
				
			||||||
            dup [ initial>> ] [ class>> ] bi instance?
 | 
					            dup [ initial>> ] [ class>> ] bi instance?
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -245,7 +245,9 @@ IN: bootstrap.syntax
 | 
				
			||||||
    ] define-core-syntax
 | 
					    ] define-core-syntax
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    "initial:" "syntax" lookup define-symbol
 | 
					    "initial:" "syntax" lookup define-symbol
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
 | 
					    "initial-quot:" "syntax" lookup define-symbol
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    "read-only" "syntax" lookup define-symbol
 | 
					    "read-only" "syntax" lookup define-symbol
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    "call(" [ \ call-effect parse-call( ] define-core-syntax
 | 
					    "call(" [ \ call-effect parse-call( ] define-core-syntax
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue