2013-04-01 19 views
7

Bir koşullu işlev için, APL lehçelerinin herhangi birinde bir sembol veya iyi bilinen bir deyim var mı?Koşullu işlev APL'de

Eminim ki bir şey kaçırmıyorum, çünkü bu temel bir dil öğesi. Diğer dillerde koşullu operatör olarak adlandırılır, ancak burada bir terimden kaçınacağım, çünkü bir APL operatörü tamamen farklı bir şey.

örnek C için

ve arkadaşları x ? T : F
LISPs (if x T F)
Python vb T if x else F
ve sahip olması gerekir.

Modern APL'lerin :If ve arkadaşlarına sahip olduğunu biliyorum, ancak bunlar program akışını kontrol etmek için zorunlu ifadelerdir: bir değer döndürmezler, bir ifadede kullanılamazlar ve kesinlikle boole dizilerine uygulanamazlar. Tamamen farklı bir amacı var, bu benim için iyi.

Ben işlevsel bir seçim yapmak ile gelebilir sadece iyi ifade özellikle steno veya bana okunabilir görünmüyor (F T)[⎕IO+x] olduğunu bile diziler üzerinde, işi alır rağmen:

 ('no' 'yes')[⎕IO+(⍳5)∘.>(⍳5)] 
no no no no no 
yes no no no no 
yes yes no no no 
yes yes yes no no 
yes yes yes yes no 

Ben kadrosunu kullanarak benzer bir ifade ile geldim, ama booleans dizileri üzerinde sefil başarısız oldu. Yapabilseydim bile, ⎕IO veya kodlanmış bir 1 gömmek zorundaydı, ki bu da okunabilirlik söz konusu olduğunda daha da kötü.

Devam etmeden ve kendi if'u tanımlamadan önce ve yazacağım her programda kullanmadan önce, bu konuda herhangi bir kanon var mı? Açık bir fonksiyon veya operatör eksik mi?

(SO üzerinde herhangi APL programcıları var mı? :-)

cevap

8

Evet, APL programcılar vardır üzerinde SO (ama çok değil!).

Bunun cevabı, bunun bir standart olmaması. Yukarıdaki gibi

x⊃f t 

Ben indeksleme kullanmak Boole dizisi için olsa: Ben "almak" kullandığımız bir sayıl çözüm için

,

f t[x] 

Hep endeks kökeni sıfır kullanın böylece 1 eklemeye gerek yoktur ve parense ihtiyaç yoktur.

Bunlar yeterince basit değilse, bunları "if" adlı bir işlevle örtmeniz gerektiğini düşünüyorum. Bu, doğru ve yanlış olanı, belki de daha doğal bir düzende ortaya koyacaktır. Bunlarla

+0

teşekkür ederiz Genelde

Vb a b c ilgili dillerin ifadeleri APL ifadesi ise. sıfırda endeks kökenli bana anlamda bir çok yapar bu yüzden, bir C alt yapıdan gelir ama "APL şekilde" karşı gelmek istemiyordu Iverson kağıtları – Tobia

+0

Ton kökenini sıfır boyunca varsayalım. Ne yaptığınızı basitleştiriyorsa geçerli bir seçimdir. –

8

sorun:

(f t)[x] 
x⌷f t 
x⊃f t 

t ve f hem değerlendirdi etsin.Eğer kısa devre, yapılacak tek şey istiyorsanız

, sen korumaları kullanabilirsiniz:

{x:t ⋄ f} 

Bu bir C-benzeri dilinde

if (x) { 
    return t; 
} 
f; 

eşdeğerdir.

+3

Güzel. Bu Dyalog'a özgü, değil mi? – Tobia

+2

Evet. Hangi APL uygulamasını kullanıyorsunuz? – ngn

+0

er saçma bir soru. Tek bir astar gerekli mi? (evet, bunun APL olduğunu biliyorum), ancak her iki işlevi de yürütmeyi önlemek istiyorsanız, basit bir koşullu yürütme ile neyin yanlış olduğunu. Gibi bir şey (üzgünüm ben APL klavye yok): ... yürütmek (some_boolean)/'f' yürütmek (~ some_boolean)/'t' netlik günah değil! Ben böyle bir şey almaya çalışırken benim vim-apl hatayı düzeltmeye sonra – RFlack

2

C'nin üçlü operatörü ? : gibi bir şey yaptım ve bir sonuç döndürdü, yaşlı mı yaşlı deyim şuydu: Bu menşe 0 için yazılmıştır ve -3 3 çevresinde parens olduklarını

r←⍎(¯3 3)[x=42]↑'6×8 ⋄ 6×7' 

Not orada açıklık için.

x = 42 sıfıra eşit veya sıfır olarak değerlendirir, bu cevaba bağlı olarak -3 veya 3 seçeriz ve böylece ilk 3 öğeyi ("6x8") veya son 3 öğeyi ("6x7") seçer ve yürütün dize. Elmas decoration sadece dekorasyon için orada. kontrol yapısı formu bir sonuç döndürmez, buna rağmen başka avaiable: eğer:

Tabii

biri olsaydı biri muhtemelen bu şekilde kod olmaz demek.

+0

Bu biraz dağınık değil mi? (Char vektörlerinin uzunluklarını saymaktan nefret ediyorum!). Burada APL klavye yok ama bir götürürler RARg olarak iki karakter vektörlerin iç içe geçmiş bir dizi kullanamadı? OP'nin cevabının bana tamamen açık olmayan içeriğe bağlı olduğundan şüpheleniyorum. – RFlack

+0

Gördüm veya kullanılmış son kez bu bir ya da başka (Sharp veya STSC) devre mülk sistemi üzerinde etrafında 1979 idi. İç içe diziler o zaman mevcut değildi. – Lobachevsky

2

Dyalog APL size kullanabilirsiniz: Fikir uyguladığını

'value if true' (⊣⍣condition) 'value if false' 

(sol tack - her zaman sol argümanı döndürür doğru argüman kenara atar) 0 veya 1 (yanlış için) ya (için doğru) zamanlar - doğru argüman için. Yani, eğer 0 uygulandıysa (yani hiç değilse), doğru argüman değiştirilmez, ancak eğer uygulanırsa (bir defa), sol argüman uygulanır. Ör:

 a b←3 5 
     Conditional←⊣⍣(a=b) 
     'match' Conditional 'different' 
different 
     a b←4 4 
     Conditional←⊣⍣(a=b) 
     'match' Conditional 'different' 
match 

veya

 Cond←{⍺(⊣⍣⍺⍺)⍵} 
     bool←a=b 
     'match'(bool Cond)'different' 
match 
+0

İkinci sonuç "eşleşme" olmamalı mı? – Uriel

+0

@Uriel Evet, teşekkürler. –

0

Bu, ben buna hiçbir standart cevabı yoktur nedeni APL ile yapmak şeyler için, aslında daha az ihtiyaç olduğu bir ortak soru düşünüyorum edilir diğer dillerden daha. sözü

, bazen bu işlevi kullanıyor ihtiyacı vardı ve yolu ben GNU APL bir IFELSE operatörü uygulamak edilir:

∇Z ← arg (truefn IFELSE falsefn) condition ;v 
    v←⍬ 
    →(0=⎕NC 'arg')/noarg 
    v←arg 
noarg: 
    →condition/istrue 
    Z←falsefn v 
    →end 
istrue: 
    Z←truefn v 
end: 
∇ 

işlevi aşağıdaki gibi çağrılabilir:

 3 {'expression is true' ⍵} IFELSE {'was false' ⍵} 0 
was false 3 

Bu özel uygulama, sol taraftaki argümana bu maddeye olarak geçer, çünkü bu bazen kullanışlı olabilir. Sol bir argüman olmadan 'dan geçer.

0

APL ifadesi:

(1+x=0)⌷y z 

x?y:z 

C dili eşdeğer olmalıdır Ve diğerleri

x<=0?y:z 
için

(1+x>0)⌷y z 

(1+~a)⌷b c 

O C dilinde eşdeğer olmalıdır:

a?b:c