В Erlang, когда я использую; или или .?

Я пытался изучить Erlang и столкнулся с некоторыми проблемами с завершением строк в функциях и операторах case.

Когда я могу использовать точку с запятой (;), запятую (,) или точку внутри моих функций или case операторов?


person samoz    schedule 10.07.2009    source источник


Ответы (5)


Запятая в конце строки обычного кода.
Точка с запятой в конце оператора case, оператора if и т. Д. Последний оператор case или if не имеет ничего в конце. Точка в конце функции.

пример (извините за имена случайных переменных, очевидно, что это ничего не делает, но иллюстрирует точку):

case Something of 
    ok ->
        R = 1,     %% comma, end of a line inside a case 
        T = 2;     %% semi colon, end of a case, but not the end of the last
    error ->
        P = 1,     %% comma, end of a line inside a case
        M = 2      %% nothing, end of the last case
end.               %% period, assuming this is the end of the function, comma if not the end of the function
person marcc    schedule 10.07.2009
comment
Вы также можете использовать точку с запятой в конце предложения функции, которое не завершает функцию (вы завершаете функцию, используя точку, как объяснил marcc). - person Adam Lindberg; 31.07.2009
comment
вы заканчиваете именованную функцию точкой. Анонимные функции завершаются ключевым словом end. Также вы используете точки после директив -include () и -compiler. Лучше рассматривать период как последний терминатор. Это КОНЕЦ, где запятая и точка с запятой являются разделителями. Как говорится в chthulahoops ниже. запятая работает как разделитель серии, а точка с запятой работает как разделитель для альтернатив. , = и &; = или это довольно приличный способ запомнить. - person Jeremy Wall; 10.08.2009

Мне нравится читать точку с запятой как ИЛИ, запятую как И, точку с запятой как КОНЕЦ. Так

foo(X) when X > 0; X < 7 ->
    Y = X * 2,
    case Y of
        12 -> bar;
        _  -> ook
    end;
foo(0) -> zero.

читается как

foo(X) when X > 0 *OR* X < 7 ->
    Y = X * 2 *AND*
    case Y of
        12 -> bar *OR*
        _  -> ok
    end *OR*
foo(0) -> zero *END*

Это должно прояснить, почему нет; после последнего пункта дела.

person cthulahoops    schedule 11.07.2009
comment
Я только начинаю работать с Erlang, и это было чрезвычайно полезно. Спасибо. - person Sid; 27.08.2012
comment
Хороший пример, но когда X > 0; X < 7 когда-нибудь окажется ложным? - person Jamie Forrest; 28.12.2012
comment
Очень полезный метод, очень естественный. - person liuyanghejerry; 02.07.2013
comment
Я тоже только начинаю erlang, но могу ли я предложить такой комментарий: нет; после последнего предложения case, потому что точка с запятой стоит не после предложений - это между. Точка с запятой и запятая указывают, как связаны предложения. Точка отмечает конец предложения (так что это действительно конец материала). Кажется, что эта логика исходит из Prolog происхождения Erlang, однако я не могу сказать, я читаю только Learnyousomeerlang. Ваше здоровье! - person xealits; 12.04.2015

Период (.)

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

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

Например, определения функций для hello/0 и hello/1:

hello() -> hello_world.

hello(Greeting) -> Greeting.

(Обратите внимание, что в оболочке erlang точка используется для завершения и оценки выражений, но это аномалия.)

Точка с запятой (;)

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

Пример 1, функциональные предложения:

factorial(0) -> 1;
factorial(N) -> N * fac(N-1).

Пример 2, ветви выражения:

if X < 0  -> negative;
   X > 0  -> positive;
   X == 0 -> zero
end

Запятая (,)

Запятая - это разделитель выражений. Если после выражения следует запятая, это означает, что в предложении после нее стоит другое выражение.

hello(Greeting, Name) -> 
    FullGreeting = Greeting ++ ", " ++ Name,
    FullGreeting.
person Jamie Forrest    schedule 28.12.2012
comment
да, одна вещь, которая укусила меня при изучении эрланга, - это установка; в конце последнего предложения, например, после вашего X == 0 -> zero в Примере 2. - person Tommy; 21.01.2016

Вы можете думать об этом как о английской пунктуации. Запятые используются для разделения элементов в серии, точки с запятой используются для разделения двух очень тесно связанных независимых предложений [1] (например, разные случаи оператора case, предложения функций с одинаковым именем и арностью, которые соответствуют разным шаблонам) и точки. используются для завершения предложения (полная мысль).

  1. Или чтобы доказать, что ты учился в колледже. «Не используйте точку с запятой. Это трансвеститы-гермафродиты, которые ничего не представляют. Все, что они делают, это показывают, что вы учились в колледже». - Курт Воннегут
person Ben Hughes    schedule 10.07.2009
comment
Люблю цитату Воннегута! Я обязательно сделаю акцент на использовании точек с запятой; их действительно стоит использовать больше. - person samoz; 10.07.2009
comment
+1. Пунктуация Erlang явно была вдохновлена ​​прозаической пунктуацией, в ущерб Erlang . - person Warren Young; 02.01.2013

Запятая разделяет выражения, аргументы или элементы списка / кортежа или двоичного файла. Он перегружен.

person rvirding    schedule 23.07.2009
comment
Я предполагаю, что вы бы одобрили LFE в качестве исправления для этого, за исключением того, что его не трогали год. Рейя - это несуществующий. Эфене не трогали уже 7 месяцев, а 1.0 последний звонок сверчков ответил 15 месяцев назад. Из языков компиляции в BEAM только Elixir, похоже, все еще находится в разработке. - person Warren Young; 02.01.2013
comment
@WarrenYoung Видя, что я был одним из авторов синтаксиса Erlang, у меня нет никаких проблем с этим. :-) LFE не умер, он только что достиг той стадии, когда ему нужны серьезные пользователи, чтобы внести свой вклад в улучшение и развитие. Альтернативный синтаксис Lisp для Erlang - Joxa. Лично я не вижу прелести в рубиновом синтаксисе. - person rvirding; 03.01.2013
comment
Да, я знаю, кто ты. (Привет, Роберт!) Я просто подумал, что если бы у вас была возможность проделать это снова и снова, на этот раз вы, возможно, не основываете синтаксис вашего нового языка на Прологе. Что касается LFE, Lisp имеет ~ 1% mindshare и Erlang ~ 1/3%, поэтому максимальный потенциал LFE составляет ~ 0,0033%. Его вероятный потенциал еще больше сокращается из-за того, что часть пользователей системы Erlang желает для начала использовать вторичный интерфейс. Не любите Ruby, если хотите, но он и подобные ему языки сейчас более популярны. - person Warren Young; 03.01.2013
comment
@WarrenYoung Я, наверное, не знаю. Или выберите синтаксис, более похожий на другие функциональные языки. Я бы не стал основывать его на базе, подобной C / Java, поскольку считаю, что семантическое соответствие слишком плохое. И я много программировал на C, поэтому я очень привык к этому синтаксису, и у меня нет проблем с ним. Я не считаю изучение нового синтаксиса проблемой, это наименее проблемная часть изучения нового языка. Это просто RTFM. - person rvirding; 04.01.2013
comment
В этом мы можем согласиться: C ++ FE - это проект, которого никогда не должно быть. :) - person Warren Young; 04.01.2013
comment
С этим мы определенно можем согласиться. Мне нравится синтаксис Лиспа, он простой и чрезвычайно гибкий, отсюда и LFE. И я серьезно не вижу альтернативных синтаксисов Erlang, даже LFE, которые были бы действительно жизнеспособными альтернативами стандартному синтаксису; в основном из-за отсутствия поддержки в стандартном дистрибутиве. - person rvirding; 04.01.2013