ksi : Приоритет побитовых операторов, Приоритет операторов сравнения
От: Sm0ke Россия ksi
Дата: 24.06.21 10:37
Оценка:
Здравствуйте, я разработчик нового языка программирования с динамической типизацией под названием 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"

Это позволяет вызывать функции по цепочке слева-на-право.
[1 2 3] => array #implode ' ' #dump #0
-- выдаст: "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 используют ленивые вычисления.

Приоритет операторов на данный момент такой:
// precedence
enum n_prec {
    prec_leaf,        // (leaf)
    prec_x_then,    //    ? `each `for    (if-then, loop)
    prec_member,    //    a.key a[key]
    prec_rtx_assign,//    => +=> -=> *=> /=> %=> %%=> ??=>
    prec_x_assign,    //    = += -= *= /= %= %%= ??=
    prec_invoke,    //    ! &                (fn call, fn ref)
    prec_mult,        //    * / `mod
    prec_plus,        //    + - % %% &user_fn #native_fn
    prec_cmp,        //    <=>
    prec_less,        //    < <= > >=
    prec_eq,        //    == <>
    prec_and_,        //    `_and            (bitwise)
    prec_xor_,        //    `_xor
    prec_or_,        //    `_or
    prec_throw,        //    `throw
    prec_and,        //    `and            (logical)
    prec_xor,        //    `xor
    prec_or,        //    `or
    prec_nullc,        //    ??                (null coalescing)
    prec_assign,    //    = += -= *= /= %= %%= ??=
    prec_rt_assign,    //    => +=> -=> *=> /=> %=> %%=> ??=>
    prec_then,        //    ? `each `for    (if-then, loop)
    prec_pair,        //    :                (key-value pair)
    prec_root,        //    (top)
};

Как видно из си++ перечисления вызов функций имеет тот-же приоритет, что и у сложения.

Итак суть вопроса 1. Приоритет побитовых операторов.

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)


Стоит ли так поступить с операторами сравнения, или оставить как есть?
ksi precedence bitwise comparison
Re: ksi : Приоритет побитовых операторов, Приоритет операторов сравнения
От: varenikAA  
Дата: 22.07.21 04:57
Оценка:
Здравствуйте, Sm0ke, Вы писали:

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


Для каких задач ЯП?
Не лучше без приоритетов как в лиспе как в прочем и любом ФЯП?
let r = (/) ((*) ((+) 1 2) 3) 2;;
val r : int = 4

пример на F#
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: ksi : Приоритет побитовых операторов, Приоритет операторов сравнения
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 22.07.21 05:55
Оценка: +2
Здравствуйте, 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>[1 2 3] => array #implode ' ' #dump #0
S>-- выдаст: "1 2 3"
S>

S>Функция #dump выводит левый аргумент на экран. Правый аргумент отвечает за многострочность вывода значений составных типов (если #1 то будет несколько строк, иначе вывод в одну строку). Функция #dump возвращает левый аргумент.

А правый всё равно нужен?
Пока что вы объединили неудобства хаскеллоидов с отсутствием их преимуществ, да ещё и сделав непривычным почти всё, что можно.

S>Вызов пользовательских функций осуществляется аналогичным образом. А когда надо передать больше двух значений в функцию можно воспользоваться массивом, ассоциативным массивом или объектом класса (классы пока не реализованны в интерпретаторе).


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

S>Приоритет операторов на данный момент такой:

S>
S>// precedence
S>enum n_prec {
S>    prec_leaf,        // (leaf)
S>    prec_x_then,    //    ? `each `for    (if-then, loop)
S>    prec_member,    //    a.key a[key]
S>    prec_rtx_assign,//    => +=> -=> *=> /=> %=> %%=> ??=>
S>    prec_x_assign,    //    = += -= *= /= %= %%= ??=

И правое и левое присвоение одновременно? А зачем?

S>    prec_invoke,    //    ! &                (fn call, fn ref)
S>    prec_mult,        //    * / `mod
S>    prec_plus,        //    + - % %% &user_fn #native_fn
S>    prec_cmp,        //    <=>
S>    prec_less,        //    < <= > >=
S>    prec_eq,        //    == <>
S>    prec_and_,        //    `_and            (bitwise)
S>    prec_xor_,        //    `_xor
S>    prec_or_,        //    `_or
S>    prec_throw,        //    `throw
S>    prec_and,        //    `and            (logical)
S>    prec_xor,        //    `xor
S>    prec_or,        //    `or
S>    prec_nullc,        //    ??                (null coalescing)
S>    prec_assign,    //    = += -= *= /= %= %%= ??=
S>    prec_rt_assign,    //    => +=> -=> *=> /=> %=> %%=> ??=>

По-моему, я это уже видел выше. Как их различаете?

S>    prec_then,        //    ? `each `for    (if-then, loop)
S>    prec_pair,        //    :                (key-value pair)
S>    prec_root,        //    (top)

Скорее таки bottom :)

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>Но я подумываю над тем, чтобы это изменить. Возможно стОит сделать приоритет == и <> такой-же как у < как считаете?


Да. Иначе непонятен переход от < и <= к ==.
The God is real, unless declared integer.
Re[2]: ksi : Приоритет побитовых операторов, Приоритет операторов сравнения
От: Sm0ke Россия ksi
Дата: 23.07.21 08:32
Оценка:
Здравствуйте, varenikAA, Вы писали:

AA>Здравствуйте, Sm0ke, Вы писали:


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


AA>Для каких задач ЯП?


Ряд целей: скриптовый язык для игр, серверный для сайтов, и для десктоп приложений.

AA>Не лучше без приоритетов как в лиспе как в прочем и любом ФЯП?

AA>
AA>let r = (/) ((*) ((+) 1 2) 3) 2;;
AA>val r : int = 4
AA>

AA>пример на F#

Я уже сделал с приоритетами.
ksi
Re[2]: ksi : Приоритет побитовых операторов, Приоритет операторов сравнения
От: Sm0ke Россия ksi
Дата: 02.08.21 00:42
Оценка: 4 (1)
Здравствуйте, varenikAA, Вы писали:

AA>Не лучше без приоритетов как в лиспе как в прочем и любом ФЯП?

AA>
AA>let r = (/) ((*) ((+) 1 2) 3) 2;;
AA>val r : int = 4
AA>

AA>пример на F#

Добавил поддержку префиксного синтаксиса вызова операторов.

x = (+ a b c d)
str = (?? #, pt.x, "hello")


Обычный синтаксис с приоритетами по прежнему доступен.
ksi
Re: ksi : Приоритет побитовых операторов, Приоритет оператор
От: xma  
Дата: 02.08.21 01:29
Оценка: +1
Здравствуйте, Sm0ke, Вы писали:

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


может те лучше — работу найти ? чем хренью заниматься ..

или вы там — бюджеты осваиваете для Чебурашки ?
Отредактировано 02.08.2021 1:31 xma . Предыдущая версия .
Re[2]: ksi : Приоритет побитовых операторов, Приоритет оператор
От: Sm0ke Россия ksi
Дата: 02.08.21 15:21
Оценка:
Здравствуйте, xma, Вы писали:

xma>может те лучше — работу найти ? чем хренью заниматься ..


xma>или вы там — бюджеты осваиваете для Чебурашки ?


Зачем дизморалишь?
Re: ksi : Приоритет побитовых операторов, Приоритет операторов сравнения
От: Sm0ke Россия ksi
Дата: 09.08.21 17:05
Оценка:
Поменял таки приоритеты побитовых операторов. Теперь они находятся между умножением и сложением.
А приоритеты сравнения < и == объединил в одно значение.

Теперь перечисление приоритетов такое:
// precedence
enum n_prec {
    prec_leaf,        // (ast leaf)
    prec_x_then,    //    _right_operand_: ? `each `for    (if-then, loop)
    prec_member,    //    a.key a[key]
    prec_xrt_assign,//    _right_operand_: => +=> -=> *=> /=> %=> %%=> `and=> `or=> `xor=> ??=> `_and=> `_or=> `_xor=>
    prec_assign,    //    = += -= *= /= %= %%= `and= `or= `xor= ??= `_and= `_or= `_xor=
    prec_invoke,    //    ! &                (fn call, fn ref)
    prec_mult,        //    * / `mod
    prec_and_,        //    `_and            (bitwise)
    prec_xor_,        //    `_xor
    prec_or_,        //    `_or
    prec_plus,        //    + - % %% &user_fn #native_fn
    prec_cmp,        //    <=>
    prec_eq,        //    == <> < <= > >=
    prec_throw,        //    `throw
    prec_and,        //    `and            (logical)
    prec_xor,        //    `xor
    prec_or,        //    `or
    prec_nullc,        //    ??                (null coalescing)
    prec_x_assign,    //    _right_operand_: = += -= *= /= %= %%= `and= `or= `xor= ??= `_and= `_or= `_xor=
    prec_rt_assign,    //    => +=> -=> *=> /=> %=> %%=> `and=> `or=> `xor=> ??=> `_and=> `_or=> `_xor=>
    prec_then,        //    ? `each `for    (if-then, loop)
    prec_pair,        //    :                (key-value pair)
    prec_root,        //    (ast top)
};
ksi precedence enum
Re[3]: ksi : Приоритет побитовых операторов, Приоритет оператор
От: saf_e  
Дата: 10.08.21 08:35
Оценка:
Здравствуйте, Sm0ke, Вы писали:

S>Здравствуйте, xma, Вы писали:


xma>>может те лучше — работу найти ? чем хренью заниматься ..

xma>>или вы там — бюджеты осваиваете для Чебурашки ?

S>Зачем дизморалишь?


У меня прошло много времени прежде чем я научился задавать себе вопрос: зачем оно нужно? Если бы это случилось раньше, я бы больше времени потратил на что-то более полезное )

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

З.Ы. Не совсем понятен подход к синтаксису. Он непривычный, явно усложняет чтение и написание, а вот что дает — неочевидно. Если это для облегчения работы компилятору, то подход заведомо неверный. Легко должно быть разработчику, а компилятор пусть трудиться!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.