Mengapa ekspresi majemuk?

10

Ini adalah contoh dari buku yang saya baca:

volume = begin
    len = 10
    breadth = 20
    height = 30
    len * breadth * height
end

Mengapa saya perlu ekspresi majemuk ?? Saya hanya bisa menulis volume = 10 * 20 * 30atau volume = len * breadth * heightmenulis fungsi untuk itu atau fungsi anonim ...

Mengapa saya menggunakan begindan end? Atau pertanyaan yang mungkin lebih baik: Kapan saya menggunakannya, karena saya kira contoh di atas dari buku mungkin tidak terlalu baik.

Georgery
sumber
1
Buku apa itu? karena Anda juga bukan contohnya tidak terlalu baik
Michael K. Borregaard
"Learning Julia", sebagaimana tersedia di sini: epdf.pub/learning-julia.html (halaman 127)
Georgery

Jawaban:

4

Saya kira ada banyak situasi di mana begin ... endblok berguna, tetapi seperti yang Anda catat Anda sering dapat juga mencapai efek yang sama dengan konstruksi lainnya, seperti fungsi, dll.

Untuk apa begin ... endblok bisa digunakan?

  • Untuk hanya "mengandung" variabel dan nama-nama mereka: len, breadth, dan heighthanya akan ada di dalam blok dan tidak mencemari namespace sekitarnya.
  • Untuk menerapkan makro ke blok kode daripada pernyataan individual. Misalnya @inbounds begin <all my code without bounds checking goes here> endatau membungkus @time begin ... endsepotong kode.
  • Untuk membuat lingkup lokal di lingkup global sekitarnya (untuk menghindari kebingungan lingkup global misalnya). (Perhatikan bahwa seperti yang telah ditunjukkan di komentar begin ... endtidak tidak memperkenalkan lingkup lokal, tetapi argumen berlaku untuk sama let ... endblok.)

Secara khusus poin kedua adalah apa yang saya gunakan dalam kode saya.

crstnbr
sumber
Saya juga harus meyakinkan diri saya sendiri, tapi beginblok jangan tidak memperkenalkan lingkup . Di sisi lain, mereka mengubah urutan pernyataan menjadi ekspresi, yang dapat berguna jika Anda membuat kode dengan / dari makro.
phipsgabler
1
Oh, terima kasih, dalam hal ini saya bingung dengan let ... endyang memperkenalkan lingkup lokal. Akan memperbaiki jawaban saya.
crstnbr
Saya membuat asumsi salah yang sama sepanjang waktu :) Itu hanya apa yang diharapkan.
phipsgabler
1
@crstnbr Peluru pertama Anda masih menyesatkan. Tampaknya masih mengatakan bahwa beginblok memperkenalkan ruang lingkup lokal.
Cameron Bieganek
7

Untuk menggeneralisasi apa yang dikatakan orang lain: blok memungkinkan Anda mengonversi daftar pernyataan ("frasa" sintaksis yang tidak memiliki nilai, yaitu, tidak dapat ditetapkan) menjadi satu ekspresi ("frasa" yang mewakili nilai dan dapat ditugaskan ).

Misalnya, walaupun tidak seharusnya, Anda dapat menulis

x = begin
    s = 0
    for i = 1:10
        s += i^2
    end
    s
end

untuk menetapkan xhasil operasi looping. (Dengan batasan bahwa pernyataan terakhir dalam urutan harus benar-benar ekspresi - jika tidak, Anda tidak akan memiliki nilai untuk ekspresi.)

Kasus penggunaan yang sah dari ini dihasilkan kode. Misalnya, Anda mungkin berbalik

x = @somthing bla blub

ke

x = begin
   (stuff involving bla and blub)
end

secara transparan kepada pengguna, sementara @somethingdapat dengan bebas menghasilkan konstruksi bahasa apa pun.

Atau jika Anda ingin menulis fungsi anonim dengan tubuh yang lebih panjang (dan tidak menggunakan functionformulir):

f = x -> begin
   ...
end
phipsgabler
sumber
1
Klarifikasi kecil: Di Julia, pernyataan memang memiliki nilai dan dapat ditugaskan. Jadi Anda dapat melakukan x = y = 1,, a = if false enddan b = for i in 1:2 end, setelah itu xmemiliki nilai 1, dan adan bkeduanya memiliki nilai nothing.
Cameron Bieganek
Oh, inilah contoh yang lebih berguna untuk menempatkan nilai suatu if-elsepernyataan: a = if false; 1 else 2 end. Dalam hal ini, asama dengan 2.
Cameron Bieganek
1
Benar, mereka memiliki nilai dan juga ekspresi teknologi. Penugasan adalah sebuah ekspresi, karena ini pada dasarnya setproperty!/ setindex!, dan "secara tradisional" adalah sesuatu yang memiliki nilai (dalam bahasa seperti-C). Sama untuk if-else, yang merupakan ekspresi dalam beberapa bahasa. Tetapi fordan iftanpa elsememiliki nilai "standar" nothing, saya melihat itu hanya sebagai artefak.
phipsgabler
6

Satu kegunaan untuk blok ini adalah dalam pemahaman:

A = [ begin
           x = y^2
           x - x^2 + 2
         end
         for y = 1:5 ]

Anda bisa membuat fungsi dan menggunakannya di dalam pemahaman sebagai gantinya, tetapi kadang-kadang ini nyaman. Ini digunakan kapan pun Anda ingin menggunakan blok kode multiline di suatu tempat, misalnya untuk meneruskan sebagai argumen ke makro (yang sangat umum digunakan untuk @testsetdari pustaka standar Test).

Eric
sumber
Bukan untuk menentang poin Anda tetapi orang hanya bisa menulis y^2 - y^4 + 2dalam kasus ini Mungkin akan lebih baik untuk menunjukkan contoh di mana dua (atau lebih) langkah sangat dibutuhkan.
crstnbr
@ crstnbr Anda benar, tetapi saya awalnya hanya menggunakan contoh dari buku dan hanya tertarik apa penggunaan yang masuk akal.
Georgery
1
Seperti, untuk menghemat menghitung beberapa nilai menengah yang mahal dua kali.
phipsgabler
5

Sederhananya: "mulai" hanya menunjukkan blok kode (lihat dokumen tentang ini: https://docs.julialang.org/en/v1/base/base/#begin ).

Dalam contoh di atas, tidak jelas bahwa ada nilai untuk menggunakan blok awal vs mendeklarasikan fungsi.

Saya tidak melihat kata kunci yang digunakan sangat banyak dalam kode dan saya pribadi tidak pernah menggunakannya dalam praktik. Saran saya agar hanya menggunakan fungsi karena akan melakukan hal yang sama.

logankilpatrick
sumber
Saya belum pernah menggunakan Julia, tetapi inilah yang saya pikirkan. Namun, ketika bahasanya dirancang (mungkin sangat pintar) orang pasti memiliki ide di benak, kan?
Georgery
Saya setuju dengan @logankilpatrick bahwa dalam banyak kasus Anda ingin menggunakan fungsi saja. Tapi saya pikir ada alasan untuk keberadaan blok ini (lihat jawaban saya).
crstnbr
@Georgery Mengubah urutan pernyataan menjadi ekspresi kadang-kadang berguna (lih. prognDalam LISP).
phipsgabler
1
seperti yang Anda catat dengan benar, tampaknya tidak masuk akal dalam konteksnya
Michael K. Borregaard