Pull to refresh

Comments 110

Идеальный язык. В следующую версию добавьте, пожалуйста:


  • родственные отношения
    В обычных языках есть наследование, но оно ограничивается примитивным отношением "родитель-ребенок". Карейсик должен уметь создавать отношения вроде "богатый дядя-племянник", при завершении существования первого ресурсы передаются последнему, или "зять-тёща", увешанных взаимными промисами.
  • нетерпеливые функции, которые иногда могут и не дождаться await
  • мутирующие по ходу их написания функции (это скорее к IDE, но пусть будет)
  • блямбда-функции, облегчающие мат в документации
  • логику на основе смайликов вместо булевой
    :) = True, false => :(, ~_(°•°)_/~ = unpredictable behavior

Усыновить чтобы в ран-тайме можно было, или в детдом сдать всех наследников

Это же лошадь!

В ростовской области её таранкой или таранью кличут.
Так на языке и вертится: язык программирования "Таранко"…
пысы. как раз висит на балконе вялится...

Эти два выражения выглядят одинаково

А кто такой одинакий и за что они его выглядят?

UFO just landed and posted this here

Да это не хабрапарсер скушал табы, а моя Т9 скушала ошибку. В оригинале там было слово "одинакого"

Только когда дошёл до tryso вспомнил какое сегодня число

Хотел написать гневно возражение на счёт дифыеренциации tab и space, но потом перевернул календарь и все понял. Гениально, что сказать!

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

Ну знаете, после статей про сортировку воронками все не так просто.

Неплохо было бы чтоб исходник был не просто текстом, а целым документом. Чтобы массивы можно было набивать в табличку. В комментарии пихать рисунки.

Вот вы смеётесь, а кто-то на хабре мне неиронически доказывал, что писать комменты маркдауном и эмбеддить в них рисунки — это не только нормально, а даже и вполне удобно.

Насчёт рисунков не знаю, но набирать комментарии в markdown действительно удобно.

кстати, какой то IDE позволял даже TeX

С этим-то я согласен, я в принципе стараюсь писать маркдауном где только можно. Но этот человек считал, что конкретно конструкция ![]() уместна в комментариях внутри кода.

Конечно уместна, если из комментариев генерируется документация, как это бывает примерно во всех адекватных ЯП.

То, где кончается md, я даже html-ем пишу. Слава дока-генераторам!

Хабр — самое злое сообщество по шуткам на первое апреля. Уже какой год единственным разумным решением является просто не читать хабр пару дней. Да я брюзга.

Кроме статической и динамической типизации в языке karasic также представлена типизация кинематическая.
вы будете смеяться, но теперь я нашел имя тому поделию, которое видел 10 лет тому назад: оно умело присваивать любые структуры друг другу, присваивая только те части, которые были и в типе-источнике и в типе-получателе, (т.е. если у вас типы одинаковые — то это просто присваивание, а если это присваивание Point в Rect например — то только x и y). При этом еще умело строки в числа и обратно. В общем — все зависело от силы разработчика и энергии его желания что-то куда-то присвоить :)

А как оно в случае тех же Point и Rect поступало с недостающими в источнике полями? Оставляло имеющиеся? Если так, то это, конечно, не присваивание, но вообще-то полезная операция для всяких грязных низкоуровневых дел. Такой типа отдалённый аналог прототипного наследования, но используемый по необходимости, а не при генерации структуры (и поэтому не требующий думать о том, кто кому наследник и как это всё разрешается).


Если аналогичным образом определить операцию сложения, то те же виджеты композируются вообще красиво. Прототип виджета (стиль, логика) плюс точка (координаты), плюс пользовательская сессия (кодировка, локализация) плюс нечто, возвращённое базой данных (собственно содержимое) равно готовый элемент интерфейса. Можно ещё кидать исключение, когда несколько "родителей" имеют общие поля, тогда вообще целая парадигма получается.

да, оставляло имеющиеся.
и, да, это было для UI тестирования — там действительно целая концепция на уровне архитектуры (уж не знаю — тянет это на «парадигму» или нет) чтобы можно было красиво делать композицию повторяющихся наборов действий и данных для них (и проверок с отчетами) :)
Object.assign() в js делает примерно тоже самое, только ему ещё и на типы плевать. Тупо присвоит по ключам что есть и всё.
ненене, целевые типы не перезаписывались — они нужны были для последующих операций.
Например: источники данных пробовали записать свои структуры в целевую, после чего она передавалась в метод «работаем», после чего структура результата пыталась присвоиться структурам разных отчетов, и если отчет видел что он получил что-то валидное — он о себе рапортовал. Там было много и других вариаций, но подход к присваиванию структур мне запомнился надолго %)

Не раскрыта тема "оступы vs скобочки". Карасик, как по-настоящему дружественный язык, должен принимать оба варианта.

Причём ещё и разрешать смешивать


fn main()
    return 0
}

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


if a > b)
    while (c < d:{
        func( a b, c, d]
end if
UFO just landed and posted this here
a + b => c
return c
Не последовательно. Тогда уж: c => return
Или сразу уже
a + b => c => return


Ну или для краткости return можно вообще опустить
fn foo(a,b) {
    a + b => c =>
}
Это современный подход. Но тогда уже снова надо быть последовательным:
{ a + b => } fn foo(a,b)
Как насчет:
a + b => fn foo(a,b)

Лучше так:


(a, b) => a + b => fn foo
Часть
(a, b) => a + b
слишком похоже на традиционную (а следовательно, устаревшую) запись лямбда-функции.

Учитывая инновационный инвертированный порядок записи, я бы предложил:
a + b <= (a, b) => fn doo

2020 год на дворе, хватит уже использовать эти уродливые составные символы и уповать на шрифты с лигатурами! Надо брать лучшее из Coq и Agda!


a + b ⇐ (a, b) ⇒ fn doo

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


a + b ⇐ (a, b) ⇒ sum
Так как в теле функции нет локальных переменных, мы можем написать код еще лаконичнее!
a + b ⇔ sum
Ждём систем перекомпиляции в karasic из C/C++/C# (karaCc), Java/JavaScript (karaJc), R (kaRasic), Ada (kADAsic), а также остальных, которым не хватило букв.
Еще на базе какого-нибудь языка можно написать платформы karantool и karashouse
К сожалению, в языке, несмотря на прогрессивное правосторонее присваивание, остались обидные стереотипы-рудименты. В частности, использование фигурных скобок в классическом порядке: {}.
Для сохранения целостности внутренней логики языка, необходимо изменить порядок следующим образом: }{. Это позволяет создать интуитивно понятное мнемоническое правило:
открывающая скобка "}" — карасик плывет вперед }<>
закрывающая скобка "{" — карасик закончил и развернулся хвостиком вперед <>{, довольно оглядывая функцию.

Еще, в статье ни слова про дебаггинг, что было бы крайне полезно, ведь язык только возник, и в карасик деве все априори будут новичками. Так что ждем дистрибутив с дебаггером jerliza и удобную графическую IDE Oparysh.

Чёрт, я повёлся.
Было бы забавно, если бы эта штука могла компилироваться в JavaScript.

UFO just landed and posted this here

А вы имеете что-то против пятого колеса телеге?

Так интересно смотреть на людей, которые бросаются коментить, не прочитав статью (по крайней мере внимательно).

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


<think 0.2>
a ?=> b

# На трипл ведёт себя как а => b
# На дабл ведёт себя как if random() <= 0.2 {a =>b}

Более формально: значение присваивается с задаваемой пользователем вероятностью не выше 0.1 (всегда присваивает на дабл) и не ниже 0.01 (присваивает только на трипл). Вероятности ниже 0.01 не поддерживаются синтаксисом, т.к. настолько маловероятные события сложно покрыть юнит-тестами. Тем не менее, операции на квадрипл и меньшие вероятности могут быть импортированы из стандартной библиотеки. Распределение униформное, вероятность присваивания на дабл фиксированная для каждого пространства имён и задаётся оператором think <float>. Использование этого оператора несколько раз в одном пространстве имён является неопределённым поведением и кидает ворнинг.


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


# Распределение бернулли
<think P>
0 => b
1 ?=>> b
# На дабл/трипл ведёт себя как 1 =>> b (или устаревший синтаксис b+=1)

# Биномиальное распределение

<think P>
N => index
while index > 0
    {
    0 => a
    1 ?=>> a
    -1 =>> index
    }

Распределение Пуассона аппроксимируется биномиальным при достаточно высоком N. Аппроксимация нормального распределения выполняется с использованием алгоритмов метапрограммирования. Синтаксис этой аппроксимации слишком громоздок, чтобы поместиться в данном комменте. Но базовая идея состоит в том, что заданная пользователем операция многократно рекурсивно модифицируется таким образом, чтобы создать семейство различных распределений (по дефолту тысячу, но количество может быть определено аргументом компилятора). Затем из каждого распределения берётся по одному значению в том же диапазоне, что и исходная операция. Согласно Центральной предельной теореме, их среднее арифметическое распределено нормально.

Это называется анонимные функции алкоголиков или ай-да-функции!

А степень примерном и задаётся количеством ~
a ~~~~=> b

Оператор примерного присвоения
a ~=> b
А степень примерном и задаётся количеством ~
a ~~~~=> b

Лучше бы в Паскалевском стиле было бы сделать
:= — левое присваивание
=: — правое присваивание
:-)
Вообще хорошая первоапрельская статья получилась.
И реализовать KARASIC на Форте или Лисп-е ;)
С Первым апреля! Улыбайтесь чаще!
Шутка шутками, но идеи управления типизацией, возможность выбора между статической или динамический компиляцией, а также интерпретацией выглядят круто. Жду репозиторий
В Cython есть что-то похожее.
Если везде указываем тип переменных, функций, то это позволяет компилятору оптимизировать код. Если нет — то код выполняется в рантайме Python.
Ну type hinting тоже где-то рядом стоял (python, PHP). А оптимизации прикрутили даже к duck-typed языку JS через набор правил asm.js
UFO just landed and posted this here

В Google colab (там питон) после каждого непойманного исключения появляется кнопка "найти на so".

Ждем, когда язык станет настолько востребован, что даже разработчики Linux позаимствуют парадигму кинематической линковки библиотек)
Я думаю, что для него нужен отдельный редактор, похожий на аквариум, чтобы буквы плавали, как икринки.
ЯП выглядит достаточно интересно. Я бы даже сказал революционно. Но вот отступы — это беда. Отступы — ненужный рудимент, оставшийся от классических ЯП из середины прошлого столетия. По моему скромному мнению, от них надо отказаться вообще. Вместо долгих рассуждений по код-стайлу табуляция/пробелы можно всегда использовать переносы строк.

fn foo(a,b)
{

a + b => c
return c

}

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

if a > b

b = a

a = b


Чем больше переносов строк, тем больше надо полагаться на анализатор ЯП, чем на сам код. Таким образом будет решена давняя проблема «выполняется не то, что хотел программист, а то, что он написал».
Однако, сразу можно найти проблему, что оценивать уровень программистов будут по количеству перенов строк в их коде, т.к. чем больше, тем лучше программист дает контекст для анализатора, что позволяет использовать более глубокий анализ, следовательно более оптимизированный и красивый код.
Также будет решены трудности тех безумцев, что поворачивают монитор на 90 градусов.
Лучше-бы запретили прямой порядок байтов…
тот случай когда чтение каментов доставляет не хуже чем статья.
Предлагаю ввести панику (мне ее после GoLang не хватает) и поддерживаю логику на смайлах и вероятностное присваивание.
Соответственно название проапгрейдить до CarassiusAuratis.
Этому языку родные рантайм-библиотеки не нужны от слова совсем. Он может использовать рантайм любого языка, который по душе разработчику.
А назван он в честь Маргарет Корасик, которая вместе с Альфредом Ахо придумали алгоритм поиска подстроки?
Прям оглаф какой-то.

Не Оглаф. Первая половина типичного Оглафа где?

А то! Без этого не взлетит
а ещё можно feature request?
порой бывает, что нужно вернуть значение, а потом его же вернуть из вызывающей функци а та, в свою очередь,… ну вы поняли.
так вот все эти долгие ретурны чтоб заменить на
value ===> return, чтоб длина стрелочки указывала, как далеко нужно возвращать значение.
И в придачу особый оператор "возврат из восьмерки" (длина оператора не имеет значения), выкидывающий из последовательности вызовов методов (включая рекурсию) без паники и нарушения целостности исполнения любого алгоритма:
Извините
8=>
Тогда вам в брейнфак, там всё такоэ… длииииииинное.
Новый язык и без вычислений на основе квантовой неопределенности — муветон прямо таки.
Выбирали название всем Двачем
Хотелось бы еще добавить фичареквест про эвристическое вычисление:

/**
  * функция возвращает такой кортеж (a, b),
  * который удовлетворяет условию a + b = c и 
  * не приводит к фатальной ошибке исполнения
 **/
fn foo(c)
{
    c => a + b
    return (a, b)
} 

И так не будет ошибки — вы же пробелы использовали, а не табы.

UFO just landed and posted this here
В языке karasic табы и пробелы имеют разный смысл!

a + foo(b) => c // табы
a + foo(b) => c // пробелы

Но ведь пробелы и так и там! :)

Почему никто не называет язык программирования "Помидор"?


Это же круто. Открываешь вакансии, а там требуется сеньор помидор.
Открываешь стэковерфлоу, пишешь проблему, а в ответ прилетает кусок помидора.

А нет ли версии этого шедевра на английском? Очень хочется коллег порадовать.


Ну и спасибище, конечно!

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

Обещать не могу, но если выдастся часок, я сделаю тогда.

Если вдруг, обязательно дайте почитать!

Вы меня за кого принимаете? :)


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


https://gist.github.com/am-kantox/4cb513a300e66762e30563898b5bc781


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

Это прекрасно.
Я таки внесу пару мелких доработок и сразу же опубликую :).

Правильное присваивание мне особенно понравилось.
I need an accounting system

P.S. Жаль, что слово assingment в английком языке, как мне кажется, не несёт в себе того же подсмысла, что и в русском. Насколько я знаю, оно обычно в значении «воровать не употребляется». И двое из ларца оказываются не особенно в тему.

Да, «assignment» так не употребляется, и я даже покрутил туда-сюда «ad-hog», но не смог его вставить так, чтобы не оттянуть на надуманную игру слов смысл.


Ну отлично, рад что пришлось впору.

Выглядит будто кто-то решил исполнить мечту Пола Грэма про «достаточно умный компилятор».
Прямо жаль что шутка, мне аж интересно стало посмотреть на результат)
Мы вводим правое присваивание оператором БОЛЬШЕ ИЛИ РАВНО! Воу, никакой путаницы, интуитивно понятное… Кому? Мне моск сломала запись «42 больше или равно ответ» — это выражение имеет какие-то последствия? А потом очень туго вкурил, что это не сравнение, а типа присваивание. Вообще непонятно. Шутка какая-то мутная получилась в итоге. Не надо так. Надо шутить, а не загаживать моск.

Сравнение всегда обозначалось как >= — "больше или равно", а не символами =>. PHP, например, спокойно использует последние в определении массивов.

Вообще, в свете присутствия как правого, так и левого присваивания я бы предложил несколько assignment-операторов:
  • a => b значение переменной a присваивается переменной b
  • a >= b значение переменной a переносится в переменную b, а переменная a становится деинициализированной
  • a <= b значение переменной b присваивается переменной a
  • a =< b значение переменной b переносится в переменную a, а переменная b становится деинициализированной
  • a := b ссылка на переменную a присваивается переменной b
  • a =: b ссылка на переменную ba присваивается переменной a

Кроме того, разрешаются сбродные сводные операторы >=> <=< =>> <<= :=> :>= <=: =<: =>: >=:, выполняющие все эти действия разом.
Как же тогда сравнивать на «больше или равно» и «меньше или равно»?
Ну, либо через (a == b) & (a > b), либо через объединение операторов: a ==|> b или a ==+> b
Sign up to leave a comment.

Articles

Change theme settings