GolfScript'in geliştirilmiş bir sürümü [kapalı]


12

Daha fazla şey yapabilen daha kısa programlar için geliştirilmiş bir GolfScript yazmayı planlıyorum. Bu bir zorluk değil; ne yapmam gerektiğine dair geri bildirim ve ipuçları için bir istek. (etiketlere bakın)

Bunun Community Wiki olup olmayacağından emin değilim. Bunu düşünüyorsanız, dönüştürmek için bir moderatör için işaretleyin :)

Bu dil GolfScript'e çok benzer. Hala Ruby'de yazılmıştır. Ancak, birkaç farklılığı vardır:

  • Yaygın `olarak kullanılan bir karakter olduğu için dize sınırlayıcı olarak kullanıldığından, daha az kaçış gerekecektir. (Başka bir karakter işlevini değiştirebilir, örneğin #(daha sonra daha fazla)). bir ters \`çividen \\kaçmak, bir ters eğik çizgiden kaçmak ve başka kaçış dizisi yok. Bir satırsonuna ihtiyacınız varsa, dizeye gerçek bir satırsonu satırını yapıştırmanız yeterlidir.
  • RationalGolfScript'in en büyük kusurlarından biri olan keyfi hassas kayan nokta için Ruby'nin s'yi kullanın.
  • Türleri diğer türlere dönüştürme yeteneği. Örneğin, bir bloğu dizeye dönüştürebilirsiniz.
  • Düzenli ifadeler. Muhtemelen ile yaratılmıştır "...". Operatörler onlar için de aşırı yüklenecek. Örneğin "\W"~{`Invalid: non-word character`}{`OK`}if,. Bloklar gibi bir değişkenden itildiğinde otomatik olarak yürütülür.
  • Dosya ve Tarih nesneleri, GolfScript'te imkansız olan daha fazla şey yapmak için. Bunlar değişmez değerlere sahip olmayacak, ancak bunları başlatmak için işlevlere sahip olacaktır, örneğin `file.txt`fl(dosya oluşturma işlevinin adı değişebilir).
  • Hashler belki, ama bundan emin değilim. Yapmalımıyım?
  • Daha da fazlasını yapmak için yardımcı işlevler. Örneğin, `http://example.com`netağ erişimi için (tekrar, netoperatör yeniden adlandırılabilir). rbbir dizeyi Ruby kodu olarak yürütmek için. Bunlardan çok daha fazlası olacak; önerilerinizi bekliyoruz.
  • Yorum yok, bu yüzden #başka bir şey için kullanılabilir. Bir yorum istiyorsanız, `comment here`;iyi çalışır. (Belki 'işlevini #değiştirebilirsiniz `)
  • Fonksiyon eklemenin çok daha kolay olacağı şekilde tamamen yeniden yazılacaktır. Temel olarak, kod daha okunabilir olacaktır. (GolfScript kaynağını gördünüz mü? :/)
  • Birlikte çalışılabilmesi için Github'da olacak. Bunu MIT veya benzeri bir şey altında lisanslayacağım.
  • Son satırsonu yok, bu yüzden ucuz ayinler işe yarıyor: P

Ve ben bunları birbirinden ayırıyorum çünkü en sert ve yararlı değişiklikler olduklarını düşünüyorum (belki kayan nokta eklemek hariç):

  • Dahili birçok Ruby fonksiyonuna sahip olacak. Örneğin, shuffle( sfdaha önce 9 karakter aldı ), tr(önceden 14 karakter ), sample( sm, önceden .,rand=), flatten( fl, önceden ???) vb.
  • Rebmu gibi mantarlanacak. Örneğin, şimdi (sıralama işlevinin üzerine yazmak ~:a0<{0a-}aIF) yerine (bir harf değişkeni adı kullanarak ~:$0<{0$-}$if) yapabilirsiniz. ( buradan örnek ). Bu şekilde büyük / küçük harfe duyarsız olduğunu ve değişken adlarında sayılara izin verilmediğini unutmayın. Bence bu bir golf dili olduğu için sorun değil: P
  • Hata ayıklama olacak. Dizi sınırlayıcıları, öğe sınırlayıcıları vb. Belirten bir bayrak sağlama yeteneğini ekleyeceğim, sayı çıktısı (rasyonel, kayan nokta veya int?), Her seferinde bir adım adım atma, programı çalıştırmak yerine her jetonu belirleme ve çıktı verme, vb.

Benim sorum şu: geliştirilecek ne var? Ne eklemem gerektiğini düşünüyorsun?

Kodlamaya başlamadan önce bunun için başka fikirleriniz mi var?


Mantar eklerseniz büyük / küçük harf duyarlılığını kaybedeceğinizi unutmayın.
marinus

@marinus farkındayım. Bunu netleştirmeliydim; düzenleme ...
Kapı Tokmağı

Ayrıca gerçekten ihtiyaç duyduğu şey açık I / O (interaktif programlar için) yapmanın bir yoludur. Yorumlayıcı, programın açık G / Ç kullanıp kullanmadığını önceden kontrol edebilir ve yalnızca örtük G / Ç yaparsa.
marinus

@marinus Harika, bunu bir cevap olarak eklemelisiniz :)
Kapı Tokmağı

1
@Claudiu Son zamanlarda oldukça yoğun olmasına rağmen yeni dilimle ilgili gelişimim oldukça canlı, bu yüzden bir süredir bununla pek bir şey yapmadım. Bu fikirlerden bazıları iyi fikirler değil, ben kullanmıyorum: P
Doorknob

Yanıtlar:


17

Esnek I / O

Golfscript şu anda interaktif programlar için kullanılamaz. Ben açık girişi için bazı işlevler (yani eklenecek teklif readline, getcharve arkadaşları). Tercüman, programı çalıştırmadan önce bunları kullanıp kullanmadığını görmelidir.

Program herhangi bir giriş fonksiyonunu çağırmazsa, tercüman normalde Golfscript gibi davranmalıdır.

Tercümanın çalışma zamanında oluşturulan değerlendirilmiş koddaki giriş fonksiyonlarını tespit etmesini beklemem, ancak bunu bir şekilde yapabilirse, kudos.


Bu harika bir fikir; sınırlı io golfscript'in büyük sınırlamalarından biridir. +1
Kapı Tokmağı

11

Daha kısa yerleşik parçalar

Bunlara sahip olmayan tüm yerleşik komutlar için tek karakterli takma adlar. Sadece olsaydı baseçok daha fazlasını kullanırdım B.


Peki ya bdeğişken adı olarak kullanırsanız ? Yine; İyi bir fikir; işlevi kullanacaksanız ve bu işlevi kullanmıyorsanız o adı kullanmamayı unutmayın, bu sizi hiç etkilemez.
Kapı tokmağı

@DoorknobofSnow, yerleşik adları (ve hatta ^veya gibi jetonları $) değişken adları olarak zaten kullanabilirsiniz . Bu sorunu daha da kötüleştirmiyor. Ayrıca, geriye dönük uyumluluğa izin vermek için takma adlar önerdim, bu nedenle daha kısa takma ada başka bir şey atadıysanız daha uzun adı kullanmanız gerekir.
Peter Taylor

4
Zçünkü zipçok faydalı olur.
Howard

Belki GolfScript için resmi bir standart kütüphane yayınlayabiliriz. Ancak çözümlere nasıl dahil edilebileceği konusunda net değilim (eksik #includeve "#{IO.read'lib'}"~çok uzun).
Howard

@Howard Şimdi bu bir fikir ... Dilime kütüphaneler ekleyebilirim, belki mylang -Llibname somefile.ext.
Kapı tokmağı

9

Kombine div-mod

Bu önerilerden bazıları biraz daha niş, ancak sayı-teorik programların üzerinde çalışırken sık sık kendimi iki tamsayı açılan bir operasyon isteyen bulmak ave byığını ve iter gelen a/bve a%b. (Şu anda bu 1$1$/@@%).


Çok niş olduğu için, belki dvmDiV-Mod için bir şey . Tüm fikirler için teşekkürler :-) +1
Kapı Tokmağı

8

sayılar

Lexer'ı 0 önde gelen bir sayının parçası olmayacak şekilde değiştirin:

# current behaviour
01     # -> 1

# new
01     # -> 0 1

_Bunun yerine negatif sayılar da yazılmalıdır :

# current behaviour
1 2-3   # -> -1 3

# new
1 2_3     # -> 1 2 -3

Vay canına, bu ilginç. Genellikle üst üste iki sayı basmazsınız, ancak bu çok yardımcı olur. Olumsuz şey, 0 100-negatif 100 yerine de harika. +1
Doorknob

1
Bunu daha önce de düşündüm. Negatif tamsayı değişmez değerleri için herhangi bir destek olmamalıdır. Zaten ele alındı ~. Örneğin -1 eşittir 0~. Bu, az sayıda sayıyı bir karakter daha uzatır, ancak daha sonra boşluk için orta sıklık ihtiyacını ortadan kaldırır -.
Peter Taylor

Bir dakika, örneğin, 1001'i nasıl itersiniz? Sanırım sıfıra değil, sıfıra götürmek istedin.
Kapı tokmağı

@DoorknobofSnow Doğru.
Howard

Ne yapmak {0\-}:~;( ~bir sayıyı negatif yapar) ve notbitsel olarak kullanmak (ne gibi and or xor) hakkında ne düşünüyorsunuz ?
Kapı tokmağı

8

Yığının tamamına erişim

GolfScript yığın tabanlı bir dildir, ancak yığındaki ilk üç öğe dışındaki tüm öğelere erişim <integer>$, n'inci öğeyi kopyalamakla sınırlıdır . rollÜçten fazla "canlı" değişkenle çalışmanın daha kolay olması için PostScript'in komutu gibi bir şeye sahip olmak yararlı olacaktır .

İdeal olarak, bir arg ve iki arg sürümleri olurdu, ancak etrafında yeterli isim yoksa, tek argüman tek karakterli bir tercih tercih etmelidir.

Tek argüman, döndürülecek öğe sayısını alır. Örneğin 1 rollhiçbir şey yapmaz; 2 rolleşittir \; 3 rolleşittir @; 4 rollve yüksek sayılar için mevcut bir eşdeğeri yoktur; mümkün olan en yakın şey

]-4/()\+\+[]*-1%~

(ve bu, yığın üzerindeki belirli konumlarda veya aktif olmayan tamsayılarla bile işlemez [ve neredeyse kesinlikle döngülerin içine girer).

İki bağımsız değişken de yuvarlanmak için bir miktar alır; a b roll2eşittir {a roll}b*.


Ruby gibi rotate. Bunu CW yanıtında düzenlemelisiniz.
Kapı tokmağı

@ Kapı tokmağı, hayır. Bir dizide değil, yığının bir diliminde işlem yapmaktan bahsediyorum.
Peter Taylor

Hmm ... Ne demek istediğinden emin değilim. Ben postscript aşina değilim, ama rollsadece dizi döner, değil mi?
Kapı tokmağı

@DoorknobofSnow, yığın . Dizi, yığına giden bir öğedir.
Peter Taylor

Yani, bütün yığını döndürüyor . Ah, bu yararlı olabilir! +1
Kapı Tokmağı

8

CJam

"Geliştirilmiş bir GolfScript" uyguladım ve buna CJam deniyor - http://sf.net/p/cjam
Şimdi ikinci sürümde (sürüm 0.6) burada tartışılan özelliklerin çoğu olmasa bile zaten çok fazla var. Onları listelemeye çalışacağım:

  • hala Ruby'de yazılmış - hayır, java
  • `dize sınırlayıcı olarak kullanma - hayır, ancak minimum kaçışa sahip çift tırnaklı dizeler kullanır ( \yalnızca çıkışlar \ve ")
  • kayan nokta - desteklenen, ancak sadece standart "çift", keyfi hassasiyet değil
  • türleri diğer türlere dönüştür - evet
  • düzenli ifadeler - henüz değil, planlanan; özel işleçlerle normal dizeler kullanacak
  • Dosya ve Tarih nesneleri - hayır, ancak geçerli tarih / saati alabilir
  • hashes - bunların python dicts veya java haritaları gibi olduğunu varsayarsak, bunlar desteklenmez (gelecekte dikkate alınabilir)
  • daha fazlasını yapmak için yardımcı fonksiyonlar - evet, çok
  • `http://example.com`net - "example.com"g
  • bir dizeyi Ruby kodu olarak yürüt - nope
  • yorum yok - tam olarak, #başka bir şey için kullanılır,"comments like this";
  • fonksiyon eklemek daha kolay - sanırım, ama aynı zamanda önyargılıyım :)
  • Github üzerinde - daha iyi (bence, lütfen ateş etmeyin) - SourceForge üzerinde, hg kullanarak
  • MIT lisansı altında - evet
  • son satırsonu yok - doğru
  • Karıştır - mr
  • tr - er
  • örnek - yapılmadı, _,mr=
  • düzleştir - yapılmadı, ancak muhtemelen daha kolay
  • haşlanmış - hayır, ancak tanımlayıcıların ayrılmasına gerek yoktur
  • hata ayıklama - yalnızca yığın izleri ve edyığını göstermek için işleç

  • esnek G / Ç - evet, ancak yalnızca açık girdi

  • daha kısa yerleşik parçalar - evet, b= taban, z= zip
  • ayrı satır aralığı 0 - hayır, ancak önceden tanımlanmış değişkenleri kullanabilir
  • belirsiz -- evet, ama değil _; 1 2-3-> 1 2 -3; 1 2m3->-1 3
  • yığını yuvarla / döndür - hayır
  • dizi seti - t
  • divmod - md
  • lexer'ı değiştir (tanımlayıcılar için) - evet, daha fazlası
  • kartezyen ürün - tam olarak aynı değil, ama evet, m*
  • unicode operatörleri - hayır
  • tek karakterli tanımlayıcılar - önceden tanımlanmış işleçlerin 1 veya 2 karakteri vardır ve değişkenler tek karakterli büyük harflerdir; lexer / ayrıştırıcıyı karıştırmadan hepsi birleştirilebilir
  • bloklar üzerindeki operatörler - hayır
  • kararlı sıralama - evet
  • sembolleri kod bloklarına geri çevirin - hayır, ancak daha sonra ekleyebilir
  • geçerli tarih / saat - et
  • komut satırı argümanları - ea
  • yerleşikleri açıkça ayırmak - evet, ancak büyük harfler değişkenlerdir; yerleşik veya küçük harf ve özel karakterler ile başlar
  • minimum ve maksimum - evet, şu anda sadece 2 değerleri: e<,e>
  • mutlak değer - z(GolfScript absyok, eksik değil)
  • bir dizinin toplamı ve ürünü - :+,:*
  • Manhattan mesafesi - hayır
  • chr - c(bir karaktere değil, bir dizeye dönüştürür)
  • yığına bir dize dökmek - CJam dizeleri sayılardan değil karakterlerden oluşur; karakterleri dökmek için hala{}/
  • :depolananı tüketen bir versiyon - hayır
  • operatörler >=, <=- hayır, kullanım <!,>!
  • base64 ve zlib - hayır
  • 1 $, 2 $, 3 $, 4 $, 5 $ için kısayollar - hayır
  • ilk iki yığın öğeyi kopyalayın - planlanan; şimdilik kullanın1$1$
  • yerel değişkenler - hayır
  • HQ9 + özellikleri - hayır, teşekkür ederim

CJam çok daha fazla özelliğe sahip, https://sourceforge.net/p/cjam/wiki/Operators/


7
SourceForge ve Mercurial'ın GitHub'dan daha iyi olduğuna katılmıyorum.
nyuszika7h

1
@ nyuszika7h tamam, hepimizin tercihleri ​​var
aditsu çıkın çünkü SE EVIL

İlk CJam cevabımı gönderdim , çünkü GolfScript cevabım uygun bir sqrt fonksiyonuna ihtiyaç duyuyordu. CJam, GolfScript'ten çok daha hızlı!
Dennis

@Dennis Awesome :)
aditsu çıkmak SE çünkü EVIL

@aditsu CJam'i bir GolfScript lehçesi veya GolfScript'ten esinlenen yeni bir dil olarak mı düşünürdünüz? (İşte sormamın nedeni: codegolf.stackexchange.com/questions/37464/… )
Martin Ender

6

Lexer'ı değiştirin

GolfScript lexer, Ruby tanımlayıcısını (normal ifadeyle eşleşen herhangi bir şey [_a-zA-Z][_a-zA-Z0-9]*) tek bir belirteç olarak ele alır. Bunun yerine yerleşik olarak [a-zA-Z]+serbest kalacak _ve bir alfa değişkeninin ardından boşlukları ayırmadan bir tamsayı tamsayısının gelmesine izin verecek bir token olarak işlem görürse .


Eh, şu anda sadece [a-z]+|[A-Z]+, mantar için kullanıyorum, bu nedenle alt çizgi ücretsizdir. Bu ilginç ve çok eşsiz bir fikir olsa! +1
Kapı Tokmağı

5

Unicode takma adları

Birden çok karakterli komutların unicode diğer adları olabilir. Bu, skor bayt olarak değil karakter olarak sayıldığında skordan tasarruf sağlar.


7
ah ... başka bir APL istemiyoruz ...
John Dvorak

1
Golfscript APL, Unicode veya no gibi bir şey değildir. Zaten J ve K. gibi birkaç APL daha var (hatta bana oldukça APL'den ilham alan R, oldukça sık kelime çevirisi yapabileceğiniz noktaya kadar)
marinus

APL ile ilgili ayırt edici nokta , vektör aritmetiği doğal olarak kullanması değil, her şeyden çok farklı bir karakter seti kullanmasıdır. J'yi seviyorum, kullanıyorum ve genellikle J cevaplarını onaylıyorum. Henüz bir APL cevabını onaylamadım . Programlarımı yazmak yerine boyamak isteseydim Piet'i kullanırdım.
John Dvorak

Bence APL J'den daha okunaklı, Golfscript'ten daha okunaklı.
marinus

5

Kararlı sıralama

$Bloklar üzerinde yerleşik istikrarlı sıralama yapmak gerekir.


5

Dizi seti operatörü

["A" "B" "C" "D" "E" "F"] -1 4 S    # -> ["A" "B" "C" "D" -1 "F"]

Bunun için kullanabileceğimiz herhangi bir yerleşik?


+1 Dizi kümesini uygulama hakkında bir blog yazısı yazmaya başladım, ancak hiç bitirmedim. Şu anda tam genel olarak son derece zor. Bu, bazı zorluklarda büyük bir fark yaratacaktır.
Peter Taylor

Bunun golfscript'te yerleşik olmadığına inanamıyorum. +1
Kapı Tokmağı

5

Tek karakterli tanımlayıcılar

Bir kod golf çözümü çok fazla değişken olacak gibi değil. Ve yerden tasarruf sağlar.


Hmm .. Bu ayrıştırıcı değiştirilerek de yapılabilir. Belki de bu davranışı belirtmek için bir bayrak? İyi fikir! +1
Kapı Tokmağı


3

Normal ifade desteği

Normal ifade desteğinin olmaması beni golf için tasarlanmış bir dilde tuhaf buldu. Sahip olmak harika olurdu

  • <string> <string> <string> y(aka tr, Perl'in tek karakterli takma adını kullanarak)
  • <string> <string> <string> s (vekil)
  • <string> <string> <block> s (geri aramayla değiştir)
  • <string> <string> m (eşleşme)

Sorumda zaten regex'ten bahsettim.
Kapı tokmağı


3

|, & Ve ^ built-in öğelerini bloklarda yararlı bir şey yapın

Örneğin <array/string> <block> |indeks fonksiyonu olarak kullanılabilir

[0 -10 -20 30 40 -50 60] {0<} |   # -> [1 2 5]

<array/string> <block> &Veya için herhangi bir fikir <array/string> <block> ^?


array block =Şimdi ne yapıyor ?
John Dvorak

@ JanDvorak Karşılaştır. Bir dizeyi bir blokla karşılaştırmak istiyorsanız kullanışlıdır "0<" {0<} =.
Howard

Ne sıklıkla ihtiyacınız var? Bunu düşürmeyi ve array block ="yüklemle seç" için kullanmayı tercih ederim
John Dvorak

Yüklem tarafından @ JanDvorak seçim zaten kullanılarak uygulanmaktadır ,.
Howard

Oh aldırma. Git :-)
John Dvorak

2

Sembolleri kod bloklarına dönüştürmenin bir yolu

Şu anda, kod bloklarını simgelere bağlayabiliriz :, ancak işlemi tersine çevirmenin bir yolu yoktur: kod bloğuna bağlı bir sembolün yürütülmesi sadece bloğu yürütür.

Bunu uygulamak için birkaç yol görebilirsiniz:

  1. yeni bir sözdizimi ekleyin, örneğin bir kod bloğu olsa bile yığının #foodeğerini itmek fooveya

  2. kod bloğundaki her sembolü genişletmek için bir operatör ekleyin , böylece ( _yeni operatör olarak kullanarak ), örneğin {2*}:dbl; {dbl dbl}_üretsin {2* 2*}.

Her iki yöntemin de avantajlarını görebiliyorum. İkincisi, iki ekstra karakter ( {foo}_yerine #foo) pahasına öncekinin yerini alabilir, ancak bu iki karakterin yasaklayıcı olacağı eski sözdizimi için bazı potansiyel uygulamaları görebilirim (örneğin, array #func %yerine kullanmak array {func} %).

Bu arada, bir kod bloğundaki jetonları bir şekilde yinelemek için uygun bir yol varsa (yine de kendi başına yararlı olabilir) eski sözdizimi kullanılabilir .


Her iki durumda da, yerel yerleşiklere (yani Ruby kodunda uygulanır) bağlı genişleyen sembollerin, imkansız olsa da, yerleşik işlevselliği elde etmek için çağrılabilecek bir tür saplama döndürmesi gerektiğini öneriyorum. veya geçersiz kılınması pek olası değildir. Örneğin #$(veya {$}_) örneğin {builtin_dollar}, yerleşik builtin_dollarolanın gerçek uygulamasını içerebileceği $( #builtin_dollarveya {builtin_dollar}_yalnızca {builtin_dollar}kendisini döndürmesi gereken ) geri dönebilir .

Bu, yerleşiklerin işlevselliklerine erişimi kaybetmeden yeniden tanımlanmasına izin verir ( önceki önerime bakın ), böylece, eğer bir nedenle, bir nedenden dolayı anlamlarını değiştirmek istersem $ve @sadece yapabilirim #$ #@ :$; :@;(veya {$}_ {@}_ :$; :@;).


Emin olmadığım bir ayrıntı _, kod bloğu değişken atamalar içeriyorsa operatörün yapması gereken şeydir . Açık olan şey, herhangi bir :symboljetonu el değmeden bırakmak ve başka bir şeyi genişletmek olacaktır, ancak bu, _yerel değişkenleri kullanarak herhangi bir kodu kırmaya neden olacaktır . Bununla birlikte, bu kodu ihlal etmemesi pratik olarak karmaşık olabilir.
Ilmari Karonen

1
Sizin ikinci versiyon diziler üzerinde düzleştirmek operatörü ile birbirine uygun olacaktır: [[1] [2] [3]] _ -> [1 2 3].
Howard

Peki bunun sonucu ne olurdu 2:A;{1:A;A}_?
Howard

Saf, {1:A;2}(veya {1:A builtin_semicolon 2}yerleşik genişletme özelliği dahil edilmişse teknik olması için). Bir çeşit "yerel değişken hariç tutma" özelliği dahil edilmişse, makul olarak değerlendirilebilir {1:A;A}.
Ilmari Karonen

Veya daha teknik olmak için {builtin_1 :A builtin_semicolon 2}.
Howard

1

Komut satırı değişkenleriyle değişken önayar

Ne yazık ki, atanmamış herhangi bir karakter yok, ama belki bunun için kullanabiliriz A?


_kullanılabilir. Belki de bu? Neyse, evet, golfscript cmd line args almak için bir yol gerekiyor +1
Doorknob

0

Uygulamam gereken Yerli Ruby işlevleri

Bu Topluluk Wiki'sidir; uygulamak gerektiğini düşündüğünüz işlevleri düzenlemek ve eklemek için çekinmeyin!

Biçim: " nativeFunctionName( nameInMyLanguage)"

  • shuffle( sf)
  • tr( tr)
  • sample( sm)

0

APL ve HQ9 + 'dan da özellikler alın!

  • APL'deki gibi kısayollar. EDIT: sadece "unicode takma adları" cevabını gördüm. Demek istediğim şey o :)
  • H9 +, HQ9 +, CHIQRSX9 + gibi diğer golf odaklı kısayollar

Tamam, bunu nasıl öneriyorsun? Özel bir fikrin var mı?
Kapı tokmağı

Unicode karakterler, tek bir karakterde karmaşık şeyler yapmaya izin verir.
xem

Kar @Doorknob, ben görmek istiyorum kısayolları ile benim cevap güncelleme: APL gelenler ve CHIRQSX9 gelenler + :)
xem

Hmm, hq9 + şey çok daha ucuz görünüyor :-P
Doorknob

Golf odaklı: P im benim diliniz de en azından yapmak gerekir :)
xem

0

Yerleşikleri açıkça ayırın

örneğin, büyük harfler: yerleşik; B'nin taban için uygulanabilir hale getirilmesi


1
Yukarıda belirtildiği gibi ayrılmaya gerek yoktur. Birisi bir yerleşimin üzerine yazmaktan hoşlanırsa, bunu yapabilmelidir. Hatta üzerine yazma operatörlerinin yararlı uygulamalarını bile buldum {-}:+.
Howard

Gerek yok, bu dil büyük / küçük harfe duyarsız olacaktır.
Kapı tokmağı

2
Amaç, delik başına daha az vuruş sağlamak olduğundan, büyük / küçük harf duyarlılığına ve daha fazla yerleşik öğeye sahip olmak etkili bir şekilde görev ifadesine yol açar.

0

Yerel değişkenler / kapanışlar

GolfScript'te gerçekten özlediğim bir şey , bir sembolün değerini geçici olarak değiştirme yeteneğidir .

Özellikle, şu anda yerleşik "ilkel" anlamını geçici olarak geçersiz kılmanın bir yolu yoktur: bir kez söyleyin, yeniden tanımlayın $, bir daha asla bu programdaki bir şeyi sıralamayacaksınız. (En azından kendi sıralama uygulamanızı yazmadan değil.) Örneğin, bu kod bloğunda $ başka bir şey ifade ettiğini söyleyebilmek gerçekten güzel olurdu , ama yine de başka bir yerde normal anlamı koruyun.

Yukarıdakilerle ilgili olarak, bir kod bloğundaki sembolleri mevcut değerlerine bağlamak güzel olurdu . Tabii, ben diyelim ki, yazma, olabilir {$-1%}:rsortve kullanabilecektir rsortsıralamak ve bir dizi ters, ama bu işleri sadece tanımının sürece $(veya -1veya %) does not değişikliği, benim beri rsortişlev hala küresel sembolü çağırıyor $. " Bu semboller daha sonra yeniden tanımlanmış olsa bile şu anda rsortne yapalım" diyebilmek güzel olurdu $-1%.

Özellikle, standart kütüphane bu tür bir bağlamayı kullanabilir. Diyelim ki değişen ndavranışların değiştiğini putsya da yeniden tanımlamanın !tamamen bozulduğunu fark etmek şaşırtıcı olabilir xor. (Daha sonra, burada dikkatli olunmalıdır, özellikle, GS'nin mevcut sürümünde son bir satırsonu yazdırmanın önlenmesinin tek yoluputs olduğu ortaya çıkmaktadır .

Düzenleme: edebilme kod bloklar halinde geri semboller çevirmek bu işlevi uygulayan yolunda uzun bir yol gider. Özellikle, {foo}_bu cevapta önerilen sözdizimi, bir kod bloğundaki tüm sembolleri genişleterek etkili bir düzeyde statik bağlanma gerçekleştirecektir. Bunu derin statik bağlama için bir düzeltme noktası birleştirici ile birleştirin ve Bob amcan ...


Hadi - tüm süslü yeni diller tembel değerlendirmeyi kutluyor ;-) Bu özelliği GolfScript'te saklayalım.
Howard

İkinci düşüncede - haklısınız, değerlendirmeden ziyade bağlayıcı bir özellik. Ancak o zaman - statik bağlama göründüğünden daha karmaşıktır - örneğin bir tanım içinde yinelemeli çağrılar sağlayın.
Howard

" Bu semboller daha sonra yeniden tanımlansa bile şu anda rsortne yapalım $-1%" diye Emmental?
CalculatorFeline

0

Daha fazla yerleşik işlev

Tüm tek harfli değişkenleri az ve AZ ile genel, kullanışlı bir işlev gerçekleştirin. Eksik olan bazı yerleşik öğeler:

  • min ve max: bir dizi üzerinden ilk 2 yığın değerinin tamamı veya bir kısmı, ilk n yığın değerleri
  • mutlak değer
  • bir dizinin toplamı ve ürünü. neden {+}*yapabilirsin S? Burada çalışmak için 52 fonksiyonunuz var!
  • Manhattan mesafesi (yani , eğer yerleşik bir mutlak değer ise , x1 y1 x2 y2 --> abs(x2-x1)+abs(y2-y1)olması gerekirdi . Bu sadece en son gönderimin ipuçları geldi ama her zaman golfscript genişletmek için iyi bir yol olacağını düşündüm: ne yazmak) işlevleri sahip olmak, toplamak ve yerleşik olarak eklemek kullanışlı olacaktır.@-A@@-A+A
  • Bir tamsayıyı tek karakterlik bir dizeye dönüştürün (python'ların eşdeğeri chr).
  • Yığına bir dize dökme (şu anda {}/)
  • Bunun bir sürümü :depolananı tüketir. Bunun, yararlı olması için tanımlayıcılara "yapışması" gerekmez.
  • İçin operatörler >=,<=
  • Birinin önerdiği gibi, blok içeren bir değişkeni yığına yürütmeden yığına koymanın bir yolu. Böylece formun ifs'lerini 1{\}{|}ifbenzer bir şeye indirgeyebilirsiniz1?\?|if
  • Gömme verilerinin daha az karakter almasını sağlamak için yerleşik base64 dönüştürme ve zlib desteği
  • Base64'ün ötesinde, özel bir base93 kodlaması yapın (dize sınırlayıcı olmayan tüm yazdırılabilir karakterleri kullanarak).
  • Kısayollar için 1$, 2$, 3$, 4$,5$
  • En üstteki iki yığın öğeyi oldukları gibi kopyalamak için bir operatör, yani \.@.@\

-3

Bir işlevin son satırında yazılan veya hesaplanan değerin otomatik olarak döndürülmesi iyi olurdu


3
Bu yığın tabanlı, bu yüzden ...
marinus

1
İşlev diye bir şey yoktur.
Peter Taylor

Fonksiyonlar hiçbir şey döndürmez ... ve blok olarak adlandırılır
Kapı tokmağı

Güzel olabilir ... başka bir dilde. (Fonksiyonların sonunda Hayır daha rahatsız edici dönüş ifadeleri Yay (Ama dönüş ifadeleri hiç, yani ...) gerekli değil!)
CalculatorFeline
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.