среда, 4 декабря 2013 г.

To do. Расширение скриптовой машины. "Сложные конструкции простыми способами"

Для скриптовой машины сделать слово WordWorkerN.

Обрабатывающее (и компилирующее) ВСЕ слова ДО указанной скобки.

И на его основе "конструктор" для классов и исключений:

WordWorkerN .Create( ) CLASS IN aClassToCreate
 aClassToCreate [[ WordToWork DO ]] .Create
;

И вызов:

class::Exception .Create( 'Какое-то исключение' )

или:

class::EListError .Create( [[ 'List index ' anIndex ' out of bounds' ]] any:Cat )

или:

class::EListError .Create( [[ 'List index ' anIndex ' out of bounds' ]]+ )

или:

class::EListError .Create( Format( 'List index ' anIndex ' out of bounds' ) )

Где Format тоже определяется ЧЕРЕЗ WordWorkerN:

STRING WordWorkerN Format( )
 [[ WordToWork DO ]]+
;

Где ]]+ определяется так:

STRING FUNCTION ]]+
 ]] any:Cat >>> Result
;

Где any:Cat определяется так:

STRING FUNCTION any:Cat [] IN anArray
 // - складывает ЛЮБЫЕ значения из массива как строки
 [[ @ ( IN anItem anItem ToPrintable )ITERATE anArray ]] strings:Cat >>> Result
;

Где strings:Cat определено так:

STRING FUNCTION strings:Cat [] IN anArray
 // - складывает строки массива на стеке

 Result := ''

 PROCEDURE DoCat STRING IN anItem
  Result := ( Result anItem Cat )
 ; // DoCat
 
 @ DoCat ITERATE anArray
;

P.S. флективность (http://ru.wikipedia.org/wiki/%D0%A4%D0%BB%D0%B5%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D1%81%D1%82%D1%8C) грамматики - это кстати - плохо.

Будем от неё со временем избавляться.

P.P.S.

Или кстати ещё пример:

class::TEdit .Create( CurrentForm )

P.P.P.S. И кстати ещё пример:

: [[
 // - слово начинает определение "константного массива"
 VOID
; // [[

[] : ]]
 // - слово заканчивает определение "константного массива"
 [] VAR Tmp
 Tmp := array:New
 
 @ ( DUP IsVoid ! ) WHILE
 BEGIN
  >>>L[] Tmp
 END
 DROP
 Tmp
; // ]]

Комментариев нет:

Отправить комментарий