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

★★★★★

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

Второй вариант читаемее. Не нашёл документации по языку, поэтому вопросы:

  1. Почему цикл/первый, а не цикл?
  2. Что это за приставка у #:когда?
  3. Усложним пример:
def calc_bonus(tau, wordLen, hints):
    if hints > 4:
        return 0
    tau -= (wordLen // 4)
    if tau > 30:
        return 0
    bonus = - hints
    points = [(2, 5), (7, 3), (15, 2), (30, 1)]
    for p in points:
        if tau < p[0]:
            bonus += p[1]
            break
    return max(0, bonus)

Как в данном случае будет?

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

С какой wiki? Википедии? Или wiki.python.org ?

С любой.
Суть в том, чтобы был в wiki какой-то текст программы /пусть на Python например/, а вы
привели бы тот же пример кода на вашем языке программирования /даже отлаживать ничего не нужно/.

Владимир

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

Почему цикл/первый, а не цикл?

Потому что выполняется только один цикл при условии. У тебя после условия break.

Что это за приставка у #:когда?

#:? Обозначает, что это не имя функции или переменной, а имя аргумента конструкции цикл. Эквивалент в питоне — именованные аргументы.

Усложним пример:

Здесь два варианта. Один: переписать под традиции лиспов. Будет так:

calc-bonus(tau wordLen hints) =
  tau := tau - wordLen // 4
  условия
   ;
    hints > 4; 0
    tau > 30; 0
    иначе
      bonus = - hints
      points = #((2 5) (7 3) (15 2) (30 1))
      цикл/первый (p points; #:когда tau < p[0])
         bonus := bonus + p[1]
      макс 0 bonus

Второй: указать, что есть досрочный выход из блока:

calc-bonus(tau wordLen hints) =
  с-выходом возврат
    когда (hints > 4)
      возврат 0
    tau := tau - wordLen // 4
    когда (tau > 4)
      возврат 0
    bonus = - hints
    points = #((2 5) (7 3) (15 2) (30 1))
    цикл/первый (p points; #:когда tau < p[0])
       bonus := bonus + p[1]
    макс 0 bonus
monk ★★★★★ ()
Последнее исправление: monk (всего исправлений: 1)
Ответ на: комментарий от anonymous

Почему не CalcBonus.

А почему CalcBonus? Кроме синдрома утёнка. В именах файлов «-» используешь? Или тоже называешь типа «МоиВажныеДокументы»?

В моём языке как и во всех лиспах в идентификаторах можно использовать -, +, ?, ^… и вообще любые символы кроме ( ) [ ] { } " , ' `` ; | \ и нельзя начинать имя на #

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

Красиво. Для отдельно взятого академика - идеальный инструмент. Только это имитация. Иначе не было бы этого «с-выходом возврат» и «;» в отдельной строке.

Если взять не академика, а команду обычных быдлокодеров, то они тоже смогут какой-то код писать, запомнив особенности этой конкретной имитации: «тут добавь приставку к «когда», а тут не добавляй. Так уж заведено».

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

Ок. По императивному программированию разобрались. Посмотрим что получится, когда можно будет писать с «зависимостями на тяжёлые библиотеки».

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

А почему CalcBonus? Кроме синдрома утёнка.

Сразу выделяется смысловая часть: Calc и его тип Bonus.
Не принципиально конечно /мне так удобнее/.
Вот Calc-Bonus смотрелся бы как Calc - Bonus.
Ни когда Lisp не использовал … /это не значит, что он плох/.

Владимир

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

Только это имитация. Иначе не было бы этого «с-выходом возврат» и «;» в отдельной строке.

Я чуть затупил. «;» здесь (после условия) не надо. Она нужна, когда у одной конструкции два набора вложенных конструкций. Например, после цикл/первый, если использовать отступы, а не конструкцию (...; ...).

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

тут добавь приставку к «когда», а тут не добавляй.

Это не приставка, это определение локальной функции «возврат». «Когда» работает безотносительно её наличия. «Когда» = «если», в котором нет ветки иначе.

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

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

import tensorflow as tf
import tensorflow_hub as hub

from tensorflow.keras import layers
import numpy as np
import PIL.Image as Image

grace_hopper = tf.keras.utils.get_file('image.jpg','https://storage.googleapis.com/download.tensorflow.org/example_images/grace_hopper.jpg')
grace_hopper = Image.open(grace_hopper).resize(IMAGE_SHAPE)

result = classifier.predict(grace_hopper[np.newaxis, ...])

predicted_class = np.argmax(result[0], axis=-1)

labels_path = tf.keras.utils.get_file('ImageNetLabels.txt','https://storage.googleapis.com/download.tensorflow.org/data/ImageNetLabels.txt')
imagenet_labels = np.array(open(labels_path).read().splitlines())

predicted_class_name = imagenet_labels[predicted_class]
print "Prediction: " + predicted_class_name.title()

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

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

Сразу выделяется смысловая часть: Calc и его тип Bonus.

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

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

Ведь это имена, если их пишут с большой буквы.

Вовсе не для этого используется большие буквы.
Просто calcbonus менее readable, чем CalcBonus.

Владимир

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

Потому то вы и используете в названии дефис «calc-bonus».

Абсолютно не принципиально.

Шутка /в которой доля правды есть/.

Если мне «попадется» исходник с идентификаторами типа «calc-bonus», то просто проведу рефакторинг имен к тем, что мне удобны.
А вы мои исходники с идентификаторами типа «CalcBonus» быстренько приведете к виду «calc-bonus».

И вы и я правы /надеюсь, что это так/.

Владимир

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

субъект помыть объект в случае совпадения субъекта и объекта заменяется на субъект помыться

ещё один жестоко изнасилованный ООП

помыть субъект, объект

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

дядь вов, посмотри на Кложу

Да мне все языки программирования нравятся /даже Basic 1917 года/.
Для разработки API использую C++ в стиле а-ля Си.

Но

Приходится и макароны "жрать" если того требует мой начальник

Владимир

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

Это не приставка, это определение локальной функции «возврат»

Я говорил о том, что в одном месте «когда», а в другом «#:когда». Будет ли обычный кодер разбирать где тут определение, а где имя аргумента? Скорее всего в его голове оно просто приведётся к привычным конструкциям из императивных языков, а не к LISP-конструкциям. Просто в этот раз его заставили писать на языке с такими особенностями.

Для этого надо сделать реализацию этих самых библиотек в новом языке.

Реализовать малыми силами tensorflow, numpy, PIL? Проще, вероятно, обёртку для OpenCV сделать, там вроде даже какая-то нейронка есть. Наверное, ей далеко до той, что в tensorflow, но хоть что-то. Только и это задача не для одиночки.

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

помыть субъект, объект

Если по-русски, то ООП ближе. В смысле, «слуга, помой тарелки!» И если мы даже и выносим глагол в начало, то будет «помой тарелки, лентяй!», а не «помыть лентяй, тарелки».

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

Я говорил о том, что в одном месте «когда», а в другом «#:когда».

Ну в питоне тоже такое бывает:

from itertools import *
a = repeat(10,3)
b = product('ABCD', repeat=2)

И никого же не удивляет, что в первой строки repeat функция, а во второй — имя аргумента. Причём для питона тоже было бы лучше

b = product('ABCD', #:repeat=2)

Так как без него вполне могут быть вызовы типа

f(x, x==3, x=g(x))

где визуально вообще ничего не понять.

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

Реализовать малыми силами tensorflow, numpy, PIL?

Эту задачу даже не ставлю. Ставлю задачу реализовать стандартную библиотеку Racket и стандартную библиотеку Python (там, где нет аналогов из Racket). Есть (от Racket) интеграция с сишными библиотеками.

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

Итоги 20-го международного конкурса непонятного кода на C

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

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

визуально вообще ничего не понять.

Синтаксический мусор помогает понимать? Не надо проблемы синтаксиса преподносить как преимущество.

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

Синтаксический мусор помогает понимать?

Какой же он мусор, если у него смысл есть? Он не больше синтаксический мусор, чем «{», «}», «,» и «;» в Си.

Без него вызовы

product "ABCD" repeat 2 -- 3 аргумента

и

product "ABCD" #:repeat 2 -- 2 аргумента, один с именем repeat

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

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

Какой же он мусор, если у него смысл есть?

Смысл можно вывести из контекста, с чем хорошо справляется человек и (даже) интерпретатор питона в приведенном тобой примере. А ты ничего не сделал с грамматикой и заставляешь писать # на русской раскладке.

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

ты ничего не сделал с грамматикой

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

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

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

Да, кстати — я без наезда на ТС, но меня посещала похожая идея. А можно ведь и «не тупой» перевод сделать. Можно посмотреть на ранее сделанное по похожим на паскаль языкам. Был РАЯ академика Ершова. Ещё раньше был АЛГОЛ-60, который, кстати, был многоуровневым, на уровне публикации допускалось использование национальных ключевых слов - то есть там отношение к локализации ЯП было не «ну вы тупыыые», а прямо наоборот — как к достаточно очевидной и востребованной вещи.

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

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

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

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

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

РАЯ академика Ершова

Ключевые слова нц, кц, переменные англоязычные. Это точно лучше?

Русскоязычный АЛГОЛ-60 не видел. Такой точно существовал?

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

Вроде бы в питоне «если» не используется как аргумент.

В питоне нет функций-циклов. Или я не нашёл.

Потому что есть общеязыковое понятие итератора.

В Scheme/Racket наоборот. Есть рекурсия, которой можно реализовать любой цикл.

То есть вместо

цикл/первый (p points; #:когда tau < p[0])
         bonus := bonus + p[1]

я мог написать

пусть цикл (points points;)
  шаблон (пара p остаток) = points 
  если
    tau < p[0]
    bonus := bonus + p[1]
    цикл остаток

А все упрощения цикла — обычные функции и макросы с аргументами.

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

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

нц и кц - идея в том, чтобы отделить начало и конец цикла от собственно начала и конца. Это уже даже не паскаль, это перекликается (хоть и не 1:1) с тем, что было в Ada и PL/SQL.

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

нц и кц - идея в том, чтобы отделить начало и конец цикла от собственно начала и конца

Да это понятно. Я в том смысле, что с читабельностью там не очень хорошо. Для очень коротких программ подходит. Собственно, и используется для обучения.

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

Почему плюсовик? У них как раз for_each, lower_bound и tree_order_statistics_node_update. А calcBonus, setObjectMethodLocal и прочие calculateMonthlyCheckAmountForSalesmanForExportToAccountingSystemAndReconciliation — это ересь, продвигаемая последователями Java.

monk ★★★★★ ()