Парадигма 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 и т. д.): Не требуется преобразование результата 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