(~!)(!)((~)~*):((!)~^)*(:^)(~(!)~^(~)~*)(()~(~)~^~*)
Çevrimiçi deneyin! (programın bölümlerini tanımlayan bir testsuite ve metin içerir)
Bu çok düşük seviye bir esolang için şaşırtıcı derecede iyi puanlar. (Kilise rakamları, Church booleans, vb. Bu nedenle Underload'da çok yaygın olarak kullanılır; dilin yerleşik sayıları ve boole'ları yoktur ve bu onları simüle etmenin en kolay yollarından biridir. Boole'ları 0 ve 1 Kilisesi rakamları olarak kodlayın.)
Kafası karışan herkes için: Düşük yük, yeniden kullanılabilir işlevleri tanımlamanıza izin verir, ancak normal şekilde adlandırmanıza izin vermez, yalnızca argüman yığında kayarlar. tanımladıysanız, beş argüman alan ve beşincisini çağıran yeni bir fonksiyon yazmanız gerekir, ardından yetersiz argümanlarla çağırınız, böylece kullanmak için yedek argümanlar arar). Onları çağırmak, varsayılan olarak onları yok eder, ancak aramayı tahribatsız hale getirecek şekilde değiştirebilirsiniz (basit durumlarda, kopyalara aradığınızdan emin olmanız gerekir, çünkü karmaşık durumlar daha yaygındır). yığında yolunuzu alamadım), bu nedenle Underload'ın işlev desteği sorudan ihtiyacımız olan tüm gereksinimleri içeriyor.
açıklama
doğru
(~!)
( ) Define function:
~ Swap arguments
! Delete new first argument (original second argument)
Bu oldukça basittir; istemediğimiz argümandan kurtuluyoruz ve istediğimiz argüman sadece orada kalıyor, dönüş değeri olarak hizmet ediyor.
yanlış
(!)
( ) Define function:
! Delete first argument
Bu daha basit.
değil
((~)~*)
( ) Define function:
~* Modify first argument by pre-composing it with:
(~) Swap arguments
Bu eğlenceli: not
argümanını hiç çağırmıyor, sadece bir fonksiyon kompozisyonu kullanıyor. Bu, Underload'da, verilerinizi hiç denetlemediğiniz, hünerlerini önceden oluşturup yazdıktan sonra işleyiş biçimini değiştirdiğiniz ortak bir numaradır. Bu durumda, çalıştırmadan önce argümanlarını değiştirme fonksiyonunu değiştiririz ki bu, bir Kilise rakamını açıkça olumsuzlar.
ve
:((!)~^)*
( ) Define function:
~^ Execute its first argument with:
(!) false
{and implicitly, our second argument}
* Edit the newly defined function by pre-composing it with:
: {the most recently defined function}, without destroying it
Soru, fonksiyonların diğer fonksiyonlar açısından tanımlanmasına izin verir. "Ve" sıradakileri tanımlarız, çünkü en yakın zamanda "değil" tanımlanırsa, onu kullanmak daha kolay olur. (Bu bizim puanımızdan çıkarılmaz, çünkü biz hiç "değil" olarak adlandırmıyoruz, ancak tanımı tekrar yazarken baytları kurtarıyor. ancak en son tanımlananlar çok fazla bayta mal olur.)
Buradaki tanım and x y = (not x) false y
. Başka bir deyişle, eğer not x
öyleyse geri döneriz false
; Aksi takdirde geri döneriz y
.
veya
(:^)
( ) Define function:
: Copy the first argument
^ Execute the copy, with arguments
{implicitly, the original first argument}
{and implicitly, our second argument}
@Nitrodon, yorumlardan or x y = x x y
normalde daha kısa or x y = x true y
ve Underload'da da doğru çıktığını belirtti. Bunun saf bir uygulaması olacaktır (:~^)
, ancak orijinal ilk argümanı mı yoksa bir kopyasını da mı çalıştırdığımızın bir önemi olmadığını belirterek ek bir bayttan golf oynayabiliriz, sonuç her iki şekilde de aynıdır.
Düşük yük aslında normal anlamda körelmeyi desteklemez, ancak bunun gibi tanımlamalar göründüğü gibi görünmesini sağlar! (İşin püf noktası, tüketilmeyen argümanların etrafta sadık kalmasıdır, bu nedenle çağırdığınız işlev onları kendi argümanları olarak yorumlar.)
ima
(~(!)~^(~)~*)
( ) Define function:
~ Swap arguments
~^ Execute the new first (original second) argument, with argument:
(!) false
{and implicitly, our second argument}
(~)~* Run "not" on the result
Burada kullanılan tanım implies x y = not (y false x)
. Y Bu basitleştirir, doğruysa not false
yani true
. Eğer y yanlış ise, bu basitleştirir not x
, böylece bize istediğimiz doğruluk tablosunu verir.
Bu durumda, not
bu kez referans vermek yerine kodunu yeniden yazarak tekrar kullanıyoruz . Doğrudan (~)~*
etrafına parantez olmadan yazılmıştır , bu nedenle tanımlanmak yerine çağrılır.
xor
(()~(~)~^~*)
( ) Define function:
~ ~^ Execute the first argument, with arguments:
(~) "swap arguments"
() identity function
~* Precompose the second argument with {the result}
Bu sefer iki argümanımızdan sadece birini değerlendiriyoruz ve ikinci argüman üzerinde ne yazacağımızı belirlemek için kullanıyoruz. Underload, arity ile hızlı ve gevşek oynamanıza izin veriyor, bu yüzden iki iki argüman iki dönüşlü fonksiyon arasında seçim yapmak için ilk argümanı kullanıyoruz; ikisini de ancak tam tersi sırayla döndüren argüman değişkeni ve ikisini de aynı sırayla döndüren kimlik işlevi.
İlk argüman doğruysa, bu nedenle çalıştırmadan önce argümanlarını değiştiren, yani "takas argümanları" ile önceden oluşturulan, yani ikinci argümanın düzenlenmiş bir versiyonunu üretiyoruz not
. Yani gerçek bir birinci argüman not
, ikinci argümanı döndürdüğümüz anlamına gelir . Öte yandan, sahte bir ilk argüman, kimlik işlevi ile oluşturduğumuz anlamına gelir, yani hiçbir şey yapmazsınız. Sonuç bir uygulamasıdır xor
.