Здравствуйте!
Теперь у парадигмы появился собственный репозиторий:
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);
Автор: xmankind