Julia: Permintaan fitur: tambahkan operator untuk mengizinkan garis putus dalam definisi matriks

Dibuat pada 11 Jun 2018  ·  52Komentar  ·  Sumber: JuliaLang/julia

Halo kawan-kawan,

Saya telah memulai diskusi di Discourse [1] tentang bagaimana kita dapat mendefinisikan matriks dengan garis putus-putus tanpa membuat baris baru. Sebagai contoh:

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

diterjemahkan sebagai matriks 2x5, karena karakter garis putus ditafsirkan sebagai akhir dari baris pertama (yang baik). Namun, saya menerapkan model MSIS [2] yang membutuhkan definisi matriks dengan 150 kolom. Dalam hal ini, jika saya memilih untuk mengkodekan matriks-matriks tersebut dalam kode sumber untuk menjaga kompatibilitas, saya harus mengetikkan 150 float dalam satu baris, yang tidak baik.

Matlab memiliki operator ... untuk ini:

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

yang diterjemahkan ke dalam matriks 1x10.

Akhirnya, saya bertanya-tanya apakah kita dapat memiliki sesuatu seperti ini di Julia. Saat ini, satu-satunya solusi seperti yang diusulkan dalam [1] adalah mengelabui parser sebagai berikut:

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

yang bekerja tetapi tidak "optimal".


[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

Komentar yang paling membantu

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

juga berfungsi, dan tidak melibatkan pengalokasian array [5] sementara tambahan. Komentar multibaris (#69) FTW!

Semua 52 komentar

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

juga berfungsi, dan tidak melibatkan pengalokasian array [5] sementara tambahan. Komentar multibaris (#69) FTW!

(Meskipun sejujurnya saya tidak melihat masalah dengan memiliki 150 float pada satu baris. Tidakkah editor memiliki bilah gulir horizontal akhir-akhir ini? Jika Anda memiliki matriks 150 × 150 dalam kode Anda, itu hanya akan menjadi dinding 22500 angka lagi pula, dan menggulir sepertinya cara yang bagus untuk melihatnya dalam kode Anda. Anda juga dapat mengaktifkan pembungkus lunak di editor Anda jika Anda menyukai garis pendek.)

Saya tidak tahu apakah dua titik .. digunakan di beberapa tempat, tetapi saya pikir ini sangat cocok untuk kelanjutan baris, atau \dots ( ), -- , dll. Perbandingan berbagai bahasa ada di sini .

Hai @stevengj ,

Saya masih terbiasa membungkus kode saya di kolom 80. IMHO, kode menjadi lebih mudah dibaca dan lebih mudah digunakan karena Anda dapat membagi editor Anda menjadi dua bagian dan masih melihat semua kode tanpa menggulir.

Selain itu, semua bahasa yang saya ingat memiliki beberapa mekanisme untuk kelanjutan baris. Ini benar-benar meningkatkan keterbacaan kode dalam beberapa kesempatan. Saya pikir Julia seharusnya juga. Tentu saja Anda dapat melakukan semuanya seperti sekarang ini, tetapi dengan fitur seperti itu, saya pikir kita akan dapat menulis sedikit lebih jelas.

Tidak bisakah editor Anda melakukan pembungkusan lunak di kolom 80 jika itu yang Anda inginkan?

(Untuk sebagian besar bahasa Julia, Anda dapat menyisipkan jeda baris tanpa peretasan, misalnya setelah operator paren, koma, atau biner. Matriks literal adalah pengecualian yang jarang terjadi.)

Dua titik (..) dan elips (...) sudah diuraikan sebagai operator biner, dan secara umum operator jauh lebih berguna daripada sintaks lanjutan yang jarang muncul (dan sudah dimungkinkan dengan #= =#).

Hai @stevenj

Saya menggunakan vim (sebenarnya neovim), saya bisa melakukan pembungkusan lunak tetapi biasanya merusak hal-hal seperti beberapa kursor dan makro baris. Itu sebabnya saya selalu lebih suka benar-benar melanggar garis.

Namun, jangan ragu untuk menutup masalah ini jika menurut Anda fitur tersebut tidak cocok dengan desain bahasa Julia.

Saya pikir apa yang sebenarnya kita inginkan adalah sesuatu yang lebih umum: cara untuk melanjutkan baris apa pun, tidak khusus untuk sintaks matriks. Hal terbaik yang dapat saya temukan adalah \ sebagai non-spasi terakhir pada sebuah baris, yang akan menjadi perubahan besar karena ini adalah sintaks yang valid tetapi aneh saat ini:

x = y \
    z

Kami bahkan dapat terus mendukung penggunaan \ dalam konteks sensitif non-spasi karena y z adalah sintaks yang tidak valid tetapi itu mungkin agak terlalu pintar. Saya tidak yakin ini sepadan, tetapi sebagian besar bahasa memiliki cara untuk melanjutkan baris. Trik komentar multiline juga berfungsi tetapi agak bertele-tele.

Sangat melanggar...

julia> 2\
       10
5.0

julia> 2#=
       =#10
20

Ini pasti melanggar tapi saya akan terkejut jika \ sering digunakan seperti itu.

Mungkin #\ ? Tentu, mengaitkan perilaku baru ke komentar yang sebelumnya diabaikan juga melanggar, tetapi memiliki #\ sebagai komentar mungkin bahkan lebih jarang daripada memutus baris setelah \ (digunakan sebagai operator).

Fakta bahwa komentar multiline adalah cara yang relatif bertele-tele untuk melakukan ini adalah hal yang baik, menurut saya, untuk mencegah orang menggunakannya dengan santai. Python memiliki kelanjutan garis miring terbalik tetapi sekarang dilihat sebagai fitur pilihan terakhir . Demikian pula, di sebagian besar sintaks Julia sudah ada cara untuk menyisipkan linebreak tanpa menggunakan sintaks kelanjutan khusus, dan itu harus sangat disukai.

Hai @stevengj ,

Saya tidak yakin mengapa orang harus berkecil hati untuk menggunakan jeda baris. Lihat misalnya kode ini:

            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)

IMHO, tanda operasi di akhir tidak sebagus memilikinya di awal:

            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)

Itu hanya terasa jauh lebih alami bagi saya. Sekali lagi, ini adalah perubahan kosmetik, masing-masing akan memiliki pendapat yang berbeda tentang hal itu. Pertanyaannya adalah: apakah itu akan membahayakan desain bahasa?

Tampaknya lebih mudah untuk hanya menempatkan sepasang tanda kurung tambahan dalam kasus itu.

Ya, itu bisa dilakukan. Tapi, sekali lagi IMHO, itu tidak umum. Katakanlah seseorang melihat ini:

            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))

Dari sudut pandang matematis, tanda kurung tersebut tidak memiliki arti. Seseorang dapat secara tidak sengaja menghapusnya, Julia tidak akan menunjukkan peringatan apa pun, dan kodenya akan sepenuhnya salah.

Hal terbaik yang dapat saya temukan adalah \ sebagai non-spasi terakhir pada sebuah baris, yang akan menjadi perubahan besar karena ini saat ini valid tetapi sintaks yang aneh

Bagaimana dengan menggunakan # untuk tujuan yang sama? Interpretasinya adalah Anda mengomentari jeda baris. (terima kasih @oxinabox telah mengemukakan interpretasi tentang penggunaan LaTeX atas % sebagai komentar/kelanjutan baris)

Nah, dari sudut pandang saya, # di akhir baris tanpa mengikuti karakter apa pun, seharusnya sangat bagus dan tampaknya lebih sedikit merusak hal-hal.

Satu-satunya masalah potensial yang saya lihat di sini adalah bahwa pergi dari

a=1 #because reasons
 +2

ke

a=1 #
 +2

menghasilkan hasil yang berbeda. Ini mungkin tidak masalah.

Bagaimana dengan sesuatu yang Julia tidak gunakan seperti \\ ? Apakah terlalu jelek?

Saya berharap melakukan gaya lateks "Mengomentari suka yang baru" untuk memecahkan masalah.

Kecuali jika dibatasi hanya # tanpa spasi kosong setelahnya.
Sebagai contoh:

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

Di LaTeX yang tidak memiliki baris baru di dalamnya.
Dan memiliki komentar kosong bertindak berbeda dengan yang tidak kosong terdengar aneh.

Aku tidak benar-benar menyarankannya untuk julia.
Saya pikir \\ akan jauh lebih membingungkan.
Tapi saya pikir solusi @stevenngj dari komentar multiline mungkin yang terbaik. Itu sangat eksplisit mengomentari baris baru

Meskipun membuat literal multiline raksasa tampaknya cukup menarik.
Bahkan lebih daripada memiliki literal untuk Array{T, 3} .

Seseorang harus dapat membangunnya secara efisien dengan menggunakan perintah vect dan cat yang secara literal diturunkan.

Saya pikir proposalnya adalah memiliki # diikuti oleh karakter baris baru saja (atau mungkin hanya spasi).

Ya, maksud saya melakukan saran @StefanKarpinski tentang penanganan khusus # di akhir baris, jelas tidak termasuk kasus di mana ada hal-hal non-spasi setelah # . Mungkin perbandingan LaTeX lebih membingungkan daripada memperjelas apa yang saya coba katakan.

Mengkooptasi # tampaknya berisiko bagi saya. Kadang-kadang saya memiliki # s tersebar di kode saya, untuk alasan yang saya tidak ingat, komentar yang saya agak berubah pikiran, dll. Akan sangat mudah untuk secara tidak sengaja menghapus # s saat 'membersihkan'.

Saya kadang-kadang melewatkan operator kelanjutan garis, tetapi lebih suka itu menjadi sangat jelas secara eksplisit, seperti \ atau ... . #= atau [] tampak terlalu mirip _trick_.

(Jika penggunaannya tidak disarankan, mungkin sesuatu yang sedikit jelek, seperti \\\ akan berhasil?)

Juga cukup normal bagi saya untuk memberikan komentar setelah operator kelanjutan baris, jadi saya tidak ingin bergantung padanya sebagai karakter non-spasi terakhir di telepon.

Tidak yakin apakah mereka sudah digunakan di tempat lain, atau harus disediakan untuk operator khusus pengguna, tetapi salah satu panah Unicode ini mungkin membuat opsi yang menarik dan intuitif untuk kelanjutan baris eksplisit:

, , atau

(dibuat dapat diakses misalnya dengan beberapa alias lengkap tab yang berarti, seperti \continueline )

Saya pikir itu beruntung bahwa #= =# bekerja untuk ini dan kita harus berhenti di situ.

Saya tidak setuju bahwa meletakkan garis miring terbalik di akhir setiap baris entah bagaimana lebih baik daripada menambahkan tanda kurung atau hanya meletakkan operator di akhir baris. Saya juga tidak berpikir menyalahgunakan backslash atau # akan menjadi peningkatan; itu hanya akan menambah kejutan. Jika kami menggunakan sesuatu yang multi-karakter, itu tidak akan menjadi banyak peningkatan dari #= =# .

Saya tidak setuju bahwa meletakkan garis miring terbalik di akhir setiap baris entah bagaimana lebih baik daripada menambahkan tanda kurung atau hanya meletakkan operator di akhir baris.

Alasan masalah ini dibuka adalah karena keduanya tidak berfungsi untuk literal matriks. Namun, saya setuju bahwa kita mungkin tidak boleh melakukan apa pun untuk ini karena #= =# sudah berfungsi.

Sekarang saya telah melihat bahwa Anda dapat menggunakan #= =# untuk kelanjutan baris, itu masuk akal. Namun, jika saya jujur, maka saya pasti tidak akan mencapai kesimpulan itu sendiri.

Mungkin cara terbaik ke depan adalah menambahkan sesuatu ke dokumentasi dan panduan gaya Julia yang mengatakan bahwa kelanjutan baris dapat dicapai melalui #= =# .

Sekadar mengakhiri diskusi, @JeffBezanson dan @StefanKarpinski , apakah menurut Anda bahkan saran yang diajukan oleh @thchr , yang tidak akan merusak apa pun, tidak baik untuk diterapkan? Saya pikir itu akan menyenangkan seperti:

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

Kurang bertele-tele dari #= =# dan secara visual menyenangkan.

Ini memang bagus. Efek sampingnya adalah ini akan memberikan cara kanonik untuk mencetak kode dengan garis panjang pada tampilan lebar tetap dengan cara output membentuk kode yang valid.

Kami sudah mengurai banyak panah Unicode sebagai operator biner.

Saya menduga kita bisa menyisihkan satu.

Pilihan bagus IMHO:

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

Mungkin sudah waktunya untuk menjadikan spasi putih sebagai operator, dan kita dapat membebaninya dalam konteks matriks besar dengan Kaset. Untungnya, Bjarne Stroustrup telah melakukan pekerjaan desain yang sulit untuk kami – http://www.stroustrup.com/whitespace98.pdf

Jika kita menggunakan sesuatu yang multi-karakter, itu tidak akan menjadi banyak peningkatan dari #= =# .

Saya ingin mengajukan tiga argumen menentang ini.

Pertama, ini bisa disalahartikan sebagai komentar. Bahkan jika saya tahu ini, otak saya mencatat "Komentar".

Kedua, Anda harus meletakkannya di dua baris, bukan hanya satu. (Bagaimana ini akan berinteraksi dengan lekukan?)

Ketiga, ini adalah kombinasi penekanan tombol yang lebih rumit (di komputer saya shift-3 shift-0 enter shift-0 shift-3 ). Saya kira semacam pintasan keyboard dapat digunakan. \\ adalah, sebaliknya, dua penekanan cepat dari tombol yang sama (diikuti oleh enter .)

Tiga setengah: IMHO itu terlihat agak canggung, dan terasa seperti tipuan.

Bahkan jika \\ tidak diterima karena mungkin "dipesan" untuk penggunaan di masa mendatang, menurut saya saran sangat bagus. Lihat bagaimana jadinya:

            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)

Dan, selain itu, tidak ada yang akan dipaksa untuk menggunakan ini dan itu tidak akan merusak apa pun. Tapi saya yakin akan ada kasus penggunaan yang baik untuk ini (matriks besar yang membuat saya membuka masalah ini adalah satu):

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 ⤸
     ...

dari pada

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 #=
     ...

Sejauh dinding angka seperti itu bisa "terlihat bagus", terlihat jauh lebih baik bagi saya untuk meletakkan setiap baris pada satu baris. Setidaknya dengan cara itu saya dapat mengetahui berapa banyak baris yang dimiliki matriks, dan apakah baris tersebut memiliki panjang yang sama.

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 ...
       ...

Saya pikir itu bagus bahwa ada satu cara yang jelas untuk menulis ekspresi yang melintasi beberapa baris karena konsistensi di seluruh ekosistem lebih penting daripada fleksibilitas dalam format semacam ini.

Ini menunjukkan bahwa kita membiarkan semuanya apa adanya, kecuali untuk satu hal: dalam konteks di mana spasi putih signifikan (makro, tetapi juga konstruksi matriks) saat ini tidak ada cara yang jelas untuk melanjutkan baris. Peretasan komentar multi-baris itu pintar, tetapi juga jelek, IMO.

Kita dapat menyelesaikan keduanya sekaligus dengan menambahkan kelanjutan baris yang hanya valid dalam konteks penguraian 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

Saya telah menerapkan unicode untuk kelanjutan baris di cabang cjf/line-continuation . Ini adalah versi yang lebih sederhana yang tidak terbatas pada konteks sensitif ruang tetapi itu seharusnya mudah dengan sedikit penataan ulang.

Akan sangat bagus untuk memiliki pemisahan kolom gabungan yang eksplisit kelanjutan baris . Itu akan memecahkan masalah OP dan meningkatkan keterbacaan ekspresi matriks dengan rumus. Contoh tiruan menggunakan | ,

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

Mengapa lebih dari satu karakter kelanjutan baris diperlukan?

Demi memiliki proposal yang konkret, saya telah membuat PR untuk ini - lihat #29273

@c42f , IMHO, saya pikir akan agak membingungkan untuk mengizinkan karakter kelanjutan baris hanya dalam kesempatan tertentu. Mengapa kita tidak bisa membiarkannya menjadi global?

Stefan: Hanya untuk keterbacaan. Ini hanya akan menyarankan untuk mengizinkan karakter kelanjutan garis dalam garis untuk menekankan dan memaksa pemisahan bidang dalam konteks yang dipisahkan spasi.

@ronisbr fakta bahwa hanya ada satu cara yang jelas untuk melanjutkan baris di sebagian besar ekspresi seperti

x = a +
    b +
    c

agak menarik bagi saya dan saya tidak ingin mengubah itu.

Mengizinkan ini juga ditulis sebagai

x =   a  ⤸
    + b  ⤸
    + c

hanya memperkenalkan variasi IMO yang tidak perlu.

Bahasa sudah memiliki konsep konteks "ruang sensitif" di mana aturan penguraian berbeda, dan slot ini rapi di sana.

Halo kawan-kawan!

Sekarang kita memiliki 1.1, bisakah kita membahas fitur ini untuk 1.2? Setidaknya, bisakah kita memutuskan apakah ini pada akhirnya akan menjadi fitur baru atau masalah ini harus ditutup?

cc @JeffBezanson , alias sintaks czar.

Setelah menemukan komentar multiline seperti yang disarankan oleh @stevengj sempurna memadai untuk tujuan ini (dan secara umum), saya bertanya-tanya apakah kita hanya bisa menyebutkan ini di manual dan dengan demikian mengatasi masalah tersebut tanpa merubah bahasa. Jika ya, saya akan dengan senang hati membuat PR di tempat yang relevan (satu untuk matriks, satu sebagai saran umum).

Saya menyadari bahwa beberapa bahasa memiliki sintaks khusus untuk ini, dan itu terkadang berguna. Namun, saya tidak berpikir bahwa menulis garis super panjang atau memasukkan matriks literal besar dalam sumber harus menjadi kebiasaan yang didorong oleh bahasa, daripada sesuatu yang kami hanya memiliki beberapa dukungan dalam kasus yang jarang diperlukan.

Saya setuju bahwa kasus untuk pembungkusan matriks multiline cukup tidak biasa untuk dicakup dengan menggunakan #= =# dan layak untuk mendokumentasikan opsi ini untuk kelanjutan baris. Untuk doa makro multi-baris saya menggunakan sintaks ini, tetapi saya masih merasa jelek dan rumit.

Untuk panggilan makro multi-baris, Anda dapat menggunakan tanda kurung.

Saya sangat menyadari opsi untuk menggunakan parens untuk makro tetapi saya merasa tidak memuaskan seperti yang telah saya jelaskan sebelumnya. Yaitu, menggunakan tanda kurung dan koma membuat pemanggilan makro sangat berbeda secara visual dari cara makro "biasanya terlihat" di sebagian besar kode juila. Kode yang terlihat berbeda lebih sulit dibaca.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat