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

в 19:03, , рубрики: api, Программирование

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

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

Автор: xmankind

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js