Julia: Запрос функции: добавить оператор, чтобы разрешить разрыв строк в определении матрицы

Созданный на 11 июн. 2018  ·  52Комментарии  ·  Источник: JuliaLang/julia

Привет, народ,

Я начал обсуждение в Discourse [1] о том, как мы можем определить матрицу с разрывными линиями без создания новой строки. Например:

A = [1 2 3 4 5
     6 7 8 9 10]

переводится как матрица 2x5, потому что символ разрыва строки интерпретируется как конец первой строки (что хорошо). Однако у меня была реализована модель MSIS [2], которая требует определения матриц со 150 столбцами. В этом случае, если я решу жестко запрограммировать эти матрицы в исходном коде для обеспечения совместимости, мне придется ввести 150 чисел с плавающей запятой в одной строке, что не очень хорошо.

В Matlab для этого есть оператор ... :

A = [1 2 3 4 5 ...
     6 7 8 9 10]

что переводится в матрицу 1x10.

Наконец, мне интересно, можем ли мы иметь что-то подобное в Джулии. В настоящее время единственный обходной путь, предложенный в [1], - это обмануть анализатор следующим образом:

A = [1 2 3 4 [5
     ] 6 7 8 9 10]

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


[1] https://discourse.julialang.org/t/declare-a-matrix-with-break-lines/11568/18
[2] https://ccmc.gsfc.nasa.gov/pub/modelweb/atmospheric/msis/nrlmsise00/nrlmsise00_sub.for

design parser

Самый полезный комментарий

A = [1 2 3 4 5  #=
  =# 6 7 8 9 10]

также работает и не требует выделения дополнительного временного массива [5] . Многострочные комментарии (# 69) FTW!

Все 52 Комментарий

A = [1 2 3 4 5  #=
  =# 6 7 8 9 10]

также работает и не требует выделения дополнительного временного массива [5] . Многострочные комментарии (# 69) FTW!

(Хотя, честно говоря, я не вижу проблемы с наличием 150 чисел с плавающей запятой в одной строке. Разве в наши дни редакторы не имеют горизонтальных полос прокрутки? Если у вас есть матрица 150 × 150 в вашем коде, это просто стена из 22500 чисел в любом случае, и прокрутка кажется таким же хорошим способом взглянуть на это в вашем коде. Вы также можете включить мягкую упаковку в своем редакторе, если вам нравятся короткие строки.)

Я не знаю, используются ли где-то две точки .. , но я думаю, что это очень подходит для продолжения строки, или \dots ( ), -- и т. Д. Здесь можно найти сравнение разных языков .

Привет @stevengj!

Я до сих пор использую для переноса моего кода в столбец 80. ИМХО, код становится намного более читаемым и с ним легче работать, потому что вы можете разделить свой редактор на две части и по-прежнему видеть весь код без прокрутки.

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

Разве ваш редактор не может выполнить мягкую упаковку в столбце 80, если вы предпочитаете это?

(Для большей части языка Julia вы можете вставлять разрывы строк без взлома, например, после любого парного знака, запятой или двоичного оператора. Литеральные матрицы - редкое исключение.)

Две точки (..) и многоточие (…) уже анализируются как бинарные операторы, и в целом операторы гораздо более полезны, чем синтаксис продолжения, который возникает редко (и уже возможен с # = = #).

Привет @stevengj

Я использую vim (на самом деле neovim), я могу делать мягкую упаковку, но обычно это ломает такие вещи, как несколько строчных курсоров и макросы. Вот почему я всегда предпочитаю фактически разрывать линии.

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

Я думаю, что нам действительно нужно нечто более общее: способ продолжить любую строку, не относящуюся к синтаксису матрицы. Лучшее, что я смог придумать, - это \ в качестве последнего непробельного символа в строке, что было бы критическим изменением, поскольку в настоящее время это действительный, но странный синтаксис:

x = y \
    z

Мы могли бы даже продолжать поддерживать такое использование \ в контекстах, не чувствительных к пробелам, поскольку y z является недопустимым синтаксисом, но, вероятно, это слишком умно. Я не уверен, что это того стоит, но в большинстве языков есть способ продолжить строки. Трюк с многострочным комментарием тоже работает, но он немного подробен.

Очень ломается ...

julia> 2\
       10
5.0

julia> 2#=
       =#10
20

Это определенно ломается, но я был бы удивлен, если \ будет так часто использоваться.

Может быть, #\ ? Конечно, связывание нового поведения с ранее проигнорированным комментарием также является нарушением, но использование #\ в качестве комментария, вероятно, даже реже, чем разрыв строки после \ (используется как оператор).

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

Привет @stevengj!

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

            xndot = d2201 * sin(2ω + xli  - G22) +
                    d2211 * sin(   + xli  - G22) +
                    d3210 * sin(+ω + xli  - G32) -
                    d3222 * sin(-ω + xli  - G32) -
                    d5220 * sin(+ω + xli  - G52) +
                    d5232 * sin(-ω + xli  - G52) +
                    d4410 * sin(2ω + 2xli - G44) -
                    d4422 * sin(     2xli - G44) +
                    d5421 * sin(+ω + 2xli - G54) +
                    d5433 * sin(-ω + 2xli - G54)

ИМХО, знак операции в конце не так хорош, как в начале:

            xndot = + d2201 * sin(2ω + xli  - G22) \
                    + d2211 * sin(   + xli  - G22) \
                    + d3210 * sin(+ω + xli  - G32) \
                    - d3222 * sin(-ω + xli  - G32) \
                    - d5220 * sin(+ω + xli  - G52) \
                    + d5232 * sin(-ω + xli  - G52) \
                    + d4410 * sin(2ω + 2xli - G44) \
                    - d4422 * sin(     2xli - G44) \
                    + d5421 * sin(+ω + 2xli - G54) \
                    + d5433 * sin(-ω + 2xli - G54)

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

Кажется, в этом случае проще просто поставить дополнительную пару заключающих скобок.

Да, это может быть сделано. Но, опять же ИМХО, это не обычное дело. Допустим, кто-то видит это:

            xndot = (+ d2201 * sin(2ω + xli  - G22)
                     + d2211 * sin(   + xli  - G22)
                     + d3210 * sin(+ω + xli  - G32)
                     - d3222 * sin(-ω + xli  - G32)
                     - d5220 * sin(+ω + xli  - G52)
                     + d5232 * sin(-ω + xli  - G52)
                     + d4410 * sin(2ω + 2xli - G44)
                     - d4422 * sin(     2xli - G44)
                     + d5421 * sin(+ω + 2xli - G54) 
                     + d5433 * sin(-ω + 2xli - G54))

С математической точки зрения эти скобки не имеют значения. Кто-то может случайно удалить их, Юля не будет показывать никаких предупреждений, и код будет совершенно неправильным.

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

Как насчет использования # для той же цели? Интерпретация состоит в том, что вы комментируете разрыв строки. (спасибо @oxinabox за эту интерпретацию использования LaTeX % качестве продолжения комментария / строки)

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

Единственная потенциальная проблема, которую я здесь вижу, заключается в том, что от

a=1 #because reasons
 +2

к

a=1 #
 +2

дает разные результаты. Хотя это, вероятно, не имеет значения.

А что насчет того, что Джулия не использует, например \\ ? Это слишком некрасиво?

Я ожидал, что использование стиля латекса «Комментируя новый лайк» сломает вещи.

Если только он не был ограничен только # без каких-либо непробелов после.
Например:

colors = [ 0.5 0.2 0.1 0.9 # Red
                0.4 0.4 0.1 0.6 # Green
                0.1 0.2 0.1 0.1] # Blue

В LaTeX нет никаких новых строк.
И то, что пустой комментарий действует иначе, чем непустой, звучит странно.

На самом деле я не предлагал это Джулии.
Я думаю, что \\ будет гораздо менее запутанным.
Но я думаю, что решение

Хотя создание гигантских многострочных литералов кажется довольно нишевой.
Даже больше, чем наличие литералов для Array{T, 3} .

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

Я думаю, что предложение заключалось в том, чтобы за # следовало только символ новой строки (или, возможно, только пробелы).

Да, я имел в виду выполнение предложения @StefanKarpinski о специальной обработке # в конце строки, определенно не считая случая, когда после # есть другие непробельные вещи. Возможно, сравнение LaTeX больше сбивало с толку, чем проясняло то, что я пытался сказать.

Кооптация # кажется мне рискованной. Иногда в моем коде разбросаны # s по причинам, которые я не совсем помню, комментарии, о которых я вроде как передумал, и т. Д. Было бы очень легко случайно удалить завершающий # s при уборке.

Иногда я пропускаю оператор продолжения строки, но предпочел бы, чтобы он был очень очевидным, например \ или ... . #= или [] кажутся слишком похожими на трюк.

(Если не рекомендуется использовать, может быть, что-нибудь немного уродливое, например \\\ , подойдет?)

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

Не уверен, что они уже используются где-то еще или должны быть зарезервированы для пользовательских операторов, но одна из этих стрелок Unicode может сделать привлекательные, интуитивно понятные варианты для явного продолжения строки:

, или

(становится доступным, например, с помощью значимого псевдонима, заполненного табуляцией, например \continueline )

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

Я не согласен с тем, что ставить обратную косую черту в конце каждой строки лучше, чем добавлять круглые скобки или просто помещать операторы в конец строки. Я также не думаю, что злоупотребление обратной косой чертой или # будет улучшением; это только добавило бы сюрпризов. Если бы мы использовали что-то многосимвольное, это не было бы большим улучшением по сравнению с #= =# .

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

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

Теперь, когда я увидел, что вы можете использовать #= =# для продолжения строки, это имеет смысл. Однако, если честно, я бы точно не пришел к такому выводу в одиночку.

Возможно, лучший способ продвинуться вперед - добавить что-нибудь в документацию и руководство по стилю Julia, в котором говорится, что продолжение строки может быть достигнуто с помощью #= =# .

В завершение обсуждения, @JeffBezanson и @StefanKarpinski , считаете ли вы, что даже предложение, предложенное @thchr , которое ничего не сломает, не годится для реализации? Думаю, будет приятно что-то вроде:

A = [1 2 3 4 5 ⤸
     6 7 8 9 10]

Менее подробный, чем #= =# и визуально приятный.

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

Однако мы уже разбираем многие стрелки Unicode как бинарные операторы.

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

Хорошие варианты ИМХО:

⤸ (2938) ↩ (8617) ↵ (8629) 

Возможно, пора сделать пробел оператором, и мы можем перегрузить его в контекстах с большой матрицей с помощью Cassette. К счастью, Бьярн Страуструп уже проделал для нас тяжелую дизайнерскую работу - http://www.stroustrup.com/whitespace98.pdf

Если бы мы использовали что-то многосимвольное, это не было бы большим улучшением по сравнению с #= =# .

Я хотел бы выдвинуть против этого три аргумента.

Во-первых, это можно принять за комментарий. Даже если я это знаю, мой мозг регистрирует «Комментарий».

Во-вторых, вы должны поместить его на две строки, а не только на одну. (Как это будет взаимодействовать с отступом?)

В-третьих, это более сложная комбинация нажатий клавиш (на моем компьютере это shift-3 shift-0 enter shift-0 shift-3 ). Я предполагаю, что можно использовать какое-то сочетание клавиш. Напротив, \\ - это два быстрых нажатия одной и той же клавиши (за которыми следует enter .)

Три с половиной: ИМХО это выглядит немного неуклюже и похоже на трюк.

Даже если \\ не принимается, потому что он, возможно, «зарезервирован» для использования в будущем, я действительно думаю, что предложение очень хорошо. Посмотрите, как это будет:

            xndot = + d2201 * sin(2ω + xli  - G22) ⤸
                    + d2211 * sin(   + xli  - G22) ⤸
                    + d3210 * sin(+ω + xli  - G32) ⤸
                    - d3222 * sin(-ω + xli  - G32) ⤸
                    - d5220 * sin(+ω + xli  - G52) ⤸
                    + d5232 * sin(-ω + xli  - G52) ⤸
                    + d4410 * sin(2ω + 2xli - G44) ⤸
                    - d4422 * sin(     2xli - G44) ⤸
                    + d5421 * sin(+ω + 2xli - G54) ⤸
                    + d5433 * sin(-ω + 2xli - G54)

И, кроме того, этим никого не заставят и он ничего не сломает. Но я уверен, что для этого найдутся хорошие варианты использования (большие матрицы, которые заставили меня открыть эту проблему, - это одна из них):

pd = [
     1.09979E+00 -4.88060E-02 -1.97501E-01 -9.10280E-02 -6.96558E-03 ⤸ 
     2.42136E-02  3.91333E-01 -7.20068E-03 -3.22718E-02  1.41508E+00 ⤸
     1.68194E-01  1.85282E-02  1.09384E-01 -7.24282E+00  0.00000E+00 ⤸
     2.96377E-01 -4.97210E-02  1.04114E+02 -8.61108E-02 -7.29177E-04 ⤸
     1.48998E-06  1.08629E-03  0.00000E+00  0.00000E+00  8.31090E-02 ⤸
     1.12818E-01 -5.75005E-02 -1.29919E-02 -1.78849E-02 -2.86343E-06 ⤸
     0.00000E+00 -1.51187E+02 -6.65902E-03  0.00000E+00 -2.02069E-03 ⤸
     0.00000E+00  0.00000E+00  4.32264E-02 -2.80444E+01 -3.26789E-03 ⤸
     2.47461E-03  0.00000E+00  0.00000E+00  9.82100E-02  1.22714E-01 ⤸
    -3.96450E-02  0.00000E+00 -2.76489E-03  0.00000E+00  1.87723E-03 ⤸
    -8.09813E-03  4.34428E-05 -7.70932E-03  0.00000E+00 -2.28894E-03 ⤸
    -5.69070E-03 -5.22193E-03  6.00692E-03 -7.80434E+03 -3.48336E-03 ⤸
    -6.38362E-03 -1.82190E-03  0.00000E+00 -7.58976E+01 -2.17875E-02 ⤸
    -1.72524E-02 -9.06287E-03  0.00000E+00  2.44725E-02  8.66040E-02 ⤸
     1.05712E-01  3.02543E+04  0.00000E+00  0.00000E+00  0.00000E+00 ⤸
    -6.01364E+03 -5.64668E-03 -2.54157E-03  0.00000E+00  3.15611E+02 ⤸
    -5.69158E-03  0.00000E+00  0.00000E+00 -4.47216E-03 -4.49523E-03 ⤸
     4.64428E-03  0.00000E+00  0.00000E+00  0.00000E+00  0.00000E+00 ⤸
     4.51236E-02  2.46520E-02  6.17794E-03  0.00000E+00  0.00000E+00 ⤸
    -3.62944E-01 -4.80022E-02 -7.57230E+01 -1.99656E-03  0.00000E+00 ⤸
    -5.18780E-03 -1.73990E-02 -9.03485E-03  7.48465E-03  1.53267E-02 ⤸
     1.06296E-02  1.18655E-02  2.55569E-03  1.69020E-03  3.51936E-02 ⤸
    -1.81242E-02  0.00000E+00 -1.00529E-01 -5.10574E-03  0.00000E+00 ⤸
     2.10228E-03  0.00000E+00  0.00000E+00 -1.73255E+02  5.07833E-01 ⤸
    -2.41408E-01  8.75414E-03  2.77527E-03 -8.90353E-05 -5.25148E+00 ⤸
    -5.83899E-03 -2.09122E-02 -9.63530E-03  9.77164E-03  4.07051E-03 ⤸
     2.53555E-04 -5.52875E+00 -3.55993E-01 -2.49231E-03  0.00000E+00 ⤸
     0.00000E+00  2.86026E+01  0.00000E+00  3.42722E-04  0.00000E+00 ⤸
     0.00000E+00  0.00000E+00  0.00000E+00  0.00000E+00  0.00000E+00 ⤸
     0.00000E+00  0.00000E+00  0.00000E+00  0.00000E+00  0.00000E+00;
     1.02315E+00 -1.59710E-01 -1.06630E-01 -1.77074E-02 -4.42726E-03 ⤸
     3.44803E-02  4.45613E-02 -3.33751E-02 -5.73598E-02  3.50360E-01 ⤸
     6.33053E-02  2.16221E-02  5.42577E-02 -5.74193E+00  0.00000E+00 ⤸
     1.90891E-01 -1.39194E-02  1.01102E+02  8.16363E-02  1.33717E-04 ⤸
     6.54403E-06  3.10295E-03  0.00000E+00  0.00000E+00  5.38205E-02 ⤸
     ...

вместо того

pd = [
     1.09979E+00 -4.88060E-02 -1.97501E-01 -9.10280E-02 -6.96558E-03 #= 
 =#  2.42136E-02  3.91333E-01 -7.20068E-03 -3.22718E-02  1.41508E+00 #=
 =#  1.68194E-01  1.85282E-02  1.09384E-01 -7.24282E+00  0.00000E+00 #=
 =#  2.96377E-01 -4.97210E-02  1.04114E+02 -8.61108E-02 -7.29177E-04 #=
 =#  1.48998E-06  1.08629E-03  0.00000E+00  0.00000E+00  8.31090E-02 #=
 =#  1.12818E-01 -5.75005E-02 -1.29919E-02 -1.78849E-02 -2.86343E-06 #=
 =#  0.00000E+00 -1.51187E+02 -6.65902E-03  0.00000E+00 -2.02069E-03 #=
 =#  0.00000E+00  0.00000E+00  4.32264E-02 -2.80444E+01 -3.26789E-03 #=
 =#  2.47461E-03  0.00000E+00  0.00000E+00  9.82100E-02  1.22714E-01 #=
 =# -3.96450E-02  0.00000E+00 -2.76489E-03  0.00000E+00  1.87723E-03 #=
 =# -8.09813E-03  4.34428E-05 -7.70932E-03  0.00000E+00 -2.28894E-03 #=
 =# -5.69070E-03 -5.22193E-03  6.00692E-03 -7.80434E+03 -3.48336E-03 #=
 =# -6.38362E-03 -1.82190E-03  0.00000E+00 -7.58976E+01 -2.17875E-02 #=
 =# -1.72524E-02 -9.06287E-03  0.00000E+00  2.44725E-02  8.66040E-02 #=
 =#  1.05712E-01  3.02543E+04  0.00000E+00  0.00000E+00  0.00000E+00 #=
 =# -6.01364E+03 -5.64668E-03 -2.54157E-03  0.00000E+00  3.15611E+02 #=
 =# -5.69158E-03  0.00000E+00  0.00000E+00 -4.47216E-03 -4.49523E-03 #=
 =#  4.64428E-03  0.00000E+00  0.00000E+00  0.00000E+00  0.00000E+00 #=
 =#  4.51236E-02  2.46520E-02  6.17794E-03  0.00000E+00  0.00000E+00 #=
 =# -3.62944E-01 -4.80022E-02 -7.57230E+01 -1.99656E-03  0.00000E+00 #=
 =# -5.18780E-03 -1.73990E-02 -9.03485E-03  7.48465E-03  1.53267E-02 #=
 =#  1.06296E-02  1.18655E-02  2.55569E-03  1.69020E-03  3.51936E-02 #=
 =# -1.81242E-02  0.00000E+00 -1.00529E-01 -5.10574E-03  0.00000E+00 #=
 =#  2.10228E-03  0.00000E+00  0.00000E+00 -1.73255E+02  5.07833E-01 #=
 =# -2.41408E-01  8.75414E-03  2.77527E-03 -8.90353E-05 -5.25148E+00 #=
 =# -5.83899E-03 -2.09122E-02 -9.63530E-03  9.77164E-03  4.07051E-03 #=
 =#  2.53555E-04 -5.52875E+00 -3.55993E-01 -2.49231E-03  0.00000E+00 #=
 =#  0.00000E+00  2.86026E+01  0.00000E+00  3.42722E-04  0.00000E+00 #=
 =#  0.00000E+00  0.00000E+00  0.00000E+00  0.00000E+00  0.00000E+00 #=
 =#  0.00000E+00  0.00000E+00  0.00000E+00  0.00000E+00  0.00000E+00;
     1.02315E+00 -1.59710E-01 -1.06630E-01 -1.77074E-02 -4.42726E-03 #=
 =#  3.44803E-02  4.45613E-02 -3.33751E-02 -5.73598E-02  3.50360E-01 #=
 =#  6.33053E-02  2.16221E-02  5.42577E-02 -5.74193E+00  0.00000E+00 #=
 =#  1.90891E-01 -1.39194E-02  1.01102E+02  8.16363E-02  1.33717E-04 #=
 =#  6.54403E-06  3.10295E-03  0.00000E+00  0.00000E+00  5.38205E-02 #=
     ...

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

pd = [ 1.09979E+00 -4.88060E-02 -1.97501E-01 -9.10280E-02 -6.96558E-03 2.42136E-02  3.91333E-01 -7.20068E-03 -3.22718E-02  1.41508E+00 1.68194E-01  1.85282E-02  1.09384E-01 -7.24282E+00  0.00000E+00 2.96377E-01 -4.97210E-02  1.04114E+02 -8.61108E-02 -7.29177E-04 1.48998E-06  1.08629E-03  0.00000E+00  0.00000E+00  8.31090E-02 1.12818E-01 -5.75005E-02 -1.29919E-02 -1.78849E-02 -2.86343E-06 0.00000E+00 -1.51187E+02 -6.65902E-03  0.00000E+00 -2.02069E-03 0.00000E+00  0.00000E+00  4.32264E-02 -2.80444E+01 -3.26789E-03 2.47461E-03  0.00000E+00  0.00000E+00  9.82100E-02  1.22714E-01 -3.96450E-02  0.00000E+00 -2.76489E-03  0.00000E+00  1.87723E-03 -8.09813E-03  4.34428E-05 -7.70932E-03  0.00000E+00 -2.28894E-03 -5.69070E-03 -5.22193E-03  6.00692E-03 -7.80434E+03 -3.48336E-03 -6.38362E-03 -1.82190E-03  0.00000E+00 -7.58976E+01 -2.17875E-02 -1.72524E-02 -9.06287E-03  0.00000E+00  2.44725E-02  8.66040E-02 1.05712E-01  3.02543E+04  0.00000E+00  0.00000E+00  0.00000E+00 -6.01364E+03 -5.64668E-03 -2.54157E-03  0.00000E+00  3.15611E+02 -5.69158E-03  0.00000E+00  0.00000E+00 -4.47216E-03 -4.49523E-03 4.64428E-03  0.00000E+00  0.00000E+00  0.00000E+00  0.00000E+00 4.51236E-02  2.46520E-02  6.17794E-03  0.00000E+00  0.00000E+00 -3.62944E-01 -4.80022E-02 -7.57230E+01 -1.99656E-03  0.00000E+00 -5.18780E-03 -1.73990E-02 -9.03485E-03  7.48465E-03  1.53267E-02 1.06296E-02  1.18655E-02  2.55569E-03  1.69020E-03  3.51936E-02 -1.81242E-02  0.00000E+00 -1.00529E-01 -5.10574E-03  0.00000E+00 2.10228E-03  0.00000E+00  0.00000E+00 -1.73255E+02  5.07833E-01 -2.41408E-01  8.75414E-03  2.77527E-03 -8.90353E-05 -5.25148E+00 -5.83899E-03 -2.09122E-02 -9.63530E-03  9.77164E-03  4.07051E-03 2.53555E-04 -5.52875E+00 -3.55993E-01 -2.49231E-03  0.00000E+00 0.00000E+00  2.86026E+01  0.00000E+00  3.42722E-04  0.00000E+00 0.00000E+00  0.00000E+00  0.00000E+00  0.00000E+00  0.00000E+00 0.00000E+00  0.00000E+00  0.00000E+00  0.00000E+00  0.00000E+00
       1.02315E+00 -1.59710E-01 -1.06630E-01 -1.77074E-02 -4.42726E-03 3.44803E-02  4.45613E-02 -3.33751E-02 -5.73598E-02  3.50360E-01 6.33053E-02  2.16221E-02  5.42577E-02 -5.74193E+00  0.00000E+00 1.90891E-01 -1.39194E-02  1.01102E+02  8.16363E-02  1.33717E-04 6.54403E-06  3.10295E-03  0.00000E+00  0.00000E+00  5.38205E-02 ...
       ...

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

Это предполагает, что мы оставляем все как есть, за исключением одного: в контекстах, где важны пробелы (макросы, но также и построение матриц), в настоящее время нет очевидных способов продолжить строки. Взлом многострочного комментария - это умно, но также и уродливо, ИМО.

Мы можем решить обе эти проблемы сразу, добавив продолжение строки, которое допустимо только в контекстах парсинга space-sensitive :

# Valid - space sensitive context
<strong i="10">@info</strong> "A message which could be rather long"  ⤸
      my_variable my_variable2                ⤸
      some_other_variable

# Invalid - there should only be one way to do this
x = some_variable ⤸
    + other_variable
# Valid - the current, perfectly good convention for writing this
x = some_variable +
    other_variable

Я реализовал Unicode ⤸ для продолжения строки в ветви cjf/line-continuation . Это более простая версия, не ограниченная контекстами, чувствительными к пространству, но это должно быть легко с небольшой перестановкой.

Было бы действительно хорошо иметь явное комбинированное разделение столбцов, оператор | ,

       [ x .+ 1 | 3*(x .+ 2) |
        12 + x | -x ]

Почему требуется более одного символа продолжения строки?

Ради конкретного предложения я сделал для этого пиар - см. №29273.

@ c42f , IMHO, я думаю, что будет несколько запутать разрешить символ продолжения строки только в определенных случаях. Почему мы не можем позволить этому быть глобальным?

Стефан: Только для удобства чтения. Это только предполагает, что символы продолжения строки внутри строки должны выделяться и принудительно разделять поля в контексте, разделенном пробелами.

@ronisbr факт, что есть только один очевидный способ продолжить строки в большинстве выражений, таких как

x = a +
    b +
    c

мне очень нравится, и я не хотел это менять.

Позволяя также записать это как

x =   a  ⤸
    + b  ⤸
    + c

просто вводит ненужные изменения ИМО.

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

Привет, народ!

Теперь, когда у нас есть версия 1.1, можем ли мы обсудить эту функцию для версии 1.2? По крайней мере, можем ли мы решить, станет ли это в конечном итоге новой функцией или эту проблему следует закрыть?

cc @JeffBezanson , он же синтаксис czar.

Обнаружив, что многострочные комментарии, предложенные @stevengj, идеально каких-либо изменений языка. Если да, я буду рад сделать PR в соответствующих местах (один для матриц, один в качестве общего совета).

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

Я согласен с тем, что случай обертывания многострочной матрицы достаточно необычен, чтобы его можно было охватить с помощью #= =# и стоит задокументировать этот вариант для продолжения строки. Для многострочных вызовов макросов я использую этот синтаксис, но я все равно считаю его уродливым и громоздким.

Для многострочных макросов вы можете использовать круглые скобки.

Я хорошо осведомлен о возможности использовать парные символы для макросов, но нахожу это неудовлетворительным, как я уже описывал ранее. А именно, использование круглых скобок и запятых делает вызов макроса очень визуально отличным от того, как макросы «обычно выглядят» в большинстве программ juila. Код, который выглядит иначе, труднее читать.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

yurivish picture yurivish  ·  3Комментарии

StefanKarpinski picture StefanKarpinski  ·  3Комментарии

TotalVerb picture TotalVerb  ·  3Комментарии

wilburtownsend picture wilburtownsend  ·  3Комментарии

dpsanders picture dpsanders  ·  3Комментарии