?

Log in

No account? Create an account

Previous Entry | Next Entry

Выдвигаю предложения по усовершенствованию синтаксиса языка JavaScript.

Для примера разберём такую простую конструкцию, как функция, генерирующая замыкания.

function foo(filter, pattern) {
    var f = function(list) { return filter(pattern, list); };
    return f;
};

Конечно, в JavaScript есть опциональные точки с запятыми. Их можно не ставить, если это не приведёт к синтаксическим проблемам. Поэтому предлагаю завершающие точки с запятыми из языка убрать, а в язык добавить правило, что если строка кончается и при этом на строке находится полностью завершённое выражение (то есть, все открывающие скобки уже закрыты), то считаем, что выражение действительно завершено. При этом точки с запятыми становятся не нужны:

function foo(filter, pattern) {
    var f = function(list) { return filter(pattern, list) }
    return f
}

Затем, предлагаю не писать function, это долго. И питоновская lambda — тоже не сахар. А ведь замыкания используются в JavaScript направо и налево! Для упрощения вместо function можно использовать какой-нибудь редко используемый символ. Например, бэкслеш — он используется в программах на JavaScript разве что только в строках и в регулярных выражениях, поэтому конфликтовать ни с чем не должен. В итоге имеем:

function foo(filter, pattern) {
    var f = \(list) { return filter(pattern, list) }
    return f
}

Затем предлагаю не писать return в конце функции. Пусть результат последнего выражения на последней строке функции автоматически возвращается из функции. Во многих языках это есть. Например, в Ruby (читается «руби», а не «раби», кстати). Пусть return используется только для раннего выхода из функции. Ведь это так удобно!

function foo(filter, pattern) {
    var f = \(list) { filter(pattern, list) }
    f
}

Ну и логично, что var f в этом примере больше не требуется:

function foo(filter, pattern) {
    \(list) { filter(pattern, list) }
}

Затем мы видим, что если функция использует один аргумент, то скобки смысла большого не имеют. Да и функции с несколькими аргументами могут обойтись без скобок. Чтобы не возникало обвинений, что в JavaScript скобок больше, чем в Лиспе, уберём их. Запятые тоже не нужны, кстати: всё, что идёт после названия функции, есть её аргументы:

function foo filter pattern {
    \list { filter pattern list }
}


Кстати, мы убрали function() при объявлении анонимного замыкания, но не убрали при объявлении глобальной функции foo. Исправим этот недостаток:

foo filter pattern {
    \list { filter pattern list }
}

Здесь нужно отметить, что вместо зашумляющих код скобок можно воспользоваться Питоньим подходом и внедрить двухмерный синтаксис. Всё, что имеет отступ от начала функции, является телом функции. Скобки поэтому можно не писать:


foo filter pattern
    \list { filter pattern list }

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

foo filter pattern =
    \list = filter pattern list

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

Tags:

Comments

( 125 comments — Leave a comment )
Page 1 of 2
<<[1] [2] >>
sap1ens
Mar. 11th, 2013 03:49 pm (UTC)
Собственно мы практически получаем CoffeeScript, которым можно и нужно пользоваться. Разве нет?
mpak666
Mar. 11th, 2013 03:49 pm (UTC)
Ну так ведь почти CoffeeScript получился


foo = (filter, pattern) ->
  (list) ->
    filter pattern, list
lionet
Mar. 11th, 2013 03:50 pm (UTC)
Стрелки и запятые лишние.
(no subject) - mpak666 - Mar. 11th, 2013 03:56 pm (UTC) - Expand
(no subject) - lionet - Mar. 11th, 2013 03:57 pm (UTC) - Expand
(no subject) - p1r4nh4 - Mar. 11th, 2013 04:00 pm (UTC) - Expand
(no subject) - mpak666 - Mar. 11th, 2013 04:05 pm (UTC) - Expand
(no subject) - p1r4nh4 - Mar. 11th, 2013 03:57 pm (UTC) - Expand
(no subject) - mpak666 - Mar. 11th, 2013 04:07 pm (UTC) - Expand
(no subject) - p1r4nh4 - Mar. 11th, 2013 04:14 pm (UTC) - Expand
(no subject) - mpak666 - Mar. 11th, 2013 04:21 pm (UTC) - Expand
(no subject) - p1r4nh4 - Mar. 11th, 2013 04:23 pm (UTC) - Expand
p1r4nh4
Mar. 11th, 2013 03:56 pm (UTC)
А как различить "foo filter pattern" и "filter pattern list"? По =? Это не слишком двусмысленно?
lionet
Mar. 11th, 2013 03:58 pm (UTC)
А зачем их различать? foo и filter — это функции. "filter pattern" и "pattern list" — это аргументы к функциям foo и filter, соответственно.
(no subject) - p1r4nh4 - Mar. 11th, 2013 03:59 pm (UTC) - Expand
(no subject) - lionet - Mar. 11th, 2013 04:00 pm (UTC) - Expand
(no subject) - p1r4nh4 - Mar. 11th, 2013 04:04 pm (UTC) - Expand
(no subject) - lionet - Mar. 11th, 2013 04:06 pm (UTC) - Expand
(no subject) - p1r4nh4 - Mar. 11th, 2013 04:07 pm (UTC) - Expand
(no subject) - lionet - Mar. 11th, 2013 04:23 pm (UTC) - Expand
(no subject) - p1r4nh4 - Mar. 11th, 2013 04:24 pm (UTC) - Expand
(no subject) - lionet - Mar. 11th, 2013 04:25 pm (UTC) - Expand
(no subject) - blackyblack - Mar. 11th, 2013 04:28 pm (UTC) - Expand
(no subject) - lionet - Mar. 11th, 2013 04:34 pm (UTC) - Expand
(no subject) - blackyblack - Mar. 11th, 2013 04:39 pm (UTC) - Expand
(no subject) - lionet - Mar. 11th, 2013 04:41 pm (UTC) - Expand
(no subject) - p1r4nh4 - Mar. 11th, 2013 04:42 pm (UTC) - Expand
(no subject) - lionet - Mar. 11th, 2013 04:43 pm (UTC) - Expand
(no subject) - blackyblack - Mar. 11th, 2013 04:44 pm (UTC) - Expand
(no subject) - p1r4nh4 - Mar. 11th, 2013 04:45 pm (UTC) - Expand
mipa
Mar. 11th, 2013 03:58 pm (UTC)
Дык а кто мешает? Надо написать препроцессор -- и вперед.

Вон их уже сколько: coffeescript, typescript...

Только те -- для программистов, а этот будет для матшкольников. Надо только еще подсократить, в примерах писать вот так:

foo f p =
\l = f p l

markizko
Mar. 11th, 2013 03:59 pm (UTC)
Отличный пример того, что иногда не надо отменять "лишние" синтаксические конструкты и знаки препинания.

Edited at 2013-03-11 04:00 pm (UTC)
migmit
Mar. 11th, 2013 07:21 pm (UTC)
+1
blackyblack
Mar. 11th, 2013 04:02 pm (UTC)
Отличная шутка. Но двухмерный синтаксис не есть улучшение. Верните обратно фигурные скобочки.
lionet
Mar. 11th, 2013 04:24 pm (UTC)
Пробовал. Опять Perl получился.
(no subject) - denlion - Mar. 11th, 2013 04:51 pm (UTC) - Expand
pkn63
Mar. 11th, 2013 04:18 pm (UTC)
Так есть вероятность попасть на трехмерый синтаксис, где расписать вот так все просто, в таких выражениях выйдет возможно сложнее.
Не могу пока придумать с ходу, что то конкретное.
Но в условиях создания мат моделей и сложных БП и ТП такое случается.
Хотя очень поддерживаю идею, избыточность языка, это происки программистов, что бы всех напугать сложностью :-) ШУТКА
Хоть Haskell не очень владею, но думаю что он тоже не панацея..
gianthare
Mar. 11th, 2013 04:49 pm (UTC)
Это как реформа английского прав описания у Марка Твена, где в конце получается немецкий
lionet
Mar. 11th, 2013 04:53 pm (UTC)
С него писал, да :)
ex_juan_gan
Mar. 11th, 2013 04:59 pm (UTC)
Приветствую всей душой.

Ну только от var можно избавиться сразу же.

Насчёт return есть проблемы - с конструкторами. Их, конечно, надо починить, но тогда сломается куча библиотек, я думаю.
nivanych
Mar. 11th, 2013 05:12 pm (UTC)
Главное, систему типов не трогайте!!
lionet
Mar. 11th, 2013 05:13 pm (UTC)
Ты хочешь сказать, «“типовую кашу” не теребите»? :)
(no subject) - nivanych - Mar. 11th, 2013 05:16 pm (UTC) - Expand
(Deleted comment)
(no subject) - lionet - Mar. 11th, 2013 08:02 pm (UTC) - Expand
(Deleted comment)
lionet
Mar. 11th, 2013 05:25 pm (UTC)
Хм. Проблемы с памятью в Хаскеле преувеличены. Там есть проблема с барьером входа в монады всякие — это есть реальная проблема. Работа с санками и избирательной строгостью решается и изучается одной из первых, и далее проблем не вызывает. Монады остаются.
(Deleted comment)
(no subject) - lionet - Mar. 11th, 2013 05:31 pm (UTC) - Expand
(Deleted comment)
(no subject) - lionet - Mar. 11th, 2013 05:39 pm (UTC) - Expand
(no subject) - ko_bx - Mar. 11th, 2013 07:49 pm (UTC) - Expand
vzaliva
Mar. 11th, 2013 05:22 pm (UTC)
LOL :) я где-то на третем шаге догадался что это закончится Хаскелем :)
gliv
Mar. 11th, 2013 06:05 pm (UTC)
Я глядя на название поста догадался :)
У Льва сейчас хаскель, похоже, в фаворитах :)
(no subject) - lionet - Mar. 11th, 2013 06:08 pm (UTC) - Expand
alexio_marziano
Mar. 11th, 2013 05:58 pm (UTC)
хорошая обфускация кода
lionet
Mar. 11th, 2013 06:01 pm (UTC)
Почему обфускация? Наоборот, убирается шелуха, остаётся суть.
(no subject) - alexio_marziano - Mar. 11th, 2013 09:02 pm (UTC) - Expand
(no subject) - lionet - Mar. 11th, 2013 09:04 pm (UTC) - Expand
(no subject) - zyxman - Mar. 12th, 2013 03:27 am (UTC) - Expand
(no subject) - rigidus - Mar. 19th, 2013 08:25 am (UTC) - Expand
(no subject) - zyxman - Mar. 21st, 2013 04:38 pm (UTC) - Expand
(no subject) - rigidus - Mar. 23rd, 2013 11:54 am (UTC) - Expand
(no subject) - zyxman - Mar. 23rd, 2013 12:10 pm (UTC) - Expand
(no subject) - rigidus - Mar. 23rd, 2013 07:38 pm (UTC) - Expand
(no subject) - zyxman - Mar. 23rd, 2013 10:18 pm (UTC) - Expand
(no subject) - lionet - Mar. 23rd, 2013 10:28 pm (UTC) - Expand
(no subject) - zyxman - Mar. 24th, 2013 05:21 am (UTC) - Expand
(no subject) - lionet - Mar. 24th, 2013 05:23 am (UTC) - Expand
(no subject) - zyxman - Mar. 24th, 2013 11:08 am (UTC) - Expand
(no subject) - rigidus - Mar. 25th, 2013 08:04 am (UTC) - Expand
(no subject) - zyxman - Mar. 25th, 2013 02:04 pm (UTC) - Expand
(no subject) - zyxman - Mar. 25th, 2013 05:37 pm (UTC) - Expand
(no subject) - rigidus - Mar. 27th, 2013 09:52 am (UTC) - Expand
(no subject) - zyxman - Mar. 27th, 2013 01:48 pm (UTC) - Expand
(no subject) - rigidus - Mar. 29th, 2013 08:26 am (UTC) - Expand
(no subject) - zyxman - Mar. 29th, 2013 05:01 pm (UTC) - Expand
(no subject) - alexio_marziano - Mar. 12th, 2013 05:22 am (UTC) - Expand
(no subject) - lionet - Mar. 12th, 2013 06:01 am (UTC) - Expand
kashnikov
Mar. 11th, 2013 06:50 pm (UTC)
И правда Haskell. Вроде был бэк для JavaScript? :)

Немножко ортогонально синтаксису, но близко по духу Lemonad. Что думаешь, если оставить в стороне синтаксис JS?
lionet
Mar. 11th, 2013 06:53 pm (UTC)
(no subject) - kashnikov - Mar. 11th, 2013 07:09 pm (UTC) - Expand
triampurum
Mar. 11th, 2013 06:55 pm (UTC)
lionet
Mar. 11th, 2013 06:57 pm (UTC)
Yep :)
Page 1 of 2
<<[1] [2] >>
( 125 comments — Leave a comment )

Profile

lionet
Lev Walkin
Website

Latest Month

December 2016
S M T W T F S
    123
45678910
11121314151617
18192021222324
25262728293031
Powered by LiveJournal.com
Designed by yoksel