пятница, 15 апреля 2016 г.

#1226. Скрипты. Загрузка слова скрипта по требованию. Позднее связывание. Аналог DLL

UNIT LoadOnDemand.ms.dict

USES
 Log.ms.dict
;

: UIDS_LIST
;
// - список загруженных элементов

initialization (
 @ UIDS_LIST DisableForHelp
)

TtfwWord FUNCTION LoadWord
  STRING IN aWordName
  STRING IN aDictName
  
 VAR l_VAR 
 
 @ UIDS_LIST %% aWordName >>> l_VAR
 if ( l_VAR IsNil ! ) then
 begin
  l_VAR DO >>> Result
 end // l_VAR IsNil !
 else
 begin
  //aWordName false @ UIDS_LIST pop:NewWordDefinitor:CheckRefcountVar >>> l_VAR
  aWordName false @ UIDS_LIST pop:NewWordDefinitor:CheckVar >>> l_VAR
  //UIDS_LIST ->^ aWordName >>> l_VAR
  // - добавляем переменную и снимем её со стека
  
  STRING VAR l_Code 
  [ 'INCLUDE ' '''' aDictName '''' ' @ ' aWordName ] strings:Cat >>> l_Code 
  BOOLEAN VAR l_WasException
  false >>> l_WasException
  TRY
   l_Code script:CompileStringAndProcess DO
  EXCEPT
   current:exception:Message .
   [ 'Возможно элемент ' aWordName ' удалён' ] strings:Cat .
   true >>> l_WasException
   nil >>> Result
  END 
  
  if ( l_WasException ! ) then
  begin
   >>> Result
   Result pop:Word:Name aWordName == ?ASSURE [ 'Вернулось неверное слово ' Result pop:Word:Name ' вместо ' aWordName ]
  end // l_WasException !
  l_VAR ^:= Result
  //Log: [ Result pop:Word:Name ' loaded' ]
 end // l_VAR IsNil !
; // LoadWord 

WordAlias LW LoadWord

TtfwWord FUNCTION WordLink
  Literal IN aWordName
  Literal IN aDictName
 aWordName |N aDictName |N LoadWord >>> Result
; // WordLink

WordAlias WL WordLink

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

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