четверг, 23 января 2014 г.

О "моих скриптах"

По мотивам - http://programmingmindstream.blogspot.ru/2014/01/embarcadero-procedure-reference-to.html?showComment=1390425848776#c4250509825918387115

У меня вот так примерно можно сделать:

FUNCTOR FUNCTION A INTEGER IN anX
 Result := ( 1 + anX )
 // возвращаем "лямбду"
; // A

PROCEDURE B
 INTEGER VAR l_Y := 10
 // - Объявляем целочисленную переменную и присваиваем ей 10
 FUNCTOR VAR l_Functor := A ( l_Y );
 // - вызываем функцию A и передаём ей переменную l_Y 
 //   и получаем "лямбду" в l_Functor
 INTEGER VAR l_Z := l_Functor DO
 // - вызываем "лямбду", сохранённую в l_Functor и получаем значение в l_Z. 
 //   l_Z теперь РАВНО 11
; // B

А вот если сделать так:

PROCEDURE B
 INTEGER VAR l_Y := 10
 // - Объявляем целочисленную переменную и присваиваем ей 10
 FUNCTOR VAR l_Functor := A ( l_Y );
 // - вызываем функцию A и передаём ей переменную l_Y 
 //   и получаем "лямбду" в l_Functor
 l_Y := 20
 INTEGER VAR l_Z := l_Functor DO
 // - вызываем "лямбду", сохранённую в l_Functor и получаем значение в l_Z. 
 //   l_Z теперь РАВНО 11, а не 21. Что - НЕОЧЕВИДНО
; // B

А вот если сделать так:

FUNCTOR FUNCTION A POINTER INTEGER IN anX
 Result := ( 1 + anX )
 // возвращаем "лямбду"
; // A

PROCEDURE B
 INTEGER VAR l_Y := 10
 // - Объявляем целочисленную переменную и присваиваем ей 10
 FUNCTOR VAR l_Functor := A ( l_Y );
 // - вызываем функцию A и передаём ей переменную l_Y 
 //   и получаем "лямбду" в l_Functor
 l_Y := 20
 INTEGER VAR l_Z := l_Functor DO
 // - вызываем "лямбду", сохранённую в l_Functor и получаем значение в l_Z. 
 //   l_Z теперь РАВНО 21, а не 11. Что - ТОЖЕ НЕОЧЕВИДНО
; // B

Но "НЕОЧЕВИДНОСТИ" - вполне объяснимы.

P.S. А если сделать так:

FUNCTOR FUNCTION A POINTER INTEGER IN anX
 Result := ( 1 + anX )
 // возвращаем "лямбду"
; // A

FUNCTOR FUNCTION B
 INTEGER VAR l_Y := 10
 // - Объявляем целочисленную переменную и присваиваем ей 10
 Result := A ( l_Y );
 // - вызываем функцию A и передаём ей переменную l_Y 
 //   и получаем "лямбду" в l_Functor
 l_Y := 20
; // B

PROCEDURE C
 FUNCTOR VAR l_Functor := B
 INTEGER VAR l_Z := l_Functor DO
 // l_Z - опять же равен 21. Что ОПЯТЬ ЖЕ - НЕОЧЕВИДНО
;

- потому что "переменные" (как и все остальные "слова словаря") это тоже - "объекты". С подсчётом ссылок.

И всеми остальными "вытекающими" последствиями...

2 комментария:

  1. Прекрасный мир...
    Ээ... это какие из 26 измерений?

    ОтветитьУдалить
    Ответы
    1. "это какие из 26 измерений?"
      -- 27-е... :-)

      А вот начну описывать то как мета-модель сама выводится из мета-модели - там будет УЖЕ 35-е... :-)

      Удалить