String

Строки MQL поддерживаются и могут быть сконвертированы в объекты (см Obj), так и получены из объектов или как результат исполнения скриптов:

   // create object from string
   Tcl_Obj Obj(string);
   Tcl_Obj Obj(const string &arr[],int pos=0,int count=WHOLE_ARRAY);
 
   // set variable to string
   Tcl_Obj Set(string var,string value);
   Tcl_Obj Set(string var,string key,string value);
   Tcl_Obj Set(string var,string &value[]);
   Tcl_Obj Set(string var,string key,string &value[]);
 
   // append string element(s) to list
   int Append(Tcl_Obj list,string value);
   int Append(Tcl_Obj list,string &value[]);
 
   // convert object to string
   string String(Tcl_Obj);
   string String(Tcl_Obj,int index);
   int ToArray(Tcl_Obj obj,string &array[],int pos=0,int count=WHOLE_ARRAY);
 
   // interp.routines	
   string StringResult(int ignoreThis=0);
 
   string StringEval(string script,int flags=0); 
   string StringEval(Tcl_Obj script,int flags=0);
   string StringCall(Tcl_Obj &objv[],int objc=WHOLE_ARRAY);
 
   // string length in characters
   int StringLength(Tcl_Obj);

Метод String(obj) вернёт текстовое представление любого объекта библиотеки. Этот метод не удаляет временные объекты.

String(obj,index) получает строковое представление элемента из списка. Фактически синоним String(ObjIndex(obj,index)).

Внутри Tcl всегда и везде использует кодировку UTF8, поэтому при конверсии из MQL в Tcl и обратно происходит перекодирование текста. К тому из-за особенностей работы MT4/5 c DLL в функциях используются временные массивы.

Поэтому по возможности все литералы рекомендуется создавать при начале работы программы. Как «бонус» в постоянных объектах содержится байт-код и ссылки ускоряющие работу tcl.

Пример:

// создать объект строку и СРАЗУ увеличть ссылки, чтобы объект не был временным
Tcl_Obj func=tcl.Ref(tcl.Obj("apply {{x}{expr $x + 2}}")); // анонимная функция увеличивающая аргумент на 2
// после создания объект имеет внутренний тип "строка"
 
Print(tcl.StringCall(func,tcl.Obj(5)) );	// получится 7 :-)
// зато теперь func имеет внутренний тип "байт-код" и будет исполняться быстрее
 
Print(tcl.StringCall(func,tcl.Obj(10)) );	// получится 12:-)
 
// в конце приложения не забудьте Unref ко всем литералам
tcl.Unref(func);

см.также: Другие поддерживаемые типы Double Long, Объекты Obj