Noteworthy Differences from other Languages
Noteworthy differences from MATLAB
MATLAB kullanıcıları Julia'nın sözdizimini tanıdık bulsalar da, Julia bir MATLAB klonu değildir. Önemli sözdizimsel ve işlevsel farklılıklar vardır. Aşağıda, MATLAB'a alışkın Julia kullanıcılarını zorlayabilecek bazı dikkate değer farklılıklar bulunmaktadır:
Julia dizileri köşeli parantezlerle indekslenir,
A[i,j].Julia dizileri başka bir değişkene atandığında kopyalanmaz.
A = BsonrasındaB'nin elemanlarını değiştirmek,A'yı da değiştirecektir. Bunu önlemek içinA = copy(B)kullanın.Julia değerleri bir fonksiyona geçirildiğinde kopyalanmaz. Eğer bir fonksiyon bir diziyi değiştirirse, değişiklikler çağıran yerde görünür olacaktır.
Julia, otomatik olarak bir atama ifadesinde dizileri büyütmez. MATLAB'da
a(4) = 3.2ifadesia = [0 0 0 3.2]dizisini oluşturabilir vea(5) = 7ifadesi bunua = [0 0 0 3.2 7]haline getirebilirken, karşılık gelen Julia ifadesia[5] = 7eğera'nın uzunluğu 5'ten azsa veya bu ifadeatanımlayıcısının ilk kullanımıysa bir hata verir. Julia, MATLAB'ına(end+1) = valifadesinden çok daha verimli bir şekildeVector'ları büyütenpush!veappend!'ya sahiptir.Hayali birim
sqrt(-1), Julia'daimolarak temsil edilir, MATLAB'dakiiveyajyerine.Julia'da ondalık noktası olmayan literal sayılar (örneğin
42) tam sayılar oluşturur, kayan nokta sayıları yerine. Sonuç olarak, bazı işlemler bir float bekliyorsa bir alan hatası verebilir; örneğin,julia> a = -1; 2^abir alan hatası verir, çünkü sonuç bir tam sayı değildir (detaylar için the FAQ entry on domain errors'e bakın).Julia'da birden fazla değer döndürülür ve demetler olarak atanır, örneğin
(a, b) = (1, 2)veyaa, b = 1, 2. MATLAB'dakinargout, genellikle döndürülen değerlerin sayısına dayalı olarak isteğe bağlı işler yapmak için kullanılır, ancak Julia'da yoktur. Bunun yerine, kullanıcılar benzer yetenekleri elde etmek için isteğe bağlı ve anahtar kelime argümanlarını kullanabilirler.Julia, gerçek bir boyutlu dizilere sahiptir. Sütun vektörleri
Nboyutundadır,Nx1değil. Örneğin,rand(N)1 boyutlu bir dizi oluşturur.Julia'da,
[x,y,z]her zamanx,yveziçeren 3 elemanlı bir dizi oluşturur.- İlk ("dikey") boyutta birleştirmek için ya
vcat(x,y,z)kullanın ya da noktalı virgülle ayırın ([x; y; z]). - İkinci ("yatay") boyutta birleştirmek için ya
hcat(x,y,z)kullanın ya da boşluklarla ayırın ([x y z]). - Blok matrisleri oluşturmak için (ilk iki boyutta birleştirerek), ya
hvcatkullanın ya da boşluklar ve noktalı virgülleri birleştirin ([a b; c d]).
- İlk ("dikey") boyutta birleştirmek için ya
Julia'da,
a:bvea:b:cAbstractRangenesneleri oluşturur. MATLAB'daki gibi tam bir vektör oluşturmak içincollect(a:b)kullanın. Genel olarak,collectçağırmaya gerek yoktur. BirAbstractRangenesnesi çoğu durumda normal bir dizi gibi davranır, ancak değerlerini tembel bir şekilde hesapladığı için daha verimlidir. Tam diziler yerine özel nesneler oluşturma kalıbı sıkça kullanılır verangegibi fonksiyonlarda veyaenumeratevezipgibi iteratörlerde de görülür. Özel nesneler çoğunlukla normal diziler gibi kullanılabilir.Julia'daki fonksiyonlar, son ifadelerinden veya
returnanahtar kelimesinden değer döndürür; bu, fonksiyon tanımında döndürülecek değişkenlerin isimlerini listelemek yerine geçerlidir (detaylar için bkz. The return Keyword).Bir Julia betiği herhangi bir sayıda fonksiyon içerebilir ve tüm tanımlar dosya yüklendiğinde dışarıdan görünür olacaktır. Fonksiyon tanımları, mevcut çalışma dizininden dışarıdaki dosyalardan da yüklenebilir.
Julia'da,
sum(A)gibi tek bir argümanla çağrıldığında,sum,prodvemaximumgibi azaltmalar, bir dizinin her bir elemanı üzerinde gerçekleştirilir, A'nın birden fazla boyutu olsa bile.Julia'da, sıfır argümanlı bir fonksiyonu çağırmak için parantezler kullanılmalıdır, örneğin
rand().Julia, ifadelerin sonunu noktalı virgül ile bitirmeyi teşvik etmez. İfadelerin sonuçları otomatik olarak yazdırılmaz (etkileşimli istemci dışında) ve kod satırlarının noktalı virgül ile bitirilmesi gerekmez.
printlnveya@printfbelirli bir çıktıyı yazdırmak için kullanılabilir.Julia'da,
AveBdizileri varsa, mantıksal karşılaştırma işlemleriA == Bgibi bir dizi boolean döndürmez. Bunun yerine,A .== Bkullanın ve benzer şekilde diğer boolean operatörleri için de<,>kullanın.Julia'da
&,|ve⊻(xor) operatörleri, MATLAB'dakiand,orvexorişlemlerine karşılık gelen bit düzeyindeki işlemleri gerçekleştirir ve öncelikleri Python'un bit düzeyindeki operatörleriyle benzerdir (C'den farklı olarak). Skalarlar üzerinde veya diziler arasında eleman bazında çalışabilirler ve mantıksal dizileri birleştirmek için kullanılabilirler, ancak işlem sırasındaki farkı not edin: parantezler gerekli olabilir (örneğin,A'nın 1 veya 2'ye eşit olan elemanlarını seçmek için(A .== 1) .| (A .== 2)kullanın).Julia'da, bir koleksiyonun elemanları,
...splat operatörü kullanılarak bir fonksiyona argüman olarak geçirilebilir; örneğinxs=[1,2]; f(xs...).Julia'nın
svdtekil değerleri yoğun bir diagonal matris yerine bir vektör olarak döndürür.Julia'da
...kod satırlarını devam ettirmek için kullanılmaz. Bunun yerine, tamamlanmamış ifadeler otomatik olarak bir sonraki satıra devam eder.Hem Julia hem de MATLAB'da,
ansdeğişkeni etkileşimli bir oturumda verilen son ifadenin değerine ayarlanır. Julia'da, MATLAB'ın aksine, Julia kodu etkileşimli olmayan modda çalıştırıldığındaansayarlanmamaktadır.Julia'nın
structları, MATLAB'ınclassları gibi çalışma zamanında dinamik olarak alan eklemeyi desteklemez. Bunun yerine, birDictkullanın. Julia'daki Dict sıralı değildir.Julia'da her modülün kendi küresel kapsamı/ad alanı vardır, oysa MATLAB'da sadece bir küresel kapsam vardır.
In MATLAB, istenmeyen değerleri kaldırmanın bir idiomatik yolu,
x(x>3)ifadesi veyax(x>3) = []ifadesi gibi mantıksal dizinleme kullanmaktır; bu,x'i yerinde değiştirmek için kullanılır. Buna karşılık, Julia, kullanıcılarınfilter(z->z>3, x)vefilter!(z->z>3, x)yazmalarına olanak tanıyanfiltervefilter!yüksek dereceli fonksiyonları sağlar; bu, karşılık gelen transliterasyonlar olanx[x.>3]vex = x[x.>3]için alternatiflerdir.4d61726b646f776e2e436f64652822222c202266696c746572212229_40726566geçici dizilerin kullanımını azaltır.Hücre dizisinin tüm elemanlarını çıkarmanın (veya "dereference" etmenin) analoğu, MATLAB'da
vertcat(A{:})şeklinde yazılırken, Julia'da splat operatörü kullanılarakvcat(A...)şeklinde yazılır.Julia'da
adjointfonksiyonu karmaşık transpozunu gerçekleştirir; MATLAB'daadjoint, kofaktör matrisinin transpozunu veren "adjugate" veya klasik adjoint'i sağlar.Julia'da a^b^c ifadesi a^(b^c) olarak değerlendirilirken, MATLAB'da (a^b)^c şeklinde değerlendirilir.
Noteworthy differences from R
Julia'nın hedeflerinden biri, veri analizi ve istatistiksel programlama için etkili bir dil sağlamaktır. R'den Julia'ya gelen kullanıcılar için bazı dikkate değer farklılıklar şunlardır:
Julia'nın tek tırnakları karakterleri, stringleri değil, kapsar.
Julia, dizgilerde indeksleme yaparak alt dizeler oluşturabilir. R'de, dizgiler alt dizeler oluşturulmadan önce karakter vektörlerine dönüştürülmelidir.
Julia'da, Python gibi ama R'den farklı olarak, dizeler üçlü tırnak işareti
""" ... """ile oluşturulabilir. Bu sözdizimi, satır sonları içeren dizeleri oluşturmak için kullanışlıdır.Julia'da varargs, belirli bir değişkenin adını takiben gelen splat operatörü
...kullanılarak belirtilir; bu, R için geçerli değildir, çünkü R'de...yalnızca başıboş olarak yer alabilir.Julia'da modül
mod(a, b)şeklindedir,a %% bdeğil. Julia'da%kalanı hesaplama operatörüdür.Julia, köşeli parantezler kullanarak vektörler oluşturur. Julia'nın
[1, 2, 3]ifadesi, R'nınc(1, 2, 3)ifadesine eşdeğerdir.Julia'da, tüm veri yapıları mantıksal indekslemeyi desteklemez. Ayrıca, Julia'da mantıksal indeksleme yalnızca indekslenen nesne ile aynı uzunlukta olan vektörlerle desteklenir. Örneğin:
- R'de
c(1, 2, 3, 4)[c(TRUE, FALSE)]ifadesic(1, 3)ile eşdeğerdir. - R'de
c(1, 2, 3, 4)[c(TRUE, FALSE, TRUE, FALSE)]ifadesic(1, 3)ile eşdeğerdir. - In Julia,
[1, 2, 3, 4][[true, false]]birBoundsErrorhatası verir. - Julia'da,
[1, 2, 3, 4][[true, false, true, false]]ifadesi[1, 3]sonucunu verir.
- R'de
Diğer birçok dil gibi, Julia farklı uzunluktaki vektörler üzerinde her zaman işlem yapmaya izin vermez; oysa R'de vektörlerin yalnızca ortak bir indeks aralığına sahip olması gerekir. Örneğin,
c(1, 2, 3, 4) + c(1, 2)geçerli bir R ifadesidir, ancak eşdeğeri[1, 2, 3, 4] + [1, 2]Julia'da bir hata verecektir.Julia, kodun anlamını değiştirmediği durumlarda isteğe bağlı bir son virgül kullanımına izin verir. Bu, R kullanıcıları arasında dizilere indeksleme yaparken kafa karışıklığına neden olabilir. Örneğin, R'de
x[1,]bir matrisin ilk satırını döndürür; ancak Julia'da virgül göz ardı edilir, bu nedenlex[1,] == x[1]olur ve ilk öğeyi döndürür. Bir satırı çıkarmak için:kullanmayı unutmayın, örneğinx[1,:].Julia'nın
mapfonksiyonu önce alır, ardından argümanlarını, R'dekilapply(<yapı>, fonksiyon, ...)'dan farklı olarak. Benzer şekilde, Julia'nın R'dekiapply(X, MARGIN, FUN, ...)eşdeğerimapslices'dır; burada fonksiyon ilk argümandır.R'de çok değişkenli uygulama, örneğin
mapply(choose, 11:13, 1:3), Julia'dabroadcast(binomial, 11:13, 1:3)olarak yazılabilir. Eşdeğer olarak, Julia, fonksiyonları vektörleştirmek için daha kısa bir nokta sözdizimi sunar:binomial.(11:13, 1:3).Julia, koşul bloklarının, döngü bloklarının ve fonksiyonların sonunu belirtmek için
endkullanır. Tek satırlıkif ( cond ) statementyerine, Juliaif cond; statement; end,cond && statementve!cond || statementbiçimindeki ifadeleri kabul eder. Son iki sözdizimindeki atama ifadeleri, açıkça parantez içine alınmalıdır; örneğin,cond && (x = value).Julia'da
<-,<<-ve->atama operatörleri değildir.Julia'nın
->ifadesi anonim bir fonksiyon oluşturur.Julia'nın
*operatörü, R'deki gibi matris çarpımı yapabilir. EğerAveBmatrisleri ise, o zamanA * Bifadesi Julia'da matris çarpımını belirtir ve bu, R'dekiA %*% Bifadesine eşdeğerdir. R'de bu aynı notasyon, eleman bazında (Hadamard) çarpım yapar. Eleman bazında çarpım işlemini elde etmek için Julia'daA .* Byazmanız gerekir.Julia,
transposefonksiyonunu kullanarak matris transpozisyonu yapar ve konjuge transpozisyonu'operatörü veyaadjointfonksiyonu ile gerçekleştirir. Julia'nıntranspose(A)fonksiyonu, R'nint(A)fonksiyonuna eşdeğerdir. Ayrıca, Julia'da özyinelemeli olmayan bir transpozisyonpermutedimsfonksiyonu ile sağlanır.Julia parantez gerektirmez
ififadeleri veyafor/whiledöngüleri yazarken:for i in [1, 2, 3]yerinefor (i in c(1, 2, 3))veif i == 1yerineif (i == 1)kullanın.Julia,
0ve1sayıları Boole olarak kabul etmez. Julia'daif (1)yazamazsınız, çünküififadeleri yalnızca boole değerlerini kabul eder. Bunun yerineif true,if Bool(1)veyaif 1==1yazabilirsiniz.Julia
nrowvencolsağlamaz. Bunun yerinenrow(M)içinsize(M, 1)vencol(M)içinsize(M, 2)kullanın.Julia, skalarlar, vektörler ve matrisleri ayırt etmekte dikkatlidir. R'de
1vec(1)aynıdır. Julia'da ise bunlar birbirinin yerine kullanılamaz.Julia, atama işleminin sol tarafında fonksiyon çağrılarının sonuçlarına atama yapamaz:
diag(M) = fill(1, n)yazamazsınız.Julia, ana fonksiyonları ana ad alanına yerleştirmeyi teşvik etmez. Julia için çoğu istatistiksel işlevsellik packages altında JuliaStats organization bulunur. Örneğin:
- Olasılık dağılımlarına ilişkin fonksiyonlar Distributions package tarafından sağlanmaktadır.
- DataFrames package veri çerçeveleri sağlar.
- Genelleştirilmiş lineer modeller GLM package tarafından sağlanmaktadır.
Julia, demetler ve gerçek hash tabloları sağlar, ancak R tarzı listeler sağlamaz. Birden fazla öğe döndürürken, genellikle bir demet veya adlandırılmış demet kullanmalısınız:
list(a = 1, b = 2)yerine(1, 2)veya(a=1, b=2)kullanın.Julia, kullanıcıların S3 veya S4 nesnelerinden daha kolay kullanılabilen kendi türlerini yazmalarını teşvik eder. Julia'nın çoklu dağıtım sistemi,
table(x::TypeA)vetable(x::TypeB)'nin R'nintable.TypeA(x)vetable.TypeB(x)gibi davranması anlamına gelir.Julia'da, değerler atandığında veya bir işleve geçirildiğinde kopyalanmaz. Bir işlev bir diziyi değiştirdiğinde, değişiklikler çağıran yerde görünür. Bu, R'den çok farklıdır ve yeni işlevlerin büyük veri yapıları üzerinde çok daha verimli bir şekilde çalışmasına olanak tanır.
In Julia, vektörler ve matrisler
hcat,vcatvehvcatkullanılarak birleştirilir, R'deki gibic,rbindvecbindile değil.Julia'da
a:bgibi bir aralık, R'deki gibi bir vektör için kısayol değildir, ancak yineleme için kullanılan özel birAbstractRangenesnesidir. Bir aralığı bir vektöre dönüştürmek içincollect(a:b)kullanın.:operatörü R ve Julia'da farklı bir önceliğe sahiptir. Özellikle, Julia'da aritmetik operatörler:operatöründen daha yüksek önceliğe sahiptir, oysa R'de bunun tersi doğrudur. Örneğin,1:n-1Julia'da1:(n-1)ile eşdeğerdir.Julia'nın
maxveminR'dekipmaxvepmin'in eşdeğerleridir, ancak her iki argümanın da aynı boyutlarda olması gerekir.maximumveminimumise R'dekimaxvemin'i değiştirmektedir, ancak önemli farklılıklar vardır.Julia'nın
sum,prod,maximumveminimumR'deki karşıtlarından farklıdır. Hepsi, işlemin gerçekleştirileceği boyutları belirten isteğe bağlı bir anahtar argümanıdimskabul eder. Örneğin, Julia'daA = [1 2; 3 4]ve R'deB <- rbind(c(1,2),c(3,4))aynı matristir. O zamansum(A)ilesum(B)aynı sonucu verir, ancaksum(A, dims=1)her sütunun toplamını içeren bir satır vektörü vesum(A, dims=2)her satırın toplamını içeren bir sütun vektörüdür. Bu, R'nin davranışıyla çelişir; burada ayrıcolSums(B)verowSums(B)fonksiyonları bu işlevselliği sağlar. Eğerdimsanahtar argümanı bir vektörse, o zaman toplamın gerçekleştirileceği tüm boyutları belirtir ve toplam dizinin boyutlarını korur; örneğin,sum(A, dims=(1,2)) == hcat(10). İkinci argümanla ilgili hata kontrolü yapılmadığına dikkat edilmelidir.Julia'nın argümanlarını değiştirebilen birkaç fonksiyonu vardır. Örneğin, hem
sorthem desort!vardır.R'de performans, vektörleştirme gerektirir. Julia'da ise neredeyse tam tersi doğrudur: en iyi performans gösteren kod genellikle devektörleştirilmiş döngüler kullanılarak elde edilir.
Julia, hevesle değerlendirilir ve R tarzı tembel değerlendirmeyi desteklemez. Çoğu kullanıcı için bu, çok az sayıda alıntılanmamış ifade veya sütun adı olduğu anlamına gelir.
Julia
NULLtürünü desteklemez. En yakın eşdeğerinothing'dır, ancak bir liste gibi değil, bir skalar değer gibi davranır.is.null(x)yerinex === nothingkullanın.In Julia, eksik değerler
missingnesnesi ile temsil edilir,NAile değil. Bunun yerineismissing(x)(veya vektörler üzerinde eleman bazında işlem içinismissing.(x)) kullanın.skipmissingfonksiyonu genelliklena.rm=TRUEyerine kullanılır (bazı özel durumlarda fonksiyonlarskipmissingargümanı alır).Julia, R'nin
assignveyageteşdeğerine sahip değildir.Julia'da
returnparantez gerektirmez.R'de, istenmeyen değerleri kaldırmanın bir yolu mantıksal indeksleme kullanmaktır, örneğin
x[x>3]ifadesinde veyax = x[x>3]ifadesindex'i yerinde değiştirmek için. Buna karşılık, Julia, kullanıcılarınfilter(z->z>3, x)vefilter!(z->z>3, x)yazmalarına olanak tanıyanfiltervefilter!yüksek düzeyli fonksiyonlar sunar; bunlar, karşılık gelen transliterasyonlar olanx[x.>3]vex = x[x.>3]için alternatiflerdir.4d61726b646f776e2e436f64652822222c202266696c746572212229_40726566kullanmak, geçici dizilerin kullanımını azaltır.
Noteworthy differences from Python
- Julia'nın
for,if,whilevb. bloklarıendanahtar kelimesiyle sonlandırılır. Girinti seviyesi, Python'daki gibi önemli değildir. Python'un aksine, Julia'nınpassanahtar kelimesi yoktur. - Dizeler, Julia'da çift tırnak işaretleri (
"metin") ile gösterilir (çok satırlı dizeler için üç çift tırnak işareti kullanılır), Python'da ise ya tek ('metin') ya da çift tırnak işaretleri ("metin") ile gösterilebilir. Tek tırnak işaretleri, Julia'da karakterler için kullanılır ('c'). - Dize birleştirme, Julia'da Python'daki gibi
+yerine*ile yapılır. Benzer şekilde, dize tekrarı*yerine^ile yapılır. Python'daki gibi dize sabitlerinin örtük birleştirilmesi (örneğin,'ab' 'cd' == 'abcd') Julia'da yapılmaz. - Python Listeleri—esnek ama yavaş—Julia
Vector{Any}türüne veya daha genel olarakVector{T}türüne karşılık gelir; buradaT, bazı somut olmayan eleman türleridir. Elemanları yerinde depolayan "hızlı" diziler, yanidtypenp.float64,[('f1', np.uint64), ('f2', np.int32)]vb. olan NumPy dizileri,Array{T}ile temsil edilebilir; buradaT, somut, değişmez bir eleman türüdür. Bu,Float64,Int32,Int64gibi yerleşik türleri, ancak aynı zamandaTuple{UInt64,Float64}gibi daha karmaşık türleri ve birçok kullanıcı tanımlı türü de içerir. - Julia'da dizilerin, stringlerin vb. indekslemesi 0 tabanlı değil, 1 tabanlıdır.
- Julia'nın dilim indekslemesi, Python'dakinin aksine son öğeyi de içerir.
a[2:3]Julia'daa[1:3]şeklindedir. - Julia, Python'dan farklı olarak AbstractArrays with arbitrary indexes değerlerini destekler. Python'un negatif indeksleme için özel yorumu,
a[-1]vea[-2], Julia'daa[end]vea[end-1]olarak yazılmalıdır. - Julia, son son eleman için
endgerektirir. Python'dakix[1:], Julia'dax[2:end]ile eşdeğerdir. - In Julia,
:herhangi bir nesnenin önündeSymbolveya bir ifadeyi tırnak içine alır; bu nedenle,x[:5]x[5]ile aynıdır. Bir dizinin ilknelemanını almak istiyorsanız, o zaman aralık indekslemesi kullanın. - Julia'nın aralık indekslemesi
x[start:step:stop]formatına sahiptir, oysa Python'un formatıx[start:(stop+1):step]şeklindedir. Bu nedenle, Python'dakix[0:10:2], Julia'dakix[1:2:10]ile eşdeğerdir. Benzer şekilde, Python'dakix[::-1], ters çevrilmiş diziyi ifade eder ve bu, Julia'dax[end:-1:1]ile eşdeğerdir. - Julia'da, aralıklar bağımsız olarak
başlangıç:adım:durşeklinde oluşturulabilir, bu da dizi indekslemede kullanılan aynı sözdizimidir.rangefonksiyonu da desteklenmektedir. - Julia'da, bir matrisin dizinlenmesi
X[[1,2], [1,3]]gibi, bir alt matrisin ilk ve ikinci satırlarının birinci ve üçüncü sütunlarıyla kesişimlerini ifade eder. Python'da iseX[[1,2], [1,3]], matrisin[1,1]ve[2,3]hücrelerinin değerlerini içeren bir vektörü ifade eder. Julia'dakiX[[1,2], [1,3]], Python'dakiX[np.ix_([0,1],[0,2])]ile eşdeğerdir. Python'dakiX[[0,1], [0,2]], Julia'dakiX[[CartesianIndex(1,1), CartesianIndex(2,3)]]ile eşdeğerdir. - Julia'nın satır devam ettirme sözdizimi yoktur: bir satırın sonunda, şu ana kadar olan girdi tam bir ifade ise, işlem tamamlanmış sayılır; aksi takdirde girdi devam eder. Bir ifadeyi devam ettirmeyi zorlamanın bir yolu, onu parantez içine almaktır.
- Julia arrays are column-major (Fortran-ordered) whereas NumPy arrays are row-major (C-ordered) by default. To get optimal performance when looping over arrays, the order of the loops should be reversed in Julia relative to NumPy (see relevant section of Performance Tips).
- Julia'nın güncelleme operatörleri (örneğin
+=,-=, ...) yerinde değil iken NumPy'ninkiler yerinde. Bu,A = [1, 1]; B = A; B += [3, 3]ifadesininA'daki değerleri değiştirmediği, bunun yerineBadını sağdaki sonucunB = B + 3ile yeniden bağladığı anlamına gelir; bu yeni bir dizidir. Yerinde işlem içinB .+= 3kullanın (ayrıca bkz. dot operators), açık döngüler veyaInplaceOps.jlkullanabilirsiniz. - Julia, varsayılan değerleri her seferinde işlev çağrıldığında değerlendirir, Python'da ise varsayılan değerler yalnızca işlev tanımlandığında bir kez değerlendirilir. Örneğin,
f(x=rand()) = xişlevi, argüman olmadan her çağrıldığında yeni bir rastgele sayı döndürür. Öte yandan,g(x=[1,2]) = push!(x,3)işlevi,g()olarak her çağrıldığında[1,2,3]döndürür. - Julia'da anahtar argümanlar, genellikle Python'da olduğu gibi konum olarak geçilemeyecek şekilde anahtar kelimeler kullanılarak geçilmelidir. Bir anahtar argümanı konum olarak geçmeye çalışmak, yöntem imzasını değiştirir ve bu da bir
MethodErrorveya yanlış yöntemin çağrılmasına neden olur. - Julia'da
%kalanı bulma operatörüdür, Python'da ise modüldür. - Julia'da yaygın olarak kullanılan
Inttürü, makine tam sayı türüne (Int32veyaInt64) karşılık gelir; bu, Python'dakiint'in keyfi uzunlukta bir tam sayı olduğu anlamına gelir. Bu, Julia'daInttürünün taşma yapacağı anlamına gelir; örneğin2^64 == 0. Daha büyük değerlere ihtiyacınız varsa,Int128,BigIntgibi başka uygun bir tür veyaFloat64gibi bir kayan nokta türü kullanın. - Hayali birim
sqrt(-1)Julia'daimolarak, Python'da isejolarak temsil edilir. - Julia'da üstel alma operatörü
^'dir, Python'daki gibi**değil. - Julia
nothingtürüNothingkullanarak bir null değerini temsil ederken, PythonNonetürüNoneTypekullanır. - Julia'da, bir matris türü üzerindeki standart operatörler matris işlemleridir, oysa Python'da standart operatörler eleman bazında işlemlerdir. Hem
Ahem deBmatrisleri olduğunda, Julia'daA * Bmatris çarpımını gerçekleştirir, Python'daki gibi eleman bazında çarpım değil. Julia'dakiA * B, Python'dakiA @ Bile eşdeğerdir, oysa Python'dakiA * B, Julia'dakiA .* Bile eşdeğerdir. - Julia'daki
'adjoint operatörü, bir vektörün adjoint'ini (satır vektörünün tembel bir temsilini) döndürürken, Python'daki.Ttranspoze operatörü bir vektör üzerinde orijinal vektörü (işlem yapmayan) döndürür. - Julia'da bir fonksiyon birden fazla somut uygulama (metot olarak adlandırılır) içerebilir ve bu metotlar, çağrıdaki tüm argümanların türlerine dayalı olarak çoklu dağıtım (multiple dispatch) ile seçilir. Bu, Python'daki fonksiyonlardan farklıdır; çünkü Python'da tek bir uygulama vardır ve çok biçimlilik (polymorphism) yoktur (Python metot çağrıları ise farklı bir sözdizimi kullanır ve metot alıcısına göre dağıtım yapılmasına izin verir).
- Julia'da sınıf yoktur. Bunun yerine, veri içeren ancak yöntem içermeyen (değiştirilebilir veya değiştirilemez) yapılar vardır.
- Bir Python sınıf örneğinin bir yöntemini çağırmak (
x = MyClass(*args); x.f(y)) Julia'daki bir işlev çağrısına karşılık gelir, örneğinx = MyType(args...); f(x, y). Genel olarak, çoklu dispatch, Python sınıf sisteminden daha esnek ve güçlüdür. - Julia yapıları tam olarak bir soyut üst tipe sahip olabilirken, Python sınıfları bir veya daha fazla (soyut veya somut) üst sınıftan miras alabilir.
- Mantıksal Julia program yapısı (Paketler ve Modüller) dosya yapısından bağımsızdır, oysa Python kod yapısı dizinler (Paketler) ve dosyalar (Modüller) tarafından tanımlanır.
- Julia'da, büyük modüllerin metnini birden fazla dosyaya ayırmak, her dosya için yeni bir modül tanıtmak yerine, idiomatik bir yaklaşımdır. Kod,
includearacılığıyla ana dosyada tek bir modül içinde yeniden bir araya getirilir. Bunun Python'daki karşılığı (exec), bu kullanım için tipik değildir (önceki tanımları sessizce geçersiz kılacaktır), Julia programlarıusingveyaimportilemoduleseviyesinde bir birim olarak tanımlanır; bu, ilk ihtiyaç duyulduğunda yalnızca bir kez çalıştırılacaktır - Python'dakiincludegibi. Bu modüller içinde, o modülü oluşturan bireysel dosyalar, istenen sırada bir kez listeleyerekincludeile yüklenir. - Julia'daki
x > 0 ? 1 : -1ternary operatörü, Python'daki1 if x > 0 else -1koşullu ifadesine karşılık gelir. - Julia'da
@sembolü bir makroya, Python'da ise bir dekoratöre atıfta bulunur. - Julia'da istisna yönetimi
try—catch—finallykullanılarak yapılır,try—except—finallyyerine. Python'a kıyasla, Julia'da istisna yönetiminin normal iş akışının bir parçası olarak kullanılmasını önerilmez (Python ile karşılaştırıldığında, Julia sıradan kontrol akışında daha hızlıdır ancak istisna yakalamada daha yavaştır). - Julia döngüleri hızlıdır, performans nedenleriyle "vektörleştirilmiş" kod yazmaya gerek yoktur.
- Julia'da, özellikle sıkı döngülerde, sabit olmayan global değişkenlerle dikkatli olun. Julia'da (Python'ın aksine) metal seviyesine yakın kod yazabileceğiniz için, global değişkenlerin etkisi dramatik olabilir (bkz. Performance Tips).
- Julia'da yuvarlama ve kesme açıktır. Python'un
int(3.7)ifadesifloor(Int, 3.7)veyaInt(floor(3.7))olmalı veround(Int, 3.7)ifadesinden ayrılmaktadır.floor(x)veround(x)kendi başlarınaxile aynı türde bir tam sayı değeri döndürür, her zamanIntdöndürmez. - Julia'da ayrıştırma açıktır. Python'un
float("3.7")ifadesi Julia'daparse(Float64, "3.7")olur. - Python'da, çoğu değer mantıksal bağlamlarda kullanılabilir (örneğin,
if "a":ifadesi aşağıdaki bloğun çalıştırılacağı anlamına gelir, veif "":ifadesi bunun tersi). Julia'da iseBool'a açık bir dönüşüm gereklidir (örneğin,if "a"bir istisna fırlatır). Julia'da boş olmayan bir dizeyi test etmek istiyorsanız, açıkçaif !isempty("")yazmalısınız. Belki de şaşırtıcı bir şekilde, Python'daif "False"vebool("False")her ikisi deTrueolarak değerlendirilir (çünkü"False"boş olmayan bir dizedir); Julia'da iseparse(Bool, "false")falsedöner. - Julia'da, yeni bir yerel kapsam çoğu kod bloğu tarafından tanıtılır, döngüler ve
try—catch—finallydahil. Anlamanız gereken, Python ve Julia'da da yeni bir yerel kapsam tanıtan derlemelerin (liste, jeneratör vb.) yanı sıra,ifbloklarının her iki dilde de yeni bir yerel kapsam tanıtmadığıdır.
Noteworthy differences from C/C++
- Julia dizileri köşeli parantezlerle indekslenir ve birden fazla boyuta sahip olabilir
A[i,j]. Bu sözdizimi, C/C++'taki bir işaretçi veya adres referansı için sadece sözdizimsel bir şekerleme değildir. the manual entry about array construction bakın. - Julia'da dizilerin, stringlerin vb. indekslemesi 0 tabanlı değil, 1 tabanlıdır.
- Julia dizileri başka bir değişkene atandığında kopyalanmaz.
A = Bişleminden sonra,B'nin elemanlarını değiştirmekA'yı da değiştirecektir. Güncelleme operatörleri gibi+=yerinde çalışmaz, bunlarA = A + Bile eşdeğerdir ve sol taraftaki değişkeni sağ taraftaki ifadenin sonucuna yeniden bağlar. - Julia dizileri sütun öncelikli (Fortran sıralı) iken C/C++ dizileri varsayılan olarak satır öncelikli sıralıdır. Diziler üzerinde döngü kurarken optimal performans elde etmek için döngülerin sırası C/C++'a göre Julia'da tersine çevrilmelidir (bkz. relevant section of Performance Tips).
- Julia değerleri atandığında veya bir işleve geçirildiğinde kopyalanmaz. Bir işlev bir diziyi değiştirirse, değişiklikler çağıran yerde görünür olacaktır.
- Julia'da, boşluk karakterleri önemlidir, C/C++'ın aksine, bu nedenle bir Julia programına boşluk eklerken/çıkarırken dikkatli olunmalıdır.
- Julia'da, ondalık noktası olmayan literal sayılar (örneğin
42),Inttüründe işaretli tam sayılar oluşturur, ancak makine kelime boyutuna sığmayan çok büyük literal sayılar otomatik olarak daha büyük boyut türlerine yükseltilir, örneğinInt32iseInt64,Int128veya keyfi olarak büyükBigInttürüne. İşaretli ve/veya işaretsiz sayıları belirtmek içinL,LL,U,UL,ULLgibi sayısal literal son ekleri yoktur. Ondalık literal sayılar her zaman işaretlidir ve onaltılık literal sayılar (C/C++ gibi0xile başlayan) işaretsizdir, 128 bitten fazla kodladıklarında iseBigInttüründedirler. Onaltılık literal sayılar ayrıca, C/C++/Java'dan farklı olarak ve Julia'daki ondalık literal sayılardan farklı olarak, literalın uzunluğuna dayalı bir türe sahiptir, ön sıfırlar dahil. Örneğin,0x0ve0x00türüUInt8,0x000ve0x0000türüUInt16'dır, ardından 5 ile 8 onaltılık basamağa sahip literal sayılarUInt32türünde, 9 ile 16 onaltılık basamağa sahip olanlarUInt64türünde, 17 ile 32 onaltılık basamağa sahip olanlarUInt128türünde ve 32'den fazla onaltılık basamağa sahip olanlarBigInttüründedir. Bu, onaltılık maskeleri tanımlarken dikkate alınmalıdır; örneğin~0xf == 0xf0,~0x000f == 0xfff0'dan çok farklıdır. 64 bitFloat64ve 32 bitFloat32bit literal sayıları sırasıyla1.0ve1.0f0olarak ifade edilir. Ondalık noktalı literal sayılar, tam olarak temsil edilemeyecekleri durumlarda yuvarlanır (veBigFloattürüne yükseltilmez). Ondalık noktalı literal sayılar, C/C++'a daha yakın bir davranış sergiler. Sekizli (ön ek0oile) ve ikili (ön ek0bile) literal sayılar da işaretsiz olarak (veya 128 bitten fazla içinBigIntolarak) işlenir. - Julia'da bölme operatörü
/her iki operandın da tam sayı türünde olduğu durumlarda bir ondalık sayı döndürür. Tam sayı bölmesi yapmak içindivveya÷kullanın. - Bir
Array'ı ondalık sayı türleriyle dizinlemek genellikle Julia'da bir hatadır. C ifadesia[i / 2]'nin Julia eşdeğeria[i ÷ 2 + 1]'dir; buradaitam sayı türündedir. - Dize dizeleri ya
"ya da"""ile sınırlanabilir,"""ile sınırlanan dizeler,"karakterlerini alıntı yapmadan içerebilir, örneğin"\""gibi. Dize dizeleri, diğer değişkenlerin veya ifadelerin değerlerini içerebilir, bu da$değişkenadıveya$(ifade)ile gösterilir; bu, değişken adını veya ifadeyi fonksiyonun bağlamında değerlendirir. //birRationalnumarasını belirtir ve tek satırlık bir yorum değildir (bu Julia'da#ile gösterilir)#=çok satırlı bir yorumun başlangıcını belirtir ve=#onu bitirir.- Julia'da fonksiyonlar, son ifadelerinden veya
returnanahtar kelimesinden değer döndürür. Birden fazla değer, fonksiyonlardan döndürülebilir ve demetler olarak atanabilir; örneğin,(a, b) = myfunction()veyaa, b = myfunction()şeklinde, C/C++'da olduğu gibi değerlerin işaretçilerini geçmek zorunda kalmadan (yania = myfunction(&b)). - Julia, ifadelerin sonunu bitirmek için noktalı virgül kullanımını gerektirmez. İfadelerin sonuçları otomatik olarak yazdırılmaz (etkileşimli istemde, yani REPL'de hariç) ve kod satırlarının noktalı virgülle bitmesi gerekmez.
printlnveya@printfbelirli bir çıktıyı yazdırmak için kullanılabilir. REPL'de, çıktı bastırmak için;kullanılabilir.;ayrıca[ ]içinde farklı bir anlama sahiptir, bu yüzden dikkatli olunmalıdır.;tek bir satırda ifadeleri ayırmak için kullanılabilir, ancak birçok durumda kesinlikle gerekli değildir ve daha çok okunabilirliğe yardımcıdır. - Julia'da
⊻(xor) operatörü bit düzeyinde XOR işlemi gerçekleştirir, yani C/C++'da^şeklindedir. Ayrıca, bit düzeyindeki operatörlerin C/C++ ile aynı önceliğe sahip olmadığını unutmayın, bu nedenle parantez kullanmak gerekebilir. - Julia'nın
^üstel alma (pow) işlemi yapar, C/C++'daki bit düzeyinde XOR işlemi değil (Julia'da⊻veyaxorkullanın) - Julia'nın iki sağa kaydırma operatörü vardır,
>>ve>>>.>>aritmetik kaydırma yapar,>>>ise her zaman mantıksal kaydırma yapar; C/C++'da ise>>operatörünün anlamı kaydırılan değerin türüne bağlıdır. - Julia'nın
->ifadesi anonim bir fonksiyon oluşturur, bir üye işaretçisine erişmez. - Julia parantez gerektirmez
ififadeleri veyafor/whiledöngüleri yazarken:for i in [1, 2, 3]yerinefor (int i=1; i <= 3; i++)veif i == 1yerineif (i == 1)kullanın. - Julia,
0ve1sayılarını Boolean olarak değerlendirmez. Julia'daif (1)yazamazsınız, çünküififadeleri yalnızca boolean değerleri kabul eder. Bunun yerineif true,if Bool(1)veyaif 1==1yazabilirsiniz. - Julia, koşul bloklarının, döngü bloklarının ve fonksiyonların sonunu belirtmek için
endkullanır, örneğinif,while/for. Tek satırlıkif ( cond ) statementyerine, Juliaif cond; statement; end,cond && statementve!cond || statementbiçimindeki ifadeleri kabul eder. Son iki sözdizimindeki atama ifadeleri, operatör önceliği nedeniyle açıkça parantez içine alınmalıdır, örneğincond && (x = value). - Julia'nın satır devam ettirme sözdizimi yoktur: bir satırın sonunda, şu ana kadar olan girdi tam bir ifade ise, tamamlanmış olarak kabul edilir; aksi takdirde girdi devam eder. Bir ifadeyi devam ettirmeyi zorlamanın bir yolu, onu parantez içine almaktır.
- Julia makroları, programın metni yerine ayrıştırılmış ifadeler üzerinde çalışır, bu da onlara Julia kodunun karmaşık dönüşümlerini gerçekleştirme imkanı tanır. Makro adları
@karakteri ile başlar ve hem işlev benzeri bir sözdizimine,@mymacro(arg1, arg2, arg3), hem de ifade benzeri bir sözdizimine,@mymacro arg1 arg2 arg3, sahiptir. Bu formlar birbirinin yerine geçebilir; işlev benzeri form, makro başka bir ifadede yer aldığında özellikle kullanışlıdır ve genellikle en net olanıdır. İfade benzeri form, dağıtılmışforyapısı gibi blokları notlandırmak için sıklıkla kullanılır:@distributed for i in 1:n; #= body =#; end. Makro yapısının sonunun belirsiz olduğu durumlarda, işlev benzeri formu kullanın. - Julia bir enum türüne sahiptir, bu tür
@enum(isim, deger1, deger2, ...)makrosu kullanılarak ifade edilir. Örneğin:@enum(Meyve, muz=1, elma, armut) - Gelenek olarak, argümanlarını değiştiren fonksiyonların adının sonunda
!bulunur, örneğinpush!. - C++'da, varsayılan olarak statik dağıtım vardır, yani dinamik dağıtım elde etmek için bir fonksiyonu sanal olarak işaretlemeniz gerekir. Öte yandan, Julia'da her yöntem "sanal"dır (ancak bu, yöntemlerin yalnızca
thisüzerinde değil, her argüman türü üzerinde en özel bildirim kuralına göre dağıtıldığı için daha genel bir durumdur).
Julia ⇔ C/C++: Namespaces
C/C++
namespace'leri, yaklaşık olarak Juliamodüllerine karşılık gelir.Julia'da özel global veya alan yoktur. Her şey, istenirse göreli yollarla (veya tam nitelikli yollarla) kamuya açık bir şekilde erişilebilir.
MyNamespace::myfun(C++) yaklaşık olarakimport MyModule: myfun(Julia) ile karşılık gelir.using namespace MyNamespace(C++) yaklaşık olarakusing MyModule(Julia) ile eşdeğerdir.- Julia'da yalnızca
exportedilen semboller çağrılan modüle sunulur. - C++'da yalnızca dahil edilen (kamusal) başlık dosyalarında bulunan öğeler kullanılabilir hale gelir.
- Julia'da yalnızca
Uyarı:
import/usinganahtar kelimeleri (Julia) ayrıca modülleri yükler (aşağıya bakın).Uyarı:
import/using(Julia) yalnızca global kapsam düzeyinde (moduleler) çalışır.- C++'da
using namespace Xherhangi bir kapsamda (örneğin: fonksiyon kapsamı) çalışır.
- C++'da
Julia ⇔ C/C++: Module loading
C/C++ "kütüphane" düşündüğünüzde, muhtemelen bir Julia "paket" arıyorsunuzdur.
- Uyarı: C/C++ kütüphaneleri genellikle birden fazla "yazılım modülü" barındırırken, Julia "paketleri" genellikle bir tane barındırır.
- Hatırlatma: Julia
modülleriküresel kapsamdır (mutlaka "yazılım modülleri" değildir).
Yerine build/
makebetikleri, Julia "Proje Ortamları" kullanır (bazen "Proje" veya "Ortam" olarak adlandırılır).- Yapı betikleri yalnızca daha karmaşık uygulamalar için gereklidir (C/C++ yürütülebilir dosyaları derlemeyi veya indirmeyi gerektirenler gibi).
- Julia'da bir uygulama veya proje geliştirmek için, kök dizinini "Proje Ortamı" olarak başlatabilir ve uygulamaya özgü kod/paketleri burada barındırabilirsiniz. Bu, proje bağımlılıkları üzerinde iyi bir kontrol sağlar ve gelecekteki yeniden üretilebilirliği artırır.
- Mevcut paketler,
Pkg.add()fonksiyonu veya Pkg REPL modu ile bir "Proje Ortamı"na eklenir. (Bu, söz konusu paketi yüklemez). - "Proje Ortamı" için mevcut paketlerin (doğrudan bağımlılıklar) listesi
Project.tomldosyasında kaydedilmiştir. - "Proje Ortamı" için tam bağımlılık bilgisi,
Pkg.resolve()tarafından otomatik olarak oluşturulur veManifest.tomldosyasına kaydedilir.
"Proje Ortamı"na mevcut olan paketler ("yazılım modülleri")
importveyausingile yüklenir.- C/C++'de, nesne/fonksiyon bildirimlerini almak için
#include <moduleheader>kullanırsınız ve çalıştırılabilir dosyayı oluşturduğunuzda kütüphaneleri bağlarsınız. - Julia'da,
using/importkomutunu tekrar çağırmak, mevcut modülü kapsam içine alır, ancak onu tekrar yüklemez (C/C++'da standart dışı#pragma onceeklemeye benzer).
- C/C++'de, nesne/fonksiyon bildirimlerini almak için
Dizin tabanlı paket depoları (Julia),
Base.LOAD_PATHdizisine depo yolları eklenerek kullanılabilir hale getirilebilir.- Dizin tabanlı depolardan gelen paketler,
importveyausingile yüklenmeden öncePkg.add()aracını gerektirmez. Onlar, projeye basitçe mevcuttur. - Dizin tabanlı paket depoları, "yazılım modülleri" için yerel kütüphaneler geliştirmek için en hızlı çözümdür.
- Dizin tabanlı depolardan gelen paketler,
Julia ⇔ C/C++: Assembling modules
C/C++'de,
.c/.cppdosyaları derlenir ve build/makebetikleri ile bir kütüphaneye eklenir.- Julia'da
import [PkgName]/using [PkgName]ifadeleri, bir paketin[PkgName]/src/alt dizininde bulunan[PkgName].jldosyasını yükler. - Sırasıyla,
[PkgName].jlgenellikleinclude "[someotherfile].jl"çağrıları ile ilişkili kaynak dosyaları yükler.
- Julia'da
include "./path/to/somefile.jl"(Julia)#include "./path/to/somefile.jl"(C/C++) ile çok benzer.- Ancak
include "..."(Julia) başlık dosyalarını dahil etmek için kullanılmaz (gerekli değildir). - Diğer "yazılım modüllerinden" kod yüklemek için
include "..."(Julia) kullanmayın (bunun yerineimport/usingkullanın). include "path/to/some/module.jl"(Julia) aynı isimlere sahip farklı türler (vb.) oluşturarak kodun aynı versiyonlarını farklı modüllerde başlatır.include "somefile.jl"genellikle birden fazla dosyayı aynı Julia paketi ("yazılım modülü") içinde bir araya getirmek için kullanılır. Bu nedenle, dosyaların yalnızca bir kezincludeedilmesini sağlamak oldukça basittir (No#ifdefkarışıklığı).
- Ancak
Julia ⇔ C/C++: Module interface
C++ "public"
.h/.hppdosyaları kullanarak arayüzleri açarken, Juliamodülleri kullanıcıları için tasarlanmış belirli sembolleripublicveyaexportolarak işaretler.- Sıklıkla, Julia
modülleri mevcut fonksiyonlara (örneğin:Base.push!) yeni "metotlar" ekleyerek işlevsellik katmaktadır. - Julia paketlerinin geliştiricileri bu nedenle arayüz belgeleri için başlık dosyalarına güvenemezler.
- Julia paketleri için arayüzler genellikle docstring'ler, README.md, statik web sayfaları vb. kullanılarak tanımlanır...
- Sıklıkla, Julia
Bazı geliştiriciler, paketlerini/modüllerini kullanmak için gereken tüm sembolleri
exportetmeyi tercih etmez, ancak yine de dışa aktarılmayan kullanıcıya yönelik sembolleripublicolarak işaretlemelidir.- Kullanıcıların bu bileşenlere, işlevleri/yapıları/... paket/modül adıyla nitelendirerek erişmeleri beklenebilir (örneğin:
MyModule.run_this_task(...)).
- Kullanıcıların bu bileşenlere, işlevleri/yapıları/... paket/modül adıyla nitelendirerek erişmeleri beklenebilir (örneğin:
Julia ⇔ C/C++: Quick reference
| Software Concept | Julia | C/C++ |
|---|---|---|
| unnamed scope | begin ... end | { ... } |
| function scope | function x() ... end | int x() { ... } |
| global scope | module MyMod ... end | namespace MyNS { ... } |
| software module | A Julia "package" | .h/.hpp files<br>+compiled somelib.a |
| assembling<br>software modules | SomePkg.jl: ...<br>import("subfile1.jl")<br>import("subfile2.jl")<br>... | $(AR) *.o ⇒ somelib.a |
| import<br>software module | import SomePkg | #include <somelib><br>+link in somelib.a |
| module library | LOAD_PATH[], *Git repository,<br>**custom package registry | more .h/.hpp files<br>+bigger compiled somebiglib.a |
- The Julia package manager supports registering multiple packages from a single Git repository.<br> * This allows users to house a library of related packages in a single repository.<br> ** Julia registries are primarily designed to provide versioning \& distribution of packages.<br> ** Custom package registries can be used to create a type of module library.
Noteworthy differences from Common Lisp
Julia, varsayılan olarak diziler için 1 tabanlı indeksleme kullanır ve ayrıca keyfi index offsets değerlerini de işleyebilir.
Fonksiyonlar ve değişkenler aynı ad alanını paylaşır (“Lisp-1”).
Pairtürü vardır, ancak buCOMMON-LISP:CONSolarak kullanılmak üzere tasarlanmamıştır. Çoğu dil bölümünde birbirinin yerine kullanılabilen çeşitli yinelemeli koleksiyonlar mevcuttur (örneğin splatting, tuple'lar vb.).Tuplelar, heterojen öğelerin kısa koleksiyonları için Common Lisp listelerine en yakın olanlardır. Alist'lerin yerineNamedTuple'lar kullanın. Homojen türlerin daha büyük koleksiyonları içinArrayveDictkullanılmalıdır.Tipik Julia iş akışı, Revise.jl paketi ile uygulanan görüntünün sürekli manipülasyonunu da kullanır.
Performans için, Julia işlemlerin type stability olmasını tercih eder. Common Lisp, temel makine işlemlerinden soyutlanırken, Julia onlara daha yakın durur. Örneğin:
Tam sayılarla bölme
/her zaman bir kesirli sonuç döndürür, hesaplama tam olsa bile.//her zaman rasyonel bir sonuç döner÷her zaman (kısmı) tam sayı sonucu döner
Bignum'lar desteklenmektedir, ancak dönüşüm otomatik değildir; sıradan tam sayılar overflow.
Karmaşık sayılar desteklenmektedir, ancak karmaşık sonuçlar almak için you need complex inputs.
Birden fazla Karmaşık ve Rasyonel türü vardır, farklı bileşen türleri ile.
Modüller (ad alanları) hiyerarşik olabilir.
importveusingçift rol oynar: kodu yükler ve onu ad alanında kullanılabilir hale getirir. Sadece modül adı içinimportmümkündür (kabacaASDF:LOAD-OPile eşdeğerdir). Slot adlarının ayrı olarak dışa aktarılmasına gerek yoktur. Küresel değişkenlere modül dışından atama yapılamaz (sadeceeval(mod, :(var = val))ile bir kaçış yolu olarak).Makrolar
@ile başlar ve Common Lisp kadar dilin içine entegre edilmemiştir; dolayısıyla, makro kullanımı ikincisinde olduğu kadar yaygın değildir. macros için bir tür hijyen dil tarafından desteklenmektedir. Farklı yüzey sözdizimi nedeniyle,COMMON-LISP:&BODYile eşdeğer bir şey yoktur.Tüm fonksiyonlar genel olup çoklu dağıtım kullanır. Argüman listeleri aynı şablonu takip etmek zorunda değildir, bu da güçlü bir deyimle sonuçlanır (bkz.
do). İsteğe bağlı ve anahtar kelime argümanları farklı şekilde işlenir. Yöntem belirsizlikleri, Common Lisp Nesne Sistemi'nde olduğu gibi çözülmez, bu da kesişim için daha spesifik bir yöntemin tanımlanmasını gerektirir.Semboller herhangi bir pakete ait değildir ve kendiliğinden herhangi bir değer içermez.
M.varsembolüMmodülündevarsembolünü değerlendirir.A functional programming style is fully supported by the language, including closures, but isn't always the idiomatic solution for Julia. Some workarounds may be necessary for performance when modifying captured variables.