LINUX.ORG.RU

синтаксис отдельно, сахар отдельно

 ,


0

1

Есть такая вот идея на тему ключевых слов.

Сделать их полными (полной длины). В том числе и для знаков. Например, сложение - это будет «плюс» или «сложить». Составной оператор будет «составной оператор».

Код хранится в файле именно в таком виде.

При открытии файла в среде к нему применяется сахар. Который представляет из себя отдельную таблицу сокращений. В ней записано, что составной оператор - это, скажем, «{}», а в плюс - это «+». И к тому добавляется затеняющая последовательность на случай, если совпадёт сокращение с реальным содержанием файла. Например, если мы сократим слово начать_вычисления до нв, а в файле уже есть слово нв, то «нв» - это будет начать_вычисления, а эскейп(нв) - это будет слово «нв».

Сахар, существует только в памяти и на экране. Можно печатать сахарными словами, которые при сохранении преобразуются в полные.

Эта идея, наверное, дурацкая, но было бы интересно знать ваше мнение. Или, скажем, прецеденты и что из этого получилось у тех, кто это попробовал сделать.

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

Например, не нужна нам арифметика - задействуем плюс под что-нибудь другое.

Конкретный пример у меня тоже есть - квазицитаты. Мне на всё хватило более-менее коротких значков, но элегантные квазицитаты, как в лиспе, уже точно не получатся - значки закончились. А квазицитат иногда бывает много. Такие сокращения стали бы выходом в этом случае.

★★★★★

Последнее исправление: den73 (всего исправлений: 1)

Ты прямо как будто следишь за моими невысказанными мыслями. Следующий шаг — забить на текст вообще и хранить сразу нормальное дерево исходника, а в текст превращать только для редактирования (потому что в предкопиляционном коде бывает бардак и хранить структуру почти невозможно). Это сразу решит проблемы стиля — просто у каждого свой форматтер, больше никаких споров о табах/спейсах, рус/энг, даже {} vs begin-end. Рефакторинг тоже может заключаться в паре-тройке правок и переименовании в одном месте, если хранить не имена символов, а ссылки на них, как в любой нормализованной базе. При этом переименование не будет дырявить диффом полпроекта, а будет заменять лишь одну запись.

Но и в твоем виде идея хорошая, в плане и перспектив, и возможностей.

arturpub ★★
()

Детский сад. Это, собственно, примитивный транслятор, это любой прогер и так может сделать. Вообще, в нормальных языках нет никаких ключевых слов, там и так можно сокращать что угодно. Но для криворуких может быть да, вариант.

filequest
()

но элегантные квазицитаты, как в лиспе

`'@((`/#,((#,foo — образец элегантности. Чем то на балерину похоже, такая вся легкая и воздушная.

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

Ну это вообще-то не я придумал, о человек, далёкий от программирования. И где-то несколько месяцев тому.

Дополнительная возможность в этой же струе такая: в файле всегда писать namespace:name и никогда не писать просто name. Это решает такую неудобную проблему, как наличие одноимённых символов в разных пр-вах имён. Поиск по файлам в этом случае всегда позволяет понять, о чём речь. Правда, я этот вопрос собирался по-другому решать, т.е. тут не уникальное преимущество.

Следующее - вместо «метод» для статических методов можно писать «класс, который объявлен» :: «метод».

Правда, таким образом убираются одни гибкости и добавляются другие, так что я не назвал бы это изменение совсем уж безобидным.

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

И вообще получается смысловая подложка под исходником - это уже не очень хорошо.

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

Вопрос не в том, сложно ли это сделать, вопрос в том, полезно ли так сделать.

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

Кто эти люди? Уж не я. Я использовал лисп на последних 5 местах работы, а также в 3-4 последних хоббийных проектах. Где-то так. Но лисп не идеален. Если бы было иначе, не было бы ни Явы, ни Перла, ни Питона, ни Раста.

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

Сам, а чё? Молотый в чашку засыпаю и заливаю кипятком. 3 в 1 говорят, содержит много бензола. Нельзя внутрь употреблять.

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

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

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

Видел я тут недавно XML файлы сборки анта. По сравнению с XML лисп для человеков.

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

Вот смотри, сахар описывает только ограниченное количество синтаксических конструкций. И если ты предполагаешь вмешательство в с чистый синтаксис, то он в большинстве случаев обратно в сахар не преобразуется. То есть придется оставлять в виде чистого синтаксиса. Либо это должен быть какой-то новый упоротый синтаксический сахар на все случаи жизни, а по сути второй синтаксис с обратимой трансляцией друг в первый, с сохранением человекочитаемости при этом. И что это тогда получится, и главное зачем? С этой точки зрения уже и не имеет смысла твой вопрос.

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

Потому-что это для человека нужны более бегло узнаваемые конструкции, чем подсчет скобочек. А в лиспе вся читаемость в итоге упирается в подбор годных идентификаторов. Но даже с этим, очень сложно добиться читаемости, потом-что в терминах человеков получатся контекстозависимый изолированный язык практически без какой-либо грамматики, просто слова записанные в строчку. И опять упирается в пересчет скобочек. Либо нужно извращаться с отступами, но зачем тогда лисп.

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

Это да, но только потому-что XML перегружает текст бессмысленным для человека мусором. А по сути не так уж и далеко от лиспа о XML.

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

Ты нормальный лиспокод когда-нибудь пробовал читать? Пробовал писать его в редакторе, который поддерживает автоформатирование его?

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

Писать не пробовал, читать — не могу судить насколько он нормальный.

Esteban_Garcia
()

код хранится в файле именно в таком виде.

При открытии файла в среде к нему применяется сахар.

Похоже на XML-редакторы... там тоже переносы игнорировались и синонимы были и я даже помню, что мне там не нравилось.

Как у тебя будут хранится комментарии? Я в том смысле, что они часто сильно зависят от отступов и ключевых слов. Типа

(defvar prefs '(1   ; user number
                2   ; file number
                5   ; max connection
                0   ; no save
                7)) ; lucky number
или
(defvar prefs '(,user no-save ,max-conn 7))
;                   lucky number -------^

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

все равно


list(1, 2, 3) map(x, x + 1) reduce(+)
// лучше чем
(reduce + 
 (map (lambda(x) (+ x 1))
  (list 1 2 3)))
дело тут не столько в скобках и их форматировании, сколько в гребаном функциональном стиле, который заставляет тебя думать через задницу. Получается, что последовательность вычислений идет задом наперед, каждый добаляемый шаг, если ты его сразу не предусмотрел, приходится втискивать между скобок, это сильно утомляет. Рефакторить такой код — это сущий ад.

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

Вот смотри, сахар описывает только ограниченное количество синтаксических конструкций.

Так в языках вообще ограниченное число синтаксических конструкций. Условно (if a b c) <=> if a then b else c для любых a b и с.

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

Если останется годным синтаксисом, то преобразуется. При наличии сахара для этого синтаксиса. Можешь считать, что сахар — это «раскраска синтаксиса». Ведь тебя не удивляет, что IDE всегда правильно ключевые слова раскрашивает и отступы ставит.

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

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

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

list(1, 2, 3) map(x, x + 1) reduce(+)

Это надо сравнивать с

(@ '(1 2 3) (map #L(+ !1 1)) (reduce +))

А

(reduce + 
 (map (lambda(x) (+ x 1))
  (list 1 2 3)))

с

reduce(+, 
  map(function(x) { return x + 1; }, 
      list(1, 2, 3)))

По-моему, одинаково читаемо

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

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

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

зачем же выборочно сравнивать.

Так и я про то же. Если надо писать в именно функциональном+ООП стиле, то на лиспе (в смысле Common Lisp) будет использоваться библиотека с соответствующим макросом. Если просто человек будет переписывать алгоритм на лиспе, то использует стандартные конструкции и будет (для любого map/reduce) что-то вроде

(loop for i in '(1 2 3)
      sum (+ i 1))

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

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

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

Я же тебе привёл пример. с (@ ...). Он уже написан.

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

Как у тебя будут хранится комментарии?

Да, это проблема. По второму случаю можно сделать 7#|lucky number|# , а с первым случаем явно не повезло и сделать ничего нельзя. Разве только ввести понятие таблицы (я в Mathematica одно время хотел так кодить, но до дела не дошло).

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

А в лиспе вся читаемость в итоге упирается в подбор годных идентификаторов

Я встретил проблему в том, что не хватает коротких слов. Можно наполнить язык всевозможными !@#$%^&*, а можно всё выписывать словами. На самом деле для каждой конкретной ситуации короткие значки нужно задействовать под те последовательности слов или иных знаков, которые в этой ситуации встречаются более часто. Т.е., нужно как бы заархивировать текст. Тогда он станет короче.

Я столкнулся с невозможностью выработать универсальный набор значков. Их тупо не хватает. Особенно если хочется часть оставить пользователю на DSL-и. Отсюда и возникает мысль: создать набор длинных выражений, которые годятся на все случаи жизни. При этом все короткие значки останутся свободными! Сахар состоит в том, что для конкретного случая существует свой оптимальный способ сопоставления коротких значков длинным, и невозможно придумать этот способ на этапе разработки языка. Тем более один способ невозможно придумать - его просто нет в природе.

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

Я тут почитал предыдущие треды вскользь, пробежался по описанию проекта. У меня есть один вопрос, собственно, а зачем ты его пилишь? Ведь очевидно, что не взлетит. А столько времени и энтузиазма тратишь понапрасну же.

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

Есть определённая граница между лиспом и не-лиспом. Она проходит по тому месту, где возникает инфиксная запись и приоритет операторов. Например, писать формулы в лиспе просто очень и очень неудобно, при всём моём опыте мне это не понравилось. Формулы должны быть похожи на формулы, потому что их мы будем сверять с бумажкой.

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

длинное_выражение1 or длинное_выражение2 and длинное_выражение3

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

(or
  длинное_выражение1 
  (and длинное_выражение2 длинное_выражение3))

Это объективно проще распарсить. Можно конечно

длинное_выражение1 or (длинное_выражение2 and длинное_выражение3)

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

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

По второму случаю можно сделать 7#|lucky number|# , а с первым случаем явно не повезло и сделать ничего нельзя.

Так можно и с первым 1#|user number|#, 2#|file number|#. Проблема исключительно в парсинге/генерации текста. Либо парсер должен быть сильно интеллектуальным, чтобы догадаться к какой лексеме какой комментарий, либо надо делать IDE с плавающими рядом комментариями...

Ещё в комментариях бывает псевдографика (таблицы, диаграммы, ...). Это тоже надо учесть. Хотя если нагружать IDE, то можно хоть картинки и видео вставлять :-)

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

писать формулы в лиспе просто очень и очень неудобно, при всём моём опыте мне это не понравилось. Формулы должны быть похожи на формулы, потому что их мы будем сверять с бумажкой.

Гм. Берём простейшую формулу дискриминанта:

\frac{-b - \sqrt{b^2 - 4ac}}{2a}

произносим "отношение разности между -b и квадратным корнем из
 разности квадрата b и четырёхкратного произведения a и c, к удвоенному a"

на лиспе пишем
(/ (- (- b) (sqrt (- (sqr 2) (* 4 a c))))
   (* 2 a))

на фортраноподобном
(-b - sqrt(sqr(b)-4*a*c))/(2*a)

Тебе точно фортраноподобный кажется естественней?

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

Я встретил проблему в том, что не хватает коротких слов.

Так в каждом модуле можно свои короткие слова создавать, кто мешает? Чем принципиально слово отличается от любого другого макроса?

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

3 в 1 говорят, содержит много бензола.

Однако кофе, сахар и молоко до начала употребления храню в отдельных ёмкостях.

Вот кофе и молоко, говорят, лучше и употреблять по отдельности (как впрочем чай и молоко).

gag ★★★★★
()

Кстати, а есть уже соответствующий файлик для bison/flex, re2c, ragel (или аналогов)? Когда язык ещё пишется, реальность компактного описания грамматики была бы хорошим знаком.

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

Я столкнулся с невозможностью выработать универсальный набор значков. Их тупо не хватает.

В юникоде не хватает?

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

произносим

Однако, ТС писал «Формулы должны быть похожи на формулы, потому что их будем сверять с бумажкой», а не «код должен быть похож на русский язык, потому что будем его читать вслух».

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

В юникоде не хватает?

Даже юникод не обязателен. Бери пример с Haskell:

sextupleTest = (0,1,0,1,0,1)
    & _1 .~ 7
    & _2 %~ (5 *)
    & _3 .~ (-1)
    & _4 .~ "orange"
    & _5 %~ (2 +)
    & _6 %~ (3 *)

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

Лексер/парсер я написал руками, но теперь его надо полностью переработать, поскольку синтаксис с тех пор сильно поменялся. Есть описание на примерах, в нём почти всё устаканено.

https://bitbucket.org/budden/yar/src/default/doc/описание-языка/синтаксис-201...

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

На юникод пока не хочу закладываться.

den73 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.