BlockScript - 535
{[B':=?0:B';=?0:B'}=?0:B'{=?,A!,A!d1c&:B'?=?,A!,A!2e&:B''=?,,A!d3c&:B{[B'0<?0:B
'9>?0:1}!?B'0-{[,g!?c'0-B10*d+A!:Bd]A!d3c&}!:B'#=?{[,10=?,]A!:A!}!:,A!Bb&}{[AC[
B]DB?[AB{[Bh&hbhn!}{[B[AB]C?1-eA!:b}&[C1=?E[C]FHc&B!:C2=?{G?D:E[C}!FHcI!:C3=?E[
C]B!:C'!=?G[ABC]Hc&dbh&D?b@I!B!:b@I!:C'&=?HB!:C'@=?FGDI!:C'[=?GF&HDI!:C']=?F[A]
HDI!:C',=?,B!:C'.=?G.FHDI!:C'a'z{[DC<?0:DB>?0:1}!?Ce-HA!B!:C'A'Ze!?F[B]Cg-dA!B!
:{C'+=?{[CB+}:C'-=?{[CB-}:C'*=?{[CB*}:C'/=?{[CB/}:C'%=?{[CB%}:C'<=?{[CB<}:C'>=?
{[CB>}:C'==?{[CB=}:0}!?H[A][B]Ge!B!:FHDI!:c},c!0ac&0&0&0bho!;
BlockScript, özellikle bu zorluk için yarattığım önemsiz bir spagetti yığını tabanlı dildir. Temel tercüman blockscript.c'dir .
Örnek program (ilk 15 Fibonacci numarasını yazdırır):
{[B?B10/A!B10%d&:0}
{[B0<?'-.0B-A!:{B?Bh!{[B?B[A]A!B[B]'0+.:}!:'0.}!10.}
{[B?Dd!DC+B1-CecA!:}
0 1 15d!
;
Tercüman, hem kaynak kodu hem de program girişini bu sırada standart girdiden okur. Bu, bir tercüman içinde bir tercüman içinde bir tercüman çalıştırmak, sadece kopyalayıp yapıştırmak anlamına gelir:
# Level 1
{[B':=?0:B';=?0:B'}=?0:B'{=?,A!,A!d1c&:B'?=?,A!,A!2e&:B''=?,,A!d3c&:B{[B'0<?0:B
'9>?0:1}!?B'0-{[,g!?c'0-B10*d+A!:Bd]A!d3c&}!:B'#=?{[,10=?,]A!:A!}!:,A!Bb&}{[AC[
B]DB?[AB{[Bh&hbhn!}{[B[AB]C?1-eA!:b}&[C1=?E[C]FHc&B!:C2=?{G?D:E[C}!FHcI!:C3=?E[
C]B!:C'!=?G[ABC]Hc&dbh&D?b@I!B!:b@I!:C'&=?HB!:C'@=?FGDI!:C'[=?GF&HDI!:C']=?F[A]
HDI!:C',=?,B!:C'.=?G.FHDI!:C'a'z{[DC<?0:DB>?0:1}!?Ce-HA!B!:C'A'Ze!?F[B]Cg-dA!B!
:{C'+=?{[CB+}:C'-=?{[CB-}:C'*=?{[CB*}:C'/=?{[CB/}:C'%=?{[CB%}:C'<=?{[CB<}:C'>=?
{[CB>}:C'==?{[CB=}:0}!?H[A][B]Ge!B!:FHDI!:c},c!0ac&0&0&0bho!;
# Level 2
{[B':=?0:B';=?0:B'}=?0:B'{=?,A!,A!d1c&:B'?=?,A!,A!2e&:B''=?,,A!d3c&:B{[B'0<?0:B
'9>?0:1}!?B'0-{[,g!?c'0-B10*d+A!:Bd]A!d3c&}!:B'#=?{[,10=?,]A!:A!}!:,A!Bb&}{[AC[
B]DB?[AB{[Bh&hbhn!}{[B[AB]C?1-eA!:b}&[C1=?E[C]FHc&B!:C2=?{G?D:E[C}!FHcI!:C3=?E[
C]B!:C'!=?G[ABC]Hc&dbh&D?b@I!B!:b@I!:C'&=?HB!:C'@=?FGDI!:C'[=?GF&HDI!:C']=?F[A]
HDI!:C',=?,B!:C'.=?G.FHDI!:C'a'z{[DC<?0:DB>?0:1}!?Ce-HA!B!:C'A'Ze!?F[B]Cg-dA!B!
:{C'+=?{[CB+}:C'-=?{[CB-}:C'*=?{[CB*}:C'/=?{[CB/}:C'%=?{[CB%}:C'<=?{[CB<}:C'>=?
{[CB>}:C'==?{[CB=}:0}!?H[A][B]Ge!B!:FHDI!:c},c!0ac&0&0&0bho!;
# Level 3
{[B?B10/A!B10%d&:0}
{[B0<?'-.0B-A!:{B?Bh!{[B?B[A]A!B[B]'0+.:}!:'0.}!10.}
{[B?Dd!DC+B1-CecA!:}
0 1 15d!
;
Inception filmi gibi, üç seviyeden daha derine inemezsiniz. Bu zaman meselesi değil, mekan. BlockScript, belleği bolca sızdırıyor ve bunun dilin kendisinin nasıl tasarlandığı ile ilgili.
Dil referansı:
Tercümanı buraya getir
BlockScript'te "yığın", alıştığınız gibi sonraki işlemler tarafından üzerine yazılmış bir dizi değildir. Aslında değişmez bir bağlantılı liste olarak uygulanır ve program süresince bir yığın devam eder. Ayrıca, operatör yok (hariç@
) yığıntan değerleri kaldırmaz. Ancak, yığın değişiklikleri yalnızca içinde bulundukları bloğu etkiler.
Değer seçimi
a
vasitasiyla z
0-25. Öğeyi yığından alın ve yığına itin. a
yığının başını veya en yakın zamanda basılan öğesini ifade eder.
A
vasitasiyla Z
Geçerli karenin 0-25'inci öğesini alın ve yığına itin.
[
Yığın başındaki yığın referansından (aşağıya bakın) öğeler seçmek için bir "çerçeve" açın. [
eşleştirme gerektirmez ]
, ancak çerçeveler sözcüksel olarak kapsamlıdır. BlockScript'te "kapsam", blokları oluşturan parantezlerle ( {
... }
) belirlenir . Bu nedenle, bir bloğun içindeki bir çerçevenin açılması, bloğun dışındaki kod üzerinde etkili olmayacaktır.
]
Mevcut kareyi kapatın, önceki kareye dönün (varsa).
Bloklar
{
... }
Bir "blok" oluşturun ve yığına itin. Bir bloğun içinde istif, istifin üst kısmına itilmesi dışında, bloktan önce olduğu gibi başlayacaktır. Yığınlar BlockScript'te kalıcı ve değişmez olduğundan bloklar kapanır. Deyim {[
araçlar daha sonra (kullanarak argüman seçmeye bir çerçeve açılır, bir blok açık A
yoluyla Z
). Bir bloğun dönüş değeri }
, ulaşıldığında yığının başıdır .
Örnek:
'3 '2 '1 {[ b. d. f. B. C. D. A! } 'D 'C 'B d!;
Bu yazdırır 123BCD123DCB123BCD123DCB…
. Küçük harfler yığın değerlerine, büyük harfler ise argümanlara atıfta bulunur (kare arayanın yığınına ayarlandığı için). A!
Arayan kişinin kafasını alır (bu, aranan blok olduğu garanti edilir) ve onu çağırır. Neden BCD
her seferinde neden tersine döndüğünü merak ediyorsanız , B. C. D.
bu argümanları blok kendini çağırmadan hemen önce ters sırada iter.
!
Bir blok çağır. Dönüş değerini yığına itin.
Yığın referansları
&
Bir yığın referansı oluşturun ve yığına itin. Bunu, "süper-eksileri" olarak düşünün, çünkü yığıntaki her öğeyi etkin bir şekilde alır ve bunun dışında bir "demet" oluşturur. Deyim &[
ne olursa olsun bu araçlar a
, b
, c
artık ile erişilebilir önce de ifade A
, B
, C
(blok ya kadar geri kalan kısmı için]
karşılaşılmaktadır).
Kısmen &
, genellikle ihtiyaç duyduğundan daha fazla değer yakaladığı için, BlockScript tasarım gereği bellek sızdırıyor.
@
Yığın referansının gösterdiği yığına geçin a
. Bu operatör oldukça garip, ancak BlockScript kendini yorumlayıcı, aynı argümanları iki kez zorlamak zorunda kalmamak için birkaç kez kullanıyor. Bu konuda @
(veya herhangi bir istif işleminin) etkileri, çağrıldığı blokla sınırlıdır. Ayrıca, çerçeve bundan etkilenmez @
, bu nedenle çerçeve yığınları değiştirdikten sonra ihtiyaç duyduğunuz değerleri almak için kullanılabilir.
Koşullu ifade
?
<on true> :
<yanlış>
Koşullu ifade, tıpkı C'deki üçlü operatör gibi, a
yani "true" ise (yani, tamsayıya eşit değil), o zaman <true> yapın , aksi takdirde <false> yapın .
I / O
Not: Giriş ve çıkış UTF-8'de yapılır. Bir "karakter" bir Unicode indeksine karşılık gelen bir tamsayıdır.
,
Bir sonraki giriş karakterini alın ve yığına itin. Giriş sonuna ulaşıldığında, yerine -1 tuşuna basın.
.
Yığının başındaki karakteri çıkar.
Tamsayı / karakter değişmezleri
Not: Tamburlar ve karakterler BlockScript'te aynı şeydir.
Aritmetik
Bu operatörler sadece tamsayı değerleri üzerinde çalışır.
+
Hesapla b
+ a
(sonucu bastır, ancak her iki değeri de atma).
-
Hesapla b
- a
.
*
Hesapla b
* a
.
/
Hesapla b
/ a
(tam sayı bölümü; negatif sonsuzluğa yuvarlar).
%
b
% Hesaplayın a
(tamsayı modülü; negatif sonsuzluğa yuvarlar).
İlişkisel operatörler
Bu operatörler sadece tamsayı değerleri üzerinde çalışır.
<
Eğer b
daha az olduğu a
itme 1, başka itme 0,.
>
=
Çeşitli
#
Satırın sonuna kadar yorum yapın
- Program bitmeli
;
- Diğer tüm karakterler göz ardı edilir.
/usr/bin/cat
) peki Turing-eksiksizliği?