Парадигма HumanSpeak. Реализация и её детали

от автора


Здравствуйте!

Теперь у парадигмы появился собственный репозиторий:
github.com/xmankind/HumanSpeak

В продолжение предыдущей темы:
Парадигма HumanSpeak

Коротко

HS — это(по плану) кросс-языковая библиотека для того чтобы избавить программиста от обязательного запоминания названий базовых функций при переходе с одного языка на другой.

Вместо написания разнотипных названий в разных языках:

string_length("string") len("string") strlen("string") length('string') string.length("string") string length "string" 

достаточно будет запомнить:

hs("string length", "string") 

О названиях операций

В результате написания реализаций для разных языков, сделан субъективный вывод о том, что лучше использовать лишь по одному названию для каждой операции.

О строгой типизации

Проблема использования HS в языках со статической типизацией — возможность указания только одного типа для возвращаемого значения функции.
Поэтому выбран универсальный тип данных — строка.
Это требует использования вспомогательных функций, которые преобразуют результат к нужному типу.
Такие функции именуются следующим образом:
hsi — если результат должен оказаться числовым значением.
hsb — если результат должен оказаться булевым значением.
Пример:

if ( hsb(hs("string equal","abc","def")) ) { ... } printf("%d", hsi(hs("string length","abcdef"))); 

Хотя в последней строчке нет необходимости:

puts(hs("string length","abcdef")); 

Т.о. использование строки как возвращаемого значения — с одной стороны — необходимость преобразований, а с другой — получение результата сразу в строковом виде без необходимости его преобразовывать.

Уточнение:

hs("string equal","abc","def") → "TRUE" hsb(hs("string equal","abc","def")) → true 

О динамической типизации

Как видно, HSAPI удобнее всего использовать в языках с динамической типизацией(PHP, Python, Lua, Ruby и т. д.):

  1. Не требуется преобразование результата hs() к нужному типу как в статической.
  2. Не требуется следить за выделением и освобождением памяти.

Об обработке ошибок

Обработки ошибок пока нет.

Система контроля ошибок планируется пост-фактум — после выполнения одной из функций HSAPI. Примерный вид:

s:=hs("string substring","hello",4,9); if hsb(hs("any error")) then 	writeln(hs("get error")); 

О счете в string substring, string find и других

Счет с нуля. Выбор пал на счет с нуля т.к. именно он есть в большинстве языков.
Для строк указываются включительные, начальное и конечные, значения.
Пример:

hs("string substring","hello",1,3) => "ell" 

Потенциал

По сути, операции HS могут выполнять кодогенерацию:

if(strcmp(s,"string catenate")==0){  	char* arg1=va_arg(varg,char*); 	char* arg2=va_arg(varg,char*); 	char* buff = (char*)calloc(strlen(arg1)+strlen(arg2),sizeof(char)); 	 	va_end(varg); 	strcat(buff,arg1); 	strcat(buff,arg2); 	        puts("char* buff = (char*)calloc(strlen(s1)+strlen(s2),sizeof(char));");        puts("strcat(buff,s1);");        puts("strcat(buff,s2);");  	return buff; } 

Это, однако, не избавляет от необходимости следить за объявлением переменных, конфликтом их имен и прочим. Но позволяет практически сразу получить конструкцию алгоритма на требуемом языке.

Unit-test для C

hs("string length","jhfgd") = 5 hs("string catenate","abc","def") = "abcdef" hs("string equal","abc","abcdef") = "FALSE" hsb(hs("string equal","abc","abcdef")) = false hs("string find","hello world!!!","or") = 7 hs("string substring","hello world!!!",5,7) = " wo" hs("string delete","hello world!!!",8,10) = "hello wo!!!" hs("string insert","hello world!!!","___",3) = "hel___lo world!!!" 

О путях развития

Можно реализовать HS в виде консольной утилиты, которая выдает код использования функций по запросу(напр. "string length" ), для конкретного языка.
Это в свою очередь позволяет изготовить плагин для Vim(и прочих IDE), который будет интерпретировать запрос и преобразовывать его в код на конкретном языке:

string find php<tab> strpos($haystack, $needle); 

ссылка на оригинал статьи http://habrahabr.ru/post/232497/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *