Здравствуйте!
Теперь у парадигмы появился собственный репозиторий:
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 и т. д.):
- Не требуется преобразование результата
hs()
к нужному типу как в статической. - Не требуется следить за выделением и освобождением памяти.
Об обработке ошибок
Обработки ошибок пока нет.
Система контроля ошибок планируется пост-фактум — после выполнения одной из функций 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/
Добавить комментарий