Hello,

The 'TUPLE:' word currently supports specifying an initial value for a slot 
via the 'initial:' slot specifier:

        TUPLE: <abc> { a initial: 100 } b c ;

It would also be useful to specifiy a quotation which is called in order to 
have a computed initial value. I.e.

        TUPLE: <abc> { a initial: 100 } { b eval: [ 10 random ] } c ;

The attached code implements this along with an alterntive 'new'. You can 
paste the code, the second example above, followed by:

        <abc> new

into a listener to try it out.

Ed

----------------------------------------------------------------------

IN: slots

TUPLE: slot-spec name offset class initial read-only eval ;

! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

USING: classes ;

IN: classes.tuple

:: init-eval-slots ( OBJ -- obj )
  "slots" OBJ class props>> at [ eval>> ] filter
    [| SLOT-SPEC |
      SLOT-SPEC eval>> call
      SLOT-SPEC name>>
      OBJ <mirror>
      set-at
    ]
  each
  OBJ ;

! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

IN: syntax

SYMBOL: eval:

! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

IN: slots

: peel-off-attributes ( slot-spec array -- slot-spec array )
  dup empty?
    [
      unclip
      {
        { initial:  [ [ first >>initial ] [ rest ] bi ] }
        { eval:     [ [ first >>eval    ] [ rest ] bi ] }
        { read-only [ [ t >>read-only ] dip           ] }
        [ bad-slot-attribute ]
      }
      case
    ]
  unless ;

! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

IN: alt-new

GENERIC: new ( class -- obj )

M: tuple-class new
    dup "prototype" word-prop
    [ (clone) ] [ tuple-layout <tuple> ] ?if
    init-eval-slots ;

-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Factor-talk mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/factor-talk

Reply via email to