openlang

Smalltalk looking up classes before their definitions have run

I'd like to be able to execute something like this:

BaseItem subclass: #FirstItem instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'DEMO2'.
FirstItem subclass: #SecondItem instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'DEMO2'.

without evaluating the lines independantly.

Doing this gives me an undeclared-name error for FirstItem, although that declaration will already exist when execution gets as far as the following line.

Can I get around this somehow?

The conversation continues 2

Follow the reasoning
  1. Permalink

    To resolve a class later, consult the globals dictionary named Smalltalk (you can inspect it and open a browser on it). Accessors such as classNamed: and at: let you retrieve a class whose name may still be absent while compilation happens for the complete expression you are about to run.

    BaseItem subclass: #FirstItem instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'DEMO2'.
    (Smalltalk classNamed: #FirstItem) subclass: #SecondItem instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'DEMO2'.
  2. Permalink

    In certain dialects, Symbol understands the message asClass, so you could write the following:

    BaseItem subclass: #FirstItem instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'DEMO2'.
    #FirstItem asClasss subclass: #SecondItem instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'DEMO2

Other sides of the same question

  1. Choosing enum entries randomly with GDScript in Godot 3.3 without listing each one?

    Here's the enum declaration I'm using in GDScript: I'd like to choose an enum variant randomly without listing every possible…

    Replies 2Latest activity gdscript
  2. Nim remainder syntax

    How is modulus expressed in Nim? cell % 7 == 0 gives undeclared identifier: '%' Neither a Google search nor looking through S…

    Replies 2Latest activity nim
  3. Returning results from an APL function

    How do I make my function return something once execution has finished? For instance, I have: ROUTINE N ? N ⍴ 12 //That gener…

    Replies 2Latest activity apl