...

среда, 6 августа 2014 г.

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

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

Теперь у парадигмы появился собственный репозиторий:

http://ift.tt/1tXJ11T


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

Парадигма 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);


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Комментариев нет:

Отправить комментарий