Neden bileşik ifadeler?


10

Bu, okuduğum bir kitaptan bir örnek:

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

Neden bileşik ifadelere ihtiyacım var? Sadece yazabilirsiniz volume = 10 * 20 * 30ya volume = len * breadth * heightya bunun için bir işlev veya anonim bir fonksiyon yazmak ...

Neden kullanıyorum beginve end? Ya da muhtemelen daha iyi bir soru: Bunları ne zaman kullanacağım, sanırım yukarıdaki kitaptan örnek muhtemelen çok iyi değil.


1
Bu hangi kitap? çünkü siz de örnek iyi değil
Michael K. Borregaard

"Julia'yı Öğrenmek", burada bulabilirsiniz: epdf.pub/learning-julia.html (sayfa 127)
Georgery

Yanıtlar:


4

Sanırım begin ... endblokların kullanışlı olduğu birçok durum var , ancak belirttiğiniz gibi, işlevler vb.Gibi diğer yapılarla da benzer bir etki elde edebilirsiniz.

begin ... endBloklar ne için kullanılabilir?

  • Basitçe değişkenleri ve isimlerini "içeren" Kime: len, breadthve heightbloğun içinde var sadece ve çevresindeki ad kirletmez olacaktır.
  • Makroları tek tek ifadelerden çok bir kod bloğuna uygulamak için. Örneğin @inbounds begin <all my code without bounds checking goes here> endveya bir @time begin ... endkod parçasının etrafına sarılması .
  • Çevreleyen bir küresel kapsamda yerel bir kapsam oluşturmak ( örneğin, küresel kapsam karışıklıklarından kaçınmak için). (Açıklamalarda belirttiği edildiği gibi geldiğini hatırlatırız begin ... endyok değil yerel bir kapsam tanıtmak, ama argüman benzer için de geçerlidir let ... endblokta.)

Özellikle ikinci nokta, kodlarım için kullandığım şeydir.


Ben de kendimi rahatlatmayı vardı, ama beginbloklar yok değil kapsamını tanıtmak . Öte yandan, bir ifade dizisini bir makroya / ile kod oluşturursanız kullanışlı olabilecek bir ifadeye dönüştürürler.
phipsgabler

1
Oh, teşekkürler, bu bağlamda let ... end, yerel bir kapsamı tanıtan kafam karıştı . Cevabımı düzeltirim.
crstnbr

Her zaman aynı yanlış varsayımı yapıyorum :) Bu sadece birinin beklediği gibi.
phipsgabler

1
@crstnbr İlk merminiz hala yanıltıcı. Yine de beginblokların yerel bir kapsam sunduğunu söylüyor .
Cameron Bieganek

7

Herkes söyledi genelleştirmelerini için: bloklar Eğer bir listesini dönüştürmek için izin tabloların bir (yani atanamaz hiçbir değerlere sahip sözdizimsel "ibareleri",) ifadesi değerlerini temsil eder ve (a "ifadesi" olabilir atanabilir ).

Örneğin, yapmamalısınız, yazabilirsiniz

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

xbir döngü işleminin sonucuna atamak için. (Dizideki son ifadenin aslında bir ifade olması gerektiği kısıtlamasıyla - aksi takdirde, ifade için bir değeriniz olmaz.)

Bunun meşru bir kullanım durumu oluşturulan koddur. Örneğin,

x = @somthing bla blub

içine

x = begin
   (stuff involving bla and blub)
end

şeffaf bir şekilde kullanıcıya, @somethingözgürce herhangi bir dil yapıları oluşturabilir.

Veya daha uzun bir gövdeye sahip anonim bir işlev yazmak istiyorsanız (ve functionformu kullanmıyorsanız ):

f = x -> begin
   ...
end

1
Hafif bir açıklama: In Julia ifadeleri değerleri var ve olabilir atanabilir. Yapabileceğiniz Yani x = y = 1, a = if false endve b = for i in 1:2 end, bundan sonra xdeğeri vardır 1ve ave bher iki değere sahip nothing.
Cameron Bieganek

Ah, işte bir değerini atama daha yararlı bir örnek if-elseaçıklamada: a = if false; 1 else 2 end. Bu durumda, aeşittir 2.
Cameron Bieganek

1
Doğru, değerleri var ve teknik olarak da ifadeler. Atama bir ifadedir, çünkü temelde setproperty!/ setindex!'dir ve “geleneksel olarak” bir değere sahip olması (C benzeri dillerde) bir şeydir. Aynı if-else, birkaç dilde bir ifade. Ama forve "varsayılan" değeri ifolmadan , bunu sadece bir eser olarak görüyorum. elsenothing
phipsgabler

6

Bu bloklar için bir kullanım anlamadır:

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

Bunun yerine bir işlev yapabilir ve onu kavrama içinde kullanabilirsiniz, ancak bazen bu uygundur. Bir yerde çok satırlı bir kod bloğu kullanmak istediğinizde kullanılır, örneğin bir makroya argüman olarak geçmek için ( @testsetTest standart kitaplığında çok yaygın olarak kullanılır ).


Demek istediğin noktaya karşı gelmek değil, sadece y^2 - y^4 + 2bu durumda yazılabilir . Belki de iki (veya daha fazla) adımın gerçekten gerekli olduğu bir örneği göstermek daha iyi olur.
crstnbr

@crstnbr haklısınız, ancak başlangıçta kitaptaki örneği kullandım ve sadece mantıklı bir kullanımın ne olacağını merak ettim.
Georgery

1
Gibi, bazı pahalı ara değerini hesaplamak için iki kez.
phipsgabler

5

Basitçe söylemek gerekirse: “begin” sadece bir kod bloğunu gösterir (buradaki dokümanlara bakınız: https://docs.julialang.org/en/v1/base/base/#begin ).

Yukarıdaki örnekte, bir fonksiyonun bildirilmesine karşı bir start bloğunun kullanılmasının herhangi bir değeri olduğu açık değildir.

Anahtar kelimenin kodda çok kullanıldığını görmüyorum ve şahsen pratikte hiç kullanmadım. Benim önerim sadece aynı işlevi yapacak gibi bir işlevi kullanmak için.


Julia'yı henüz kullanmadım, ama tam da böyle düşünüyorum. Bununla birlikte, dil tasarlandığında (muhtemelen çok akıllı) insanların aklında bir fikir olması gerekirdi, değil mi?
Georgery

@Logankilpatrick ile birçok durumda bunun yerine işlevleri kullanmak isteyeceğinize katılıyorum. Ama bence bu blokların varlığının nedenleri var (cevabım bakınız).
crstnbr

@Georgery Bir ifade dizisini bir ifadeye dönüştürmek bazen yararlı bir şeydir (bakınız LISP'de progn).
phipsgabler

1
Doğru not ettiğiniz gibi, bu bağlamda saçma görünüyor
Michael K. Borregaard
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.