V начало знаний
Возможности и совместимость:

Язык программирования V

Windows XP

Windows 7

Windows 8

x86

CGI

Apache

vsc

v32

vif

vsl

Хранилище

Структуры

Массивы

Деревья

Псевдонимы

Функции

Пример

include_vsc

                        
Описание нового языка программирования V.
V является скриптовым, компилируемым в коды x86, языком со строгой типизацией и без ссылочной арифметики.

V адаптирован для работы в CGI режиме с сервером Apache.

Исходный код хранится в файле с расширением vsc. Компилятор в случае отсутствия ошибок создает файл с расширением v32, а также 2 служебных файла с расширениями vif и vsl. При повторной компиляции проверяется дата последнего изменения файла vsc. Если она не изменилась с момента последней компиляции, то компиляция не осуществляется, а сразу исполняется v32.

Для безопасного доступа к данным на носителях существует сервер хранения, работа с которым синтаксически встроена в язык. Кроме базовых типов существует возможность создавать пользовательские типы в виде структур и типизированных массивов. Структуры могут хранить как базовые так и пользовательские типы. Существует возможность создания деревьев в структуре, а также наследование от ранее определенных структур.

Пользовательские массивы могут хранить несколько типов структур унаследованных от первой в перечислении. Для доступа к элементам генерируются специальные функции, а для получения элемента существует механизм псевдонимов.

Пример кода:
	
?Шаблон Клон - Тип1(
Функция Клон(Тип1 Т):
	Тип1 лРез;
	?Для Тип1.НомерПоля (
		?Если Тип1.НомерПоля не пользовательский (
			лРез.?Имя поля Тип1.НомерПоля = (Т.?Имя поля Тип1.НомерПоля);
		)
		?Если Тип1.НомерПоля это пользовательский (
			:{
				*лА=(Т.?Имя поля Тип1.НомерПоля);
				{Тип1 лРез, _лА_ *П: лРез.?Имя поля Тип1.НомерПоля >< П; =1}(лРез, Клон(Т.?Имя поля Тип1.НомерПоля));
			} 
		)
	)
	=лРез;
.
)

?Шаблон ЗаполнитьИз - Тип1 Тип2(
Функция ЗаполнитьИз(Тип1 Л, Тип2 П):
	*лРез=0;
	?Для Тип1.НП1 (
		?Для Тип2.НП2 (
			?Если имена Тип1.НП1 и Тип2.НП2 равны (
				?Если типы Тип1.НП1 и Тип2.НП2 равны (
					?Если Тип1.НП1 не пользовательский (
						Л.?Имя поля Тип1.НП1 = (П.?Имя поля Тип2.НП2);
						лРез=лРез+1;
					)
					?Если Тип1.НП1 это пользовательский (
						:{
							*лА=(Л.?Имя поля Тип1.НП1);
							{Тип1 Л, _лА_ *П: Л.?Имя поля Тип1.НП1 >< П; =1}(Л, Клон(П.?Имя поля Тип2.НП2));
							лРез=лРез+1;
						} 
					)
				)
			)
		)
	)
	=лРез;
.
)

?Operator if("+")
?Operator else("+")
?Operator plus("+")

?Use("include.vsc") // присоединяет файл с кодом, исключает дублирование

_Counter Print(_String) <- _ОтобразитьСтроку;
_String ToString(_Text) <- _ВСтрокуТекст;
_String ToString(_Counter) <- _СчетчикВСтроку;
_Counter Sleep(_Counter) <- _Подождать;

?Транслятор Box("comp.exe box.vsc");
?Транслятор Set("comp.exe set.vsc");
Function TestBox():
	*true=1;
	*false=0;

	*lB=?Box(Name: ToString"Zorro2", Age: 5002, IsActive: false, Box: ?Box(Name: ToString"Zorro2", Age: 5002, IsActive: false));
	If lB.IsActive==false:
		*=lB.?Set(Name: ToString"Привет мир!!!", IsActive: true, Box.IsActive: true);
		Print(lB.__inString+"\n");
	.
	Return lB;
.

?Template FnGen - FnType1 Type2(
	Function FnGen((FnType1) fn, _String FnText):
		Function fnNew from FnText as fn:
			fn=fnNew;
		.
		Return fn;
	.
)

Function TFn1(_Counter F):
	Return F+1;
.

Function TFn2(_Counter F):
	Return F+2;
.

Function TFn1_TFn1(_Counter Cond, (TFn1) fn1, (TFn1) fn2):
	If Cond:
		Return fn1;
	.
	Return fn2;
.

Function CallIf(_Counter Cond, F):
	Return TFn1_TFn1(Cond, TFn1, TFn2)(F);
.

?Template if - Type0 Type1(
Function if(_Counter ifcond, Type1 rval_ret fntor):
	*lRes123={

		Type TIf(_Counter ifcond, Type1 fntor):
			Operator "else" else;
		.

		():
			TIf lRes;
			Return lRes;
	}();
	lRes123.fntor=fntor;
	lRes123.ifcond=ifcond;
	Return lRes123;
.
)

?Template else - TIf0 Type1(
Function else(TIf0 L, Type1 fntor):			
	If L.ifcond:
		Return L.fntor();
	.
	Return fntor();
.
)

?Template Closure - Type1 Fn1(
Function Closure(Type1 lval D1, (Fn1) fn):
	Return {
		Type TClosure__( _ D1, (Fn1) fn):
			() Call;
			Operator "else" else;
			Operator "=" Set;
		.

		Function TClosure__Call(TClosure__ Cl):
			print "Вызов Closure!!!\н";
			*Cl_D1=Cl.D1;
			Cl_D1.Type1: // динамическая проверка на тип
				print "Возврат из Closure!!!\н";
				Return Cl.fn(Cl_D1);
			.
			print " Вызов Closure ошибка!!!\н";
		.

		Function TClosure__Set(TClosure__ L, TClosure__ R):
			L.D1=R.D1; L.fn=R.fn;
			Return 1;
		.

		(Type1 lval D1, (Fn1) fn):
			TClosure__ lRes; lRes.D1=D1; lRes.fn=fn;
			print "Создан Closure!!!\н";
			Return lRes;
	}(D1, fn);
.

Function Closure(Type1 rval_ret D1, (Fn1) fn):
	*lRes= {
		List TIfDataList[Type1]:
		.

		Type TClosure__(TIfDataList D1List, (Fn1) fn):
			() Call;
			Operator "=" Set;
		.

		Function TClosure__Call(TClosure__ Cl):
			print "Вызов клозюра 2!!!\н";
			print "Возврат из клозюра 2!!!\н";
			Return Cl.fn(Cl.D1List.__get(0));
		.

		Function TClosure__Set(TClosure__ L, rval R):
			L.fn=R.fn;
			L.D1List+=R.D1List.__pop;
			Return 1;
		.

		():
			TClosure__ lRes; 
			print "Создан клозюр 2!!!\н";
			Return lRes;
	}();
	lRes.fn=fn; lRes.D1List+=D1; 
	Return lRes;
.
)

?Template Box - Type1(
Function Box(Type1 D1):
	Return {
		Type Box__(Type1 D1):
			"=" Set;
		.

		Function Box__Set(Box__ L, Box__ R):
			L.D1=R.D1;
			Return 1;
		.

		(Type1 D1):
			Box__ lRes; lRes.D1=D1;
			Return lRes;
	}(D1);
.
)

?Template CallBox - Fn1(
Function CallBox((Fn1) fn):
	Return {
		Type CallBox__((Fn1) fn):{
			() Call;
			"=" Set;
		}

		Function CallBox__Call(CallBox__ CB):{
			Return CB.fn();
		}

		Function CallBox__Set(CallBox__ L, CallBox__ R):
			L.fn=R.fn;
			Return 1;
		.

		((Fn1) fn):
			CallBox__ lRes; lRes.fn=fn;
			Return lRes;
	}(fn);
.
)

Program НовыйАльтернативныйСинтаксис(): // начало исполнения
	*fn_StringIn_String={_String S:=S+"\н"};
	_String lParam="!!!!!!!!!!!!!!!!!!";
	_String lStr_=
<<	
_String S:
	Return S+" lStr_lParam\н";
.
>> (lParam);
	*lNewFn=FnGen(fn_StringIn_String, lStr_);
	If lNewFn==fn_StringIn_String:
		("Не удалось\n".ToString).Print;
	.
	Else:
		lNewFn("Привет мир!!!".ToString).Print;
	.

	*lBox=Box(1);
	*lBox2=Box(2);

	*fnPrint={_String S:=отображение S}; // лямбда!!!

	fnPrint(((1-1) if Closure(lBox){(_lBox_ $):=$.D1+1} else Closure(lBox2){_lBox_ $:=$.D1+123})._С+"\н");

	fnPrint(((1-0) if CallBox{=100500} else CallBox{=777})._С+"\н");
	
	fnPrint(((1-1) if CallBox{=100500} else Closure(lBox2){_lBox_ $:=$.D1+123})._С+"\н");

	fnPrint(((1-0) if Closure(lBox){_lBox_ $:=$.D1+1} else CallBox{=777})._С+"\н");

	fnPrint(((1-0) if Closure(Box(2)){_lBox_ $:=$.D1+1} else CallBox{=777})._С+"\н");
	
	End 0; // возврат кода завершения
.
				
include.vsc :
_Счетчик ИдПотока(_Счетчик) импорт _ИдПотока;

_Счетчик Длина(_Счетчики) импорт _КоличествоСчетчиков;
_Счетчик Длина(_Символы) импорт _КоличествоСимволов;
_Счетчик Длина(_Байты) импорт _КоличествоБайтов;
_Счетчик Длина(_Текст) импорт _ДлинаСтроковойКонстанты;
_Счетчик Длина(_Строка) импорт _ДлинаСтроки;
_Счетчик Длина(_Стр8) импорт _ДлинаСтр8;
_Счетчик Длина(_Стр8Б) импорт _ДлинаСтр8Б;
_Счетчик Длина(_Память_) импорт _РазмерПамяти;

_Счетчик Найти(_Строка, _Счетчик, _Счетчик) импорт _НайтиСимволВСтроке;
_Счетчик Найти(_Стр8, _Счетчик, _Счетчик) импорт _НайтиСимволВСтр8;
_Счетчик Получить(_Строка, _Счетчик) импорт _Символ;
_Строка Подстрока(_Строка, _Счетчик, _Счетчик) импорт _Подстрока;
_Стр8 Подстрока(_Стр8, _Счетчик, _Счетчик) импорт _Подстрока8;
_Стр8Б Подстрока(_Стр8Б, _Счетчик, _Счетчик) импорт _Подстрока8Б;

_Счетчик отображение(_Строка) импорт _ОтобразитьСтроку;
_Счетчик отображение(_Стр8Б) импорт _ОтобразитьСтроку8Б;
_Счетчик отображение(_Стр8) импорт _ОтобразитьСтр8;
_Счетчик отображение(_Счетчики) импорт _ОтобразитьСчетчики;
_Счетчик отображение(_Текст) импорт _ОтобразитьТекст; _Счетчик print(_Текст) импорт _ОтобразитьТекст;
_Счетчик отображение(_Число) импорт _ОтобразитьЧисло; _Счетчик print(_Число) импорт _ОтобразитьЧисло;

>:: СТР;//Префикс СТР;
	_Строка ВСтроку(_Стр8Б) импорт _Стр8БвСтроку;
	_Строка ВСтроку(_Счетчик) импорт _СчетчикВСтроку;
	_Строка ВСтроку(_Стр8) импорт _Стр8вСтроку;
	_Строка ВСтроку(_Счетчики) импорт _СчетчикиВСтроку;
	_Строка ВСтроку(_Счетчики_) импорт _Счетчики_ВСтроку;
	_Строка ВСтроку(_Символы) импорт _СимволыВСтроку;
	_Строка ВСтроку(_Текст) импорт _ВСтрокуТекст;
	_Строка ВСтроку(_Число) импорт _ВСтрокуЧисло;
<::; //Конец области префикса;
_$16 _С(_$) <- _ВСтрокуТекст;
_$16 _С(_Счетчик) <- _СчетчикВСтроку;
_$16 _С(_$16 Стр):
	_$16 лСтр="";
	лСтр=Стр;
	=лСтр;
.
_Строка _С(_Число) импорт _ВСтрокуЧисло;

_Стр8Б ВСтр8Б(_Строка) импорт _СтрокаВСтр8Б;
_Стр8 ВСтр8(_Строка) импорт _СтрокаВСтр8;
_Стр8 ВСтр8(_Байты) импорт _БайтыВСтр8;
_Стр8 ВСтр8(_Счетчик) импорт _СчетчикВСтр8;
_$8 _С8(_$ $):=$._С.ВСтр8;.

_Счетчик КакСчетчик(_Строка) импорт _СтрокаКакСчетчик;
_Число КакЧисло(_Строка) импорт _СтрокаКакЧисло;

_Счетчик изменениеРазмера(_Счетчики, _Счетчик) импорт _УстановитьКоличествоСчетчиков;
_Счетчик изменениеРазмера(_Символы, _Счетчик) импорт _УстановитьКоличествоСимволов;
_Счетчик изменениеРазмера(_Байты, _Счетчик) импорт _УстановитьКоличествоБайтов;

_Счетчик КопироватьИзВ(_Счетчики, _Счетчик, _Счетчики, _Счетчик, _Счетчик) импорт _СчетчикиСкопироватьИзВ;
_Счетчик КопироватьИзВ(_Счетчики_, _Счетчик, _Счетчики_, _Счетчик, _Счетчик) импорт _Счетчики_СкопироватьИзВ;

_Счетчик приостановка(_Счетчик) импорт _Подождать;

_Счетчик КоличествоЦПУ(_Счетчик) импорт _КоличествоЦПУ;
_Счетчик КМС(_Счетчик) импорт _КоличествоМиллисекундОтСтарта;
_Счетчик КМССР(_Счетчик) импорт _КоличествоМиллисекундОтСтартаСреды;

_Счетчик СВФ(_Строка, _Строка) импорт _СохранитьВременныйФайл;

_Счетчик ВЛог(_Строка) импорт _ВЛог;
_Счетчик ФВывод(_Строка) импорт _ВВТФ;
_Счетчик СВТФ(_Строка) импорт _СохранитьВТФ;

_Файл Открыть(_Строка, _Строка) импорт _ОткрытьФайл;
_Счетчик Закрыть(_Файл) импорт _ЗакрытьФайл;
_Байты Получить(_Файл, _Счетчик) импорт _СчитатьИзФайла;
_Строка ПолучитьСтрокуANSI(_Файл) импорт _ПолучитьСтрокуИзФайлаANSI;
_Счетчик ЗаписатьСтрокуANSI(_Файл, _Строка) импорт _ЗаписатьСтрокуВФайлANSI;
_Стр8 ПолучитьСтрокуUTF8(_Файл) импорт _ПолучитьСтрокуИзФайлаUTF8;
_Счетчик ЗаписатьСтрокуUTF8(_Файл, _Стр8) импорт _ЗаписатьСтр8ВФайлUTF8;
_Счетчики Инфо(_Строка) импорт _ИнформацияОФайле;
_Счетчик Записать(_Файл, _Байты) импорт _ЗаписатьВФайл;
_Счетчик ЗаписатьБайт(_Файл, _Счетчик) импорт _ЗаписатьБайтВФайл;

_Сокет ОткрытьСокет(_Стр8, _Счетчик) импорт _ОткрытьСокет;
_Счетчик ЗакрытьСокет(_Сокет) импорт _ЗакрытьСокет;
_Счетчик ОтослатьБайты(_Сокет, _Байты) импорт _ОтослатьЧерезСокет;
_Счетчик ПолучитьБайты(_Сокет, _Байты) импорт _ПолучитьЧерезСокет;
_Сокет ОткрытьСокетНаПорте(_Счетчик) импорт _СлушатьНаПорте;
_Сокет ПодождатьСокетНаСокете(_Сокет) импорт _ПодождатьСокет;

_Память_ ПолучитьПамять(_Строка, _Счетчик, _Счетчик) импорт _ПолучитьПамять;

~_СписокСтрок[_Строка]:
.

~_СписокТекста[_Текст]:
.

~_СписокСчетчиков[_Счетчик]:
.
		
Новости:

!!!Внизу страницы есть Download!!!

(20161030) Обновлен архив со средой исполнения (устранены недочёты. обновлён последний пример).

(20161022) Обновлен архив со средой исполнения (расширены возможности макросов. добавлен пример в архив).

(20161009) Обновлен архив со средой исполнения (расширены возможности макросов. Создан макрос "Линза2").

(20161008) Обновлен архив со средой исполнения (расширены возможности макросов. Создан макрос "Линза" до 3 полей).

(20161005) Обновлен архив со средой исполнения (циклические и условные макросы расширены).

(20161002) Обновлен архив со средой исполнения (циклические и условные макросы для параметров функции).

(20160925) Обновлен архив со средой исполнения (ключ компилятора -cs:100500).

(20160903) Обновлен архив со средой исполнения (циклические и условные макросы).

(20160730) Обновлен архив со средой исполнения (исправлены ошибки).

(20160601) Обновлен архив со средой исполнения (шаблоны операторов для базовых типов).

(20160519) Обновлен архив со средой исполнения (лямбда вида {* a:=1} автоматически выводит тип входного параметра из контекста).

(20160517) Обновлен архив со средой исполнения (убрана необходимость писать ";" перед "}").

(20160509) Обновлен архив со средой исполнения (добавлен тип _Память_).

Тут могла быть ваша реклама)


˄˄˄
                                                                                 Яндекс.Метрика Рейтинг@Mail.ru