Thanks Doug and Joe, that's just what I needed. I think this is something
worth putting in the syntax vocab rather than hidden away like it is. I
didn't find it with "parse time" apropos, or looking in the Literals section
of the handbook.

2009/4/20 Doug Coleman <[email protected]>

> Alex,
>
> Take a look at Joe's extra/literals.  You can do something like:
>
> CONSTANT: morse-code-table $[ H{ { CHAR: a ".-" } } >biassoc ]
>
> Doug
>
>
> On Apr 19, 2009, at 9:18 PM, Alex Chapman wrote:
>
> > Hi All,
> >
> > Sometimes I want to define an object in my program which is intended
> > to be a constant, but isn't a literal. For example, in the morse
> > vocab I want to define morse-code-table, a biassoc which allows
> > lookups of ascii characters to morse codes and vice versa. One way I
> > could do this:
> >
> > : morse-code-table ( -- table )
> >     H{
> >         { CHAR: a ".-" }
> >         { CHAR: b "-..." }
> >         ...
> >         { CHAR: \s "/" }
> >     } >biassoc ;
> >
> > But this is inefficient, because this creates a new biassoc tuple
> > from the literal hashtable every time [1]. Maybe instead we could
> > define it in a global variable:
> >
> > DEFER: morse-code-table
> > H{
> >     { CHAR: a ".-" }
> >     { CHAR: b "-..." }
> >     ...
> >     { CHAR: \s "/" }
> > } >biassoc \ morse-code-table set-global
> >
> > : morse-code-table ( -- table )
> >     \ morse-code-table get-global ;
> >
> > This works, but what I really want to do is express that this is a
> > value to be created at parse time and never modified, something that
> > the recent CONSTANT: word does. I can define this as a constant like
> > this:
> >
> > DEFER: morse-code-table
> > \ morse-code-table
> >     H{
> >         { CHAR: a ".-" }
> >         { CHAR: b "-..." }
> >         ...
> >         { CHAR: \s "/" }
> >     } >biassoc define-constant
> >
> > It would be nice if I didn't have to do this manually, but could use
> > a modified CONSTANT: syntax like this:
> >
> > CONSTANT: morse-code-table
> >     H{
> >         { CHAR: a ".-" }
> >         { CHAR: b "-..." }
> >         ...
> >         { CHAR: \s "/" }
> >     } >biassoc ;
> >
> > Is there a reason CONSTANT: only takes an object literal and not a
> > block of code to evaluate, other than the convenience of having a
> > shorter syntax in the most common case?
> >
> > On a related issue, if I want morse-code-table to be constant, how
> > can I make sure that it isn't modified? I know the factor philosophy
> > (and implementation) is not to hide anything, but I'd like to at
> > least throw an error if someone ignorantly tried to modify the
> > table. How about this:
> >
> > ERROR: morse-code-table-is-constant ;
> > PREDICATE: is-morse-code-table < biassoc morse-code-table eq? ;
> > M: is-morse-code-table set-at morse-code-table-is-constant new throw ;
> >
> > What I'm doing is defining a class which consists only of the morse-
> > code-table object, and throwing an error if anyone tries to change
> > it using set-at. I don't think I'll actually bother doing this in
> > the real morse vocab.
> >
> > Alex
> >
> > [1] If all I wanted was a read-only hashtable then there would be no
> > problem here, because the literal hashtable is created only once at
> > parse time.
> >
> ------------------------------------------------------------------------------
> > Stay on top of everything new and different, both inside and
> > around Java (TM) technology - register by April 22, and save
> > $200 on the JavaOne (SM) conference, June 2-5, 2009, San Francisco.
> > 300 plus technical and hands-on sessions. Register today.
> > Use priority code J9JMT32.
> http://p.sf.net/sfu/p_______________________________________________
> > Factor-talk mailing list
> > [email protected]
> > https://lists.sourceforge.net/lists/listinfo/factor-talk
>
>
>
> ------------------------------------------------------------------------------
> Stay on top of everything new and different, both inside and
> around Java (TM) technology - register by April 22, and save
> $200 on the JavaOne (SM) conference, June 2-5, 2009, San Francisco.
> 300 plus technical and hands-on sessions. Register today.
> Use priority code J9JMT32. http://p.sf.net/sfu/p
> _______________________________________________
> Factor-talk mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/factor-talk
>
------------------------------------------------------------------------------
Stay on top of everything new and different, both inside and 
around Java (TM) technology - register by April 22, and save
$200 on the JavaOne (SM) conference, June 2-5, 2009, San Francisco.
300 plus technical and hands-on sessions. Register today. 
Use priority code J9JMT32. http://p.sf.net/sfu/p
_______________________________________________
Factor-talk mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/factor-talk

Reply via email to