Здравствуйте, я разработчик нового языка программирования с динамической типизацией под названием ksi. Надеюсь вы мне поможете определиться с приоритетом операторов в этом языке.
Введение
В ksi есть разграничение имён функций, типов, переменных и ключевых слов.
Имена типов начинаются с символа $ ($int $float $text $bool $null)
Имена пользовательских функций — с символа & (&my_func_1)
У native функций это символ # (#implode #echo #dump #not #_not)
Для ключевых слов это символ обратной кавычки (backtick) `and `or `xor `while `_and `_or `_xor
Переменные же без спец. символа (x y z msg)
Однострочные комментарии начинаются с последовательности -- (это как в 3ds max script)
Многострочные комментарии могут быть вложенными и они как в c++ /* comment */
Специальные значения:
# -- null
#0 -- false
#1 -- true
Отрицательные значения:
1_ -- минус один
0.5_ -- минус ноль целых пять десятых
В ksi есть оператор присвоения вправо:
1 + 2 => x
Вызов функций у ksi отличается от других языков программирования. Функции принимают два аргумента — левый и правый.
x = [1 2 3] -- массив
y = x #implode ", "
-- y = "1, 2, 3"
Это позволяет вызывать функции по цепочке слева-на-право.
Функция #dump выводит левый аргумент на экран. Правый аргумент отвечает за многострочность вывода значений составных типов (если #1 то будет несколько строк, иначе вывод в одну строку). Функция #dump возвращает левый аргумент.
Вызов пользовательских функций осуществляется аналогичным образом. А когда надо передать больше двух значений в функцию можно воспользоваться массивом, ассоциативным массивом или объектом класса (классы пока не реализованны в интерпретаторе).
Побитовые операторы:
a `_and b
a `_xor b
a `_or b
Логические операторы:
a `and b
a `xor b
a `or b
Операторы `and и `or используют ленивые вычисления.
2 + 2 `_and 1 #dump #0
-- Это выражение на данный момент аналогично выражению:
(2 + 2) `_and (1 #dump #0)
-- вывод на экран: 1
Что на мой взгляд не совсем интуитивно. И я подумываю изменить приоритет побитовых операторов в ksi, чтобы они находились между умножением и сложением.
-- И тогда:
2 + 2 `_and 1 #dump #0
-- будет аналогично выражению:
(2 + (2 `_and 1) ) #dump #0
-- что выдаст: 2
Вопрос 2. Приоритет операторов сравнения.
Я сделал так, что операторы сравнения больше/меньше/больше-или-равно/меньще-или-равно в ksi можно вызывать по цепочке.
a < b < c < d -- выражение 1
-- не идентичный аналог:
(a < b) `and (b < c) `and (c < d) -- выражение 2
Выражения 1 и 2 аналогичны, но не идентичны. Их результаты одинаковы, только выражение 1 будет вычисляться быстрее, так как оно преобразуется интерпретатором в меньшее кол-во инструкций.
Операторы сравнения == <> тоже можно вызывать по цепочке.
a == b <> c
-- аналог:
a == b `and b <> c
Теперь если использовать оператор < и оператор == в одной цепочке:
a < b == c < d
-- на данный момент будет аналогично:
(a < b) == (c < d)
-- ведь у оператора < и == разные приоритеты.
Но я подумываю над тем, чтобы это изменить. Возможно стОит сделать приоритет == и <> такой-же как у < как считаете?
-- тогда выражение:
a < b == c < d
-- будет аналогично выражению:
(a < b) `and (b == c) `and (c < d)
Стоит ли так поступить с операторами сравнения, или оставить как есть?
Здравствуйте, Sm0ke, Вы писали:
S>Здравствуйте, я разработчик нового языка программирования с динамической типизацией под названием ksi. Надеюсь вы мне поможете определиться с приоритетом операторов в этом языке.
Для каких задач ЯП?
Не лучше без приоритетов как в лиспе как в прочем и любом ФЯП?
Здравствуйте, Sm0ke, Вы писали:
S>Здравствуйте, я разработчик нового языка программирования с динамической типизацией под названием ksi.
Новые языки с динамической типизацией нужны только если они дают какой-то суперпрорыв в логике их работы. Иначе лучше взять любой из 100500 существующих или 3 топовых вроде JS, Python, Ruby.
Вот со статической типизацией и толковым выводом типов пока почти швах — или экспериментальные разработки, или слабые промышленные решения.
Ну и эстетически то, что вы показываете, выглядит корявовато и непривычно. Слегка напоминает k/q, но без их преимуществ.
S> Надеюсь вы мне поможете определиться с приоритетом операторов в этом языке.
S>Введение
S>В ksi есть разграничение имён функций, типов, переменных и ключевых слов.
S>Имена типов начинаются с символа $ ($int $float $text $bool $null)
Непонятно зачем — лучше определять где тип по контексту — ну ладно.
S>Имена пользовательских функций — с символа & (&my_func_1) S>У native функций это символ # (#implode #echo #dump #not #_not)
Непонятен смысл такого разделения.
S>Для ключевых слов это символ обратной кавычки (backtick) `and `or `xor `while `_and `_or `_xor
Это не любят. Можно придумать доп. символ для уточнения, что это обязательно ключевое слово, но не в обязательном порядке.
S>Однострочные комментарии начинаются с последовательности -- (это как в 3ds max script) S>Многострочные комментарии могут быть вложенными и они как в c++ /* comment */
Разнобой в стиле. Почему не какое-нибудь (-- ... --)? Или вообще вначале без многострочных комментариев?
S>Отрицательные значения: S>
S>1_ -- минус один
S>0.5_ -- минус ноль целых пять десятых
S>
Ой ой ой... вы это серьёзно?
S>Вызов функций у ksi отличается от других языков программирования. Функции принимают два аргумента — левый и правый. S>
S>x = [1 2 3] -- массив
S>y = x #implode ", "
S>-- y = "1, 2, 3"
S>
S>Это позволяет вызывать функции по цепочке слева-на-право. S>
S>Функция #dump выводит левый аргумент на экран. Правый аргумент отвечает за многострочность вывода значений составных типов (если #1 то будет несколько строк, иначе вывод в одну строку). Функция #dump возвращает левый аргумент.
А правый всё равно нужен?
Пока что вы объединили неудобства хаскеллоидов с отсутствием их преимуществ, да ещё и сделав непривычным почти всё, что можно.
S>Вызов пользовательских функций осуществляется аналогичным образом. А когда надо передать больше двух значений в функцию можно воспользоваться массивом, ассоциативным массивом или объектом класса (классы пока не реализованны в интерпретаторе).
В дверь застенчиво стучится хаскельный стиль определения функций на сколько угодно аргументов через замыкания и карринг.
S>Приоритет операторов на данный момент такой: S>
S>Как видно из си++ перечисления вызов функций имеет тот-же приоритет, что и у сложения.
S>Итак суть вопроса 1. Приоритет побитовых операторов.
S>
S>2 + 2 `_and 1 #dump #0
S>-- Это выражение на данный момент аналогично выражению:
S>(2 + 2) `_and (1 #dump #0)
S>-- вывод на экран: 1
S>
S>Что на мой взгляд не совсем интуитивно. И я подумываю изменить приоритет побитовых операторов в ksi, чтобы они находились между умножением и сложением.
Я лично не вижу причины делать разницу в приоритете между * и `_and, или, в другой группе, между +, `_or и `_xor.
Для кодера это операции примерно одного типа. С другой стороны, когда они смешиваются, надо чётко разделять контексты, и это лучше делать скобками.
Туда же сдвиги — их приоритет должен быть наравне с умножением и делением.
S>Но я подумываю над тем, чтобы это изменить. Возможно стОит сделать приоритет == и <> такой-же как у < как считаете?
Здравствуйте, varenikAA, Вы писали:
AA>Здравствуйте, Sm0ke, Вы писали:
S>>Здравствуйте, я разработчик нового языка программирования с динамической типизацией под названием ksi. Надеюсь вы мне поможете определиться с приоритетом операторов в этом языке.
AA>Для каких задач ЯП?
Ряд целей: скриптовый язык для игр, серверный для сайтов, и для десктоп приложений.
AA>Не лучше без приоритетов как в лиспе как в прочем и любом ФЯП? AA>
AA>let r = (/) ((*) ((+) 1 2) 3) 2;;
AA>val r : int = 4
AA>
Здравствуйте, Sm0ke, Вы писали:
S>Здравствуйте, я разработчик нового языка программирования с динамической типизацией под названием ksi. Надеюсь вы мне поможете определиться с приоритетом операторов в этом языке.
может те лучше — работу найти ? чем хренью заниматься ..
Поменял таки приоритеты побитовых операторов. Теперь они находятся между умножением и сложением.
А приоритеты сравнения < и == объединил в одно значение.
Здравствуйте, Sm0ke, Вы писали:
S>Здравствуйте, xma, Вы писали:
xma>>может те лучше — работу найти ? чем хренью заниматься .. xma>>или вы там — бюджеты осваиваете для Чебурашки ?
S>Зачем дизморалишь?
У меня прошло много времени прежде чем я научился задавать себе вопрос: зачем оно нужно? Если бы это случилось раньше, я бы больше времени потратил на что-то более полезное )
В вашем случае каких-то преимуществ у языка не видно, если вы делаете это по фану или чтобы прокачаться в языкописании то ок, если же рассчитываете что язык пойдет в массы, то шансов на это немного.
З.Ы. Не совсем понятен подход к синтаксису. Он непривычный, явно усложняет чтение и написание, а вот что дает — неочевидно. Если это для облегчения работы компилятору, то подход заведомо неверный. Легко должно быть разработчику, а компилятор пусть трудиться!