LINUX.ORG.RU

Новый язык программирования для русскоговорящих

 , ,


2

1

Синтаксис от Хаскеля, семантика от Ракета.

факториал(сч) =
  если (сч == 1)
    1
    сч * факториал (сч - 1)

фибоначчи(сч) =
  если (сч < 3)
       1
       пусть рекурсия (н-1 1 ; н 2; тек-сч 3)
         если (сч == тек-сч) н $ рекурсия н (н + н-1) $ тек-сч + 1

Будет ещё конструкция надо-быстро с семантикой от Си (и использованием gcc).

Исходники: https://github.com/Kalimehtar/russian-lang

Пакет для Ракета: https://pkgd.racket-lang.org/pkgn/package/russian-lang

Документация: https://docs.racket-lang.org/russian-lang/index.html

★★★★★

;;; тред не читал

Синтаксис от Хаскеля, семантика от Ракета.

Очередная попытка сделать лисп без скобочек? Но зачем? Читается же хуже.

У Хаскеля синтаксис такой не для читаемости, а ради автоматического каррирования и ещё некоторых мелочей. Зачем натягивать его на семантику Ракета?

Gentooshnik ★★★ ()
Ответ на: комментарий от monk

С этой точки зрения надо и все книги и вообще все тексты писать на единственно-правильном всемирном языке.

Совершенно верно. На Эсперанто как золотой середине между естественными языками и абсолютно сухими и однозначными вроде Lojban.

Gentooshnik ★★★ ()
Ответ на: комментарий от Gentooshnik

Очередная попытка сделать лисп без скобочек? Но зачем? Читается же хуже.

Уверен?

a[5][6] + 2 * h['key]

читается хуже чем

(+ (vector-ref (vector-ref a 5) 6)  (* 2 (hash-ref h ’key))

?

У Хаскеля синтаксис такой не для читаемости, а ради автоматического каррирования и ещё некоторых мелочей. Зачем натягивать его на семантику Ракета?

Вообще-то, именно для читаемости. Никто не мешает писать на Хаскеле вместо:

map head . scanl minus [2..] . map (\p -> [p, p+p..])

в стиле лиспа

(`.` (`.` (map head) (scanl minus [2..])) 
     (map (\p -> [p, p+p..]))))

Но первый вариант читается почти с ходу, а второй требует небольшого напряжения, чтобы понять, что к чему относится.

Впрочем, как и на Хаскеле, в моём языке сохраняется возможность писать как на обычном лиспе: единственное ограничение — символ однострочного комментария (;) больше не обозначает комментарий. Тогда существенными отличиями будет конструкция (надо-быстро …) и перевод ключевых слов.

monk ★★★★★ ()
Последнее исправление: monk (всего исправлений: 1)
Ответ на: комментарий от Gentooshnik

Совершенно верно. На Эсперанто как золотой середине между естественными языками и абсолютно сухими и однозначными вроде Lojban.

Я даже согласен. Но чтобы это имело какой-то практический смысл, надо чтобы были согласны хотя бы 10% населения Земли. Сейчас большее количество человек поймёт фразу на русском чем на эсперанто.

P.S. И если брать конструированные языки, то я за ифкуиль как самый семантически однозначный. Особенно для общения, где надо быть понятым (от комментариев в коде до форумов).

monk ★★★★★ ()

Молодцы что фигурные и квадратные скобочки убрали, но из-за знаков больше/меньше и доллара всё равно придётся раскладку туда-сюда теребить постоянно, такой подход нежизнеспособен.

arthas ()
Ответ на: комментарий от arthas

Про раскладку я уже дважды отвечал: если не делать из языка Кобол, то символы операций нужны. Для русской раскладки легко переопределить верхний цифровой ряд – там хватит на все необходимые символы.

И фигурные с квадратными не убрал, а использовал для другого: квадратные для доступа к коллекциям, фигурные для вызова методов.

monk ★★★★★ ()
Ответ на: комментарий от monk

Тут тоже согласен.

я за ифкуиль

Тогда останется два языка. Эсперанто для художественной литературы и ифкуиль/Lojban/и т.д. для документации и общения. А два уже не один - задача не выполнена. :)

Gentooshnik ★★★ ()
Ответ на: комментарий от monk

В первом случае проблема vector-ref и прочего обращения к данным, да, тут лисп проигрывает, если не прибегать к деструктурированию/паттерн-матчингу. Во втором можно поспорить, скорее всего вкусовщина.

Впрочем, как и на Хаскеле, в моём языке сохраняется возможность писать как на обычном лиспе

Как и на Хаскеле в твоём языке не сохраняется возможность читать как на обычном лиспе, т.к. официальный стиль другой и все будут придерживаться его.

Впрочем, синтаксис - это сущие мелочи и спора вообще недостойны, кроме совсем запущенных случаев вроде ранних Perl.

Gentooshnik ★★★ ()
Последнее исправление: Gentooshnik (всего исправлений: 2)
Ответ на: комментарий от Gentooshnik

Тогда останется два языка. Эсперанто для художественной литературы и ифкуиль/Lojban/и т.д. для документации и общения. А два уже не один - задача не выполнена. :)

По большому счёту, это неважно. Всё равно будут спецязыки: алгебра, химия, знаки на дорогах… Но вопрос выбора средства общения был бы решён.

Правда, вспоминается история эсперанто: Франция была резко против его распространения, так как тогда языком межнационального общения был французский. И теперь только последователи Оомото и Бахаи действительно надеются на эсперанто как единый язык.

monk ★★★★★ ()
Ответ на: комментарий от Gentooshnik

Как и на Хаскеле в твоём языке не сохраняется возможность читать как на обычном лиспе

Любой программист на Хаскеле приведённую выше запись прочитает.

Один из примеров факториала на Хаскеле выглядит так:

fac = (\(n) ->
        (if ((==) n 0)
            then 1
            else ((*) n (fac ((-) n 1)))))

Почти лисп.

Впрочем, синтаксис - это сущие мелочи и спора вообще недостойны, кроме совсем запущенных случаев вроде ранних Perl.

Вот поэтому у лисперов до сих пор списки в скобках вместо синтаксиса.

т.к. официальный стиль другой и все будут придерживаться его

Спасибо за огромную веру в будущее моего языка программирования! Но даже если он будет настолько общепризнанным, что у него будет официальный стиль, то замечу, что даже на Racket при наличии официального стиля пишут и без скобок и с прочими нарушениями стиля.

monk ★★★★★ ()
Ответ на: комментарий от monk

Любой программист на Хаскеле приведённую выше запись прочитает.

Я про то что так писать никто не будет (что и произошло с Хаскелем). А если будут - то разработчикам придётся привыкать к двум стилям в одном языке, что ещё хуже. У Racket и CL достаточно проблем из-за библиотек с синтаксисом, а в РЯП это даже не библиотека.

Вот поэтому у лисперов до сих пор списки в скобках вместо синтаксиса.

Вы так говорите как будто это что-то плохое. (c)

Но даже если он будет настолько общепризнанным, что у него будет официальный стиль

Официальный стиль уже есть - это стиль используемый в документации и примерах кода. У любого человека открывшего этот тред сразу в мозгу отпечатается как должен выглядеть код на РЯП.

Кстати, я понимаю что это очень большая проблема, у меня самого ушло недели две в прошлый раз, но всё же придумайте название получше чем «Русский Язык Программирования». :)

Gentooshnik ★★★ ()
Ответ на: комментарий от monk

Уточню. Я не говорю что нужно заменить стиль на лисповый - это преимущественно вкусовщина (если нет семантики требующей тот или иной). Я говорю что язык объективно станет лучше если у него будет один стиль - тот который комфортнее для Вашей целевой аудитории. Так что прекратите хотя бы рассказывать о возможности использования нескольких стилей как о преимуществе.

Gentooshnik ★★★ ()
Ответ на: комментарий от Gentooshnik

разработчикам придётся привыкать к двум стилям в одном языке, что ещё хуже

Официальный стиль уже есть - это стиль используемый в документации и примерах кода.

Уже есть прецедент: Си/Си++. Есть «стиль документации», «стиль, унаследованный из Си», «стиль, унаследованный из раннего Си++». И все могут встречаться в разных файлах одного проекта.

У меня из-за совместимости и тесной интеграции с Racket получается аналогичная ситуация: где-то может быть проще скопипастить кусок кода из Racket или Scheme, а привести к стилю документации когда-нибудь потом.

Кстати, я понимаю что это очень большая проблема, у меня самого ушло недели две в прошлый раз, но всё же придумайте название получше чем «Русский Язык Программирования». :)

Гм… в документации сейчас имени нет (просто «этот язык программирования»). Имя пакета russian-lang, имя языка в файле с программой «1». Можно называть «Первый». :-)

P.S. Вспоминается, как эсперанто получил название после выхода книги «Дръ Эсперанто. Международный языкъ. Предисловіе и полный учебникъ.». До этого он был просто «международный язык».

monk ★★★★★ ()
Последнее исправление: monk (всего исправлений: 1)
Ответ на: комментарий от Gentooshnik

Я говорю что язык объективно станет лучше если у него будет один стиль - тот который комфортнее для Вашей целевой аудитории.

В этом смысле согласен. Но тут как в математике: произведение может обозначаться, может пропускаться, деление может быть знаком, а может быть двухэтажной дробью. И есть примеры записи, которые считаются «удобнее». Например, дискриминант не пишут с использованием «∶», «÷», «×» и «⋅». Хотя могут.

monk ★★★★★ ()
Ответ на: комментарий от monk

Потому что конструкция типа

рассчитать зарплату используя менеджер-расчёта за период с 1-го января 2020 по 30 июня 2020 по (получить сотрудника с фамилией Иванов) выглядит ужасно

из примеров к KM, Knowledge Machine: …

(*Pete has (salary (100)))

(*Joe  has (salary (100)))

(*Mycompany has 
       (instance-of (Company))
       (employees (*Pete *Joe)))

(every Company has 
	(salaries ((the salary of (the bag of (the employees of Self)))))
	(total-payroll ((the sum of (the salaries of Self)))))

((the total-payroll of *Mycompany) = 200)

(*Pete has (salary ((a MoneyUnit with (magnitude (100)) (units (*dollar))))))

(*Joe  has (salary ((a MoneyUnit with (magnitude (100)) (units (*dollar))))))

в самом начале:

(reset-kb)

(a Car)                     ; create an instance of a car

(Car has (superclasses (Vehicle)))

(every Car has
  (wheel-count (4))
  (parts ((a Engine) (a Chassis))))

(the parts of (a Car))

; ((a Car) parts)

(a Car)

(parts has
  (instance-of (Slot))
  (domain (Physobj))
  (range (Physobj))
  (cardinality (1-to-N))
  (inverse (part-of)))

(wheel-count has
  (instance-of (Slot))
  (domain (Vehicle))
  (range (Integer))
  (cardinality (N-to-1)))

(showme (thelast Car))     ; refers to the most recent instance of car

;;; ----------------------------------------

(Car has (superclasses (Vehicle)))

(every Car has
  (wheel-count (4))
  (fuel-type (*Gas))
  (parts ((a Engine) (a Chassis))))

(*Gas has       ; (NB no `every', as *Gas is an instance)
  (unit-cost (1.34)))

(Engine has (superclasses (Physobj)))

(every Engine has
  (material (*Metal)))

(Chassis has (superclasses (Physobj)))

(every Chassis has
  (material (*Metal *Plastic *Wood)))

(*Plastic has
  (instance-of (Synthetic-Material)))

;;; ----------------------------------------

(a Car)

(the unit-cost of (the fuel-type of (thelast Car)))

((thelast Car) fuel-type * unit-cost)

(the material of (the parts of (thelast Car)))

(the material of (the Engine parts of (thelast Car)))

((thelast Car) parts Engine material)

((thelast Car) parts Chassis material)

((thelast Car) parts Chassis material Synthetic-Material)

;(watchon)

((a Car) parts Chassis material Synthetic-Material)

;(watchoff)

(a Car)

(thelast Car)

(the Engine parts of (thelast Car))

(a Car with (color (*Red)))

(the color of (thelast Car))

собственно, возможно и под схему и ракет можно адаптировать, но KM изначально на CL.

здесь правила вывода можно настраивать.

так что возможно, нечто подобное изобразить можно.

от вложенных скобочек там першит в горле. но вроде бы употреблены более-менее разумно.

ещё там в том файле с примерами: конечные автоматы, акторы, события, ситуации, алгоритмы планирования. в общем, произвольную базу знаний с инференсом можно изобразить на вполне человекочитаемых S-выражениях (в отличие от какого-нибудь Cyc/OpenCyc), здесь эта сетевая база более похожа на фреймовую или ООП в духе CLOS, importing/projection примерно соответствует наследованию/полиморфизму в ООП, но там всё довольно композабельно, см. Building Concept Representations from Reusable Components

вот, собственно вопрос.

  1. сложно ли нечто подобное KM к твоему языку прикрутить, только с русскими буквами в нейтральной форме ?

  2. если накрутить морфологию. то тут думать надо как разные словоформы в разные скобочки с разными онтологиями оттранслируются.

anonymous ()
Ответ на: комментарий от anonymous
  1. как в разные скобочки оттранслируются

собственно вот тут хочется упростить нечто вроде

(every Company has 
	(salaries ((the salary of (the bag of (the employees of Self)))))
	(total-payroll ((the sum of (the salaries of Self)))))

((the total-payroll of *Mycompany) = 200)

(*Pete has (salary ((a MoneyUnit with (magnitude (100)) (units (*dollar))))))

(*Joe  has (salary ((a MoneyUnit with (magnitude (100)) (units (*dollar)))))

в нечто вроде

рассчитать зарплату используя менеджер-расчёта за период с
результата выражения "получить из формы результат выражения "получить форму ввода данных" дату начала" 
по результат выражения "получить из формы результат выражения "получить форму ввода данных" дату окончания" 
по результату выражения "получить сотрудника с фамилией Иванов"

чтобы вместо

(salaries ((the salary of (the bag of (the employees of Self)))))

было более человекопонятное

зряплаты := зряплата по списку-без-повторов сотрудников этого

где «это», «этого» нечто вроде «this», «it», «self»

а скобочки чтобы потом само расставило по понятным правилам.

и по падежам x было понятно что (the x of y) нужно автомагически term rewrit-ить.

ну то есть, понятно что можно макросы написать. но если бы макросы ещё и падежи распознавали, и подсказывали словоупотребление, имхо, могло пригодиться бы.

вообще, напрашивается на макрос, пишуший макросы в нужных падежах сразу.

anonymous ()
Ответ на: комментарий от anonymous

результата выражения «получить из формы результат выражения «получить форму ввода данных» дату начала»

двойные кавычки вложенные, тоже неудобно.

anonymous ()
Ответ на: комментарий от anonymous

сдается мне, что эти вопросы/задачи нужно решать через разработку базы знаний …

уже есть готовые же, на лиспе?

«Наметки есть» …, но полного понимания как должны быть представлены знания в базе …

там да, можно закопаться. по тому же KM есть материалы сравнительные про сравнение с Cyc . Cyc тоже где-то на гитхабе существует OpenCyc, что-то вроде этой ссылки или этой, сразу на CL

Release 4.0 of OpenCyc includes:

The core Cyc ontology whose domain is all of human consensus reality. The current release includes:

  • ~239,000 terms (up from ~177,000 terms in the previous release)
  • ~2,093,000 triples (up from ~1,500,000 in the previous release)

2Мб сорцы, ~500Мб репозиторий со скачанной онтологией (датасеты), ещё какой-то driver чтобы этим пользоваться сколько-то занимает.

как этим пользоваться. сходу решительно непонятно. я наткнулся на Cyc вообще через logicmoo из «батареек» в составе SWI Prolog.

там человек пишет на прологе текстовый MUD (скорее правда, ближе к более универсальному LambdaMOO) на прологе.

MOO сервер, в котором модель мира можно на логическом прологе запрограммировать. для чего нужно либо долго и нудно скриптовать NPC-сей и «физические» законы (и прочие святого духа, хи-хи).

либо воспользоваться готовой онтологией и базой знаний типовых известных знаний «здравого смысла», например, Cyc.

формат представления знаний там в Cyc, ЕМНИП KIF на основе лиспоподобных S-выражений. так что для реализации запросов к движку базы знаний по любому понадобится какая-то реализация лиспа. в logicmoo он там лисп на прологе для этого использует.

сила Cyc/OpenCyc в его наполненной онтологии, готовой БЗ, этих вот >200k фактов, >2M триплов с отношениями.

вообще он штука довольно громоздкая.

KM выглядит гораздо проще и компактней. и та статья про повторно используемые компоненты для реализации базы знаний выглядит интересно, довольно разумно.

со всем этим можно невозбранно поэкспериметировать…

anonymous ()
Ответ на: комментарий от Gentooshnik

на эльфийском ещё. генераторы VulgarLang

ифкуиль/Lojban/и т.д. для документации и общения

лучше

трансцедентальная алгебра Линцбаха

вполне себе человекопонятные иероглифы. можно догадаться 100% по примерам о назначении.

anonymous ()
Ответ на: комментарий от anonymous

(salaries ((the salary of (the bag of (the employees of Self)))))

Это же синтаксис. При буквальном переводе будет

каждая Компания имеет
  зарплаты 
     зарплата сумки сотрудников себя
  общая-расчётка 
    сумма зарплат себя

каждая Машина имеет
  количество-колёс 4
  части
    Двигатель
    Шасси

но если бы макросы ещё и падежи распознавали, и подсказывали словоупотребление, имхо, могло пригодиться бы.

Есть проблема словаря. Из окончаний не выводится падеж.

общая-расчётка -> общей-расчётки

горничная-барина -> горничной-барина

Можно решить синтаксисом типа

каждая Компания/-и имеет
  зарплаты/- 
     зарплата сумки сотрудников себя
  общая/--ей/-расчётка/-и
    сумма зарплат себя

каждая Машина/-ы имеет
  количество/-а/-колёс 4
  части/-ей
    Двигатель/-я
    Шасси
monk ★★★★★ ()
Ответ на: комментарий от anonymous

В документации нет слова о бэкенде. На чём делаешь, на LLVM или GCC?

На Racket же. А тот на Chez Scheme. А в том JIT компилятор, разработанный Cisco Systems.

Подъязык надо-быстро на GCC (с опциональной возможностью запуска clang, подойдёт любой компилятор Си, умеющий делать динамические библиотеки).

monk ★★★★★ ()
Ответ на: комментарий от monk

Подъязык …

Например, код на чистом Си, который является фронтендом GCC, в предпоследней стадии компиляции превращается в ассемблер, который имеет синтаксис AT&T. И затем, в финальной стадии ассемблер траслируется в машинные коды.

Русский ЯП —-> Семантико-синтаксический анализ —> Ассемблер —> Машинный код.

По серъёзному не пробовал?

anonymous ()
Ответ на: комментарий от anonymous

По серъёзному не пробовал?

Без использования GCC?

А смысл? Писать в одну харю стандартную библиотеку не хуже, чем у Racket и компилятор с оптимизацией не хуже чем GCC? У меня не настолько мания величия. И секс стоя в гамаке не люблю.

LLVM хуже Си хотя бы тем, что Си более переносим. Поэтому для критических по скорости кусков трансляция в Си — естественный выбор.

А для основного языка необходима полная совместимость с Racket по библиотекам, так как это даёт макросы, продолжения, графику, пользовательский интерфейс, сеть, многопоточность, …

monk ★★★★★ ()