Robert Stehwien a écrit :
What is the source of the error produced by the following code?
----------
initialize
    table := OrderedCollection new.

    "there  are 100 entries like what is below"

    table add: ({
        #value->2.
        #cost->-3.
        #step->2.
        #defense->3.
        #combatMove->7.
        #fullMove->14.
        #carry->10.
        #lift->20.
        #death->20.
        #unconscious->11.
        #woundThreshold->4.
        #recovery->0.5.
        #mysticArmor->0.
    } as: Dictionary).
----------
More than 256 literals referenced.
You must split or otherwise simplify this method.
The 257th literal is: 4360
----------

I'm trying to create a data table for a program and I'm wondering if
I'm limited to 256 literals per class or method.  I tried initilizing
the table in multiple methods (setting 50 per method) but get the same
error.

I'll probably just put the data in a database and do the lookup when
needed or load the table from a file.  But I wanted to know the source
of the problem.

Thanks,
Robert

The limitation is per-method.
Beware, message selectors count for 1 literal (except some special selectors)
Also Class names or class variables consume 1 slot...

There, you have (#OrderedCollection -> OrderedCollection), #new, #add, #->, #as: (#Dictionary -> Dictionary)...

There are other limitations, like number of argument per message, number of temporary variables per method, number of instance variables per class, length of blocks in an optimized ifTrue: [] ifFalse [] or [] whileTrue: [] or to:do:[] construct...

This is based on the assumption that a Smalltalk method SHOULD be small.

You can for example write as a workaround
        table := Dictionary new.
        #(
                #(#value 2)
                #(#cost 3)
                #(#etc 0.1)
        ) do: [:pair | table at: pair first put: pair last].

Nicolas

_______________________________________________
Beginners mailing list
Beginners@lists.squeakfoundation.org
http://lists.squeakfoundation.org/mailman/listinfo/beginners

Reply via email to