ru en

FAQ

Этот раздел будет понемногу наполняться ответами на главные вопросы касающихся SLThree.

Методы

Почему эти сущности называются методами, а не функциями? Это потому, что все методы хранят контекст, в котором их описали:

  1. my_context = new context {
  2.     private.x = 25;
  3.     get_x = () => private.x;
  4.     set_x = (arg) => private.x = arg;
  5.     get_x2 = () => this.get_x() * 2;
  6. };
  7. my_context.get_x2(); // 50

Контексты

Контекст — единственный, помимо методов, составной тип данных непосредственно языка SLThree. Особые возможности контекста:

Превращение в любые типы

Вы можете использовать контексты как инициализаторы полей классов. Для этого у класса должен существовать конструктор без аргументов.
  1. context a : SLThree.BinaryAdd {
  2.     Left = 3 as is;
  3.     Right = 4 as is;
  4. }
  5. a();

Разворачивание контекста

Контексты в SLThree являются ссылками типа ContextWrap. Истинный же контекст имеет тип ExecutionContext. Чтобы получить объект этого типа из любого контекста, нужно вызвать для него unwrap. Разворачивание контекста относится к возможностям рефлексии SLThree. С помощью развёрнутого контекста можно:

  • Поменять имя контекста
  • Получить его приватный контекст
  • Получить переменные в виде словаря
  • Получить возвращённое значение
  1. cnt = this.unwrap();
  2. ref = cnt.wrap;
  3. ref == this;
  4. private_of_this = cnt.private;
  5. private_of_this == private;
  6. return 25 * 25;
  7. ret = cnt.ReturnedValue;
  8. name = cnt.Name = "EFDEsssFSDGDFfd";
  9. this;
  10. cnt.LocalVariables.GetAsDictionary();

Прочее

Откуда берутся типы?

Типы берутся из сборок, находящихся в списке slt.registred:

  1. using slt;
  2. slt.registred.Contains((@any).Assembly);