Ulepszona wersja GolfScript [zamknięta]


12

Planuję napisać ulepszony GolfScript dla jeszcze krótszych programów, które mogą robić więcej rzeczy. To nie jest wyzwanie; jest to prośba o opinie i porady dotyczące tego, co powinienem zrobić. (patrz tagi)

Nie jestem pewien, czy powinna to być Wiki społeczności. Jeśli tak uważasz, po prostu oznacz moderatora, aby go przekonwertował :)

Ten język będzie bardzo podobny do GolfScript. Wciąż jest napisany w Ruby. Ma jednak kilka różnic:

  • Użycie `jako ogranicznika łańcucha, ponieważ jest to rzadki znak, więc mniej ucieczki będzie potrzebne. (Inny znak może zastąpić swoją funkcję, np. #(Więcej na ten temat później)). \`uciec \\przed ukośnikiem, uciec przed ukośnikiem i nie ma innych sekwencji ucieczki. Jeśli potrzebujesz nowej linii, po prostu przyklej prawdziwą nową literę do łańcucha.
  • Użycie Ruby'ego Rationaldo dowolnej zmiennoprzecinkowej precyzji, jedna z głównych wad GolfScript.
  • Możliwość konwersji typów na inne typy. Na przykład możesz przekonwertować blok na ciąg.
  • Wyrażenia regularne. Prawdopodobnie stworzony z "...". Operatorzy również zostaną dla nich przeciążeni. Na przykład "\W"~{`Invalid: non-word character`}{`OK`}if. Wykona się automatycznie po wypchnięciu ze zmiennej, takiej jak bloki.
  • Obiekty File i Date, aby wykonać więcej rzeczy, które były niemożliwe w GolfScript. Nie będą miały literałów, ale będą miały funkcje inicjujące je, takie jak `file.txt`fl(nazwa funkcji tworzenia plików może ulec zmianie).
  • Może hashe, ale nie jestem tego pewien. Czy powinienem?
  • Funkcje pomocnicze pozwalają zrobić jeszcze więcej. Na przykład w `http://example.com`netcelu uzyskania dostępu do sieci (ponownie netnazwa operatora może zostać zmieniona). rbwykonać ciąg jako kod Ruby. Będzie ich o wiele więcej; sugestie mile widziane.
  • Brak komentarzy, więc #można to wykorzystać do czegoś innego. Jeśli chcesz komentarza, `comment here`;będzie dobrze. (Może #może zastąpić `funkcję)
  • Zostanie całkowicie przepisany w taki sposób, że znacznie łatwiej będzie dodać funkcje. Zasadniczo kod będzie bardziej czytelny. (Czy widziałeś źródło GolfScript? :/)
  • Będzie na Githubie, aby można było nad nim wspólnie pracować. Zezwolę na licencję na MIT lub coś takiego.
  • Brak ostatecznej nowej linii, więc oszukiwane quiny działają: P

Rozróżniam je, ponieważ uważam, że są to najbardziej drastyczne i pomocne zmiany (z wyjątkiem może dodania zmiennoprzecinkowego):

  • Będzie miał wiele wbudowanych funkcji Ruby. Na przykład shuffle(który może być skrócony sf) (poprzednio miał 9 znaków ), tr(poprzednio 14 znaków ), sample( smpoprzednio .,rand=), flatten( flpoprzednio ???) itd.
  • Będzie muskularny, jak Rebmu. Na przykład teraz możesz to zrobić ~:a0<{0a-}aIF(używając nazwy zmiennej literowej) zamiast ~:$0<{0$-}$if(nadpisując funkcję sortowania). (przykład stąd ). Zauważ, że w ten sposób wielkość liter nie jest rozróżniana, a liczby nie są dozwolone w nazwach zmiennych. Moim zdaniem jest to w porządku, ponieważ jest to język golfowy: P
  • Będzie miał debugowanie. Dodam możliwość dostarczenia flagi określającej ograniczniki tablicowe, ograniczniki elementów itp., Dane wyjściowe liczbowe (wymierne, zmiennoprzecinkowe lub int?), Krok po kroku wykonując instrukcje pojedynczo, tokenizując i wysyłając każdy token zamiast uruchamiania programu, itp.

Moje pytanie brzmi: co można poprawić? Jak myślisz, co powinienem dodać?

Jakieś inne pomysły na to, zanim zacznę go kodować?


Zdaj sobie sprawę, że jeśli dodasz mushing, tracisz rozróżnianie wielkości liter.
marinus

@marinus Zdaję sobie z tego sprawę. Powinienem to wyjaśnić; edycja ...
Klamka

To, czego naprawdę potrzebuje, to sposób wykonywania jawnych operacji we / wy (dla programów interaktywnych). Tłumacz może wcześniej sprawdzić, czy program używa jawnych operacji we / wy, i wykonać niejawne operacje we / wy tylko wtedy, gdy tego nie robi.
marinus

@marinus Świetnie, powinieneś dodać to jako odpowiedź wtedy :)
Klamka

1
@Claudiu Mój rozwój nowego języka jest całkiem żywy, chociaż ostatnio byłem dość zajęty, więc od dłuższego czasu niewiele z niego zrobiłem. Niektóre z tych pomysłów nie są jednak po prostu dobrymi pomysłami, których nie używam: P
Klamka

Odpowiedzi:


17

Elastyczne we / wy

Golfscript nie może być obecnie używany do interaktywnych programów. Proponuję niektóre funkcje wyraźnej wejście zostać dodany (tj readline, getchari przyjaciół). Tłumacz powinien sprawdzić, czy program używa ich przed uruchomieniem.

Jeśli program nie wywołuje żadnych funkcji wejściowych, interpreter powinien zachowywać się tak jak normalnie Golfscript.

Nie spodziewałbym się, że interpreter wykryje funkcje wejściowe w ewaluowanym kodzie generowanym w czasie wykonywania, ale jeśli w jakiś sposób może to zrobić, niech będzie.


To świetny pomysł; Ograniczone io jest jednym z dużych ograniczeń gry w golfa. +1
Klamka

11

Krótsze wbudowane

Aliasy jednoznakowe dla wszystkich wbudowanych poleceń, które ich nie mają. Przydałby mi się baseo wiele więcej, gdyby tak było B.


Ale co jeśli użyjesz bjako nazwy zmiennej? Nadal; dobry pomysł; po prostu pamiętasz, aby nie używać tej nazwy, jeśli zamierzasz korzystać z tej funkcji, a jeśli nie używasz tej funkcji, nie ma to żadnego wpływu na ciebie.
Klamka

@DoorknobofSnow, możesz już używać wbudowanych (a nawet tokenów takich jak ^lub $) jako nazw zmiennych. To nie pogarsza tego problemu. Poza tym zasugerowałem aliasy, aby umożliwić kompatybilność wsteczną, więc musiałbyś użyć dłuższej nazwy, jeśli przypisałeś coś innego krótszemu aliasowi.
Peter Taylor,

4
Zdla zipbyłoby również bardzo przydatne.
Howard

Może możemy wydać oficjalną standardową bibliotekę dla GolfScript. Ale nie jestem pewien, w jaki sposób można go włączyć do rozwiązań (brakuje #includei "#{IO.read'lib'}"~jest za długi).
Howard

@ Howard Teraz to pomysł ... Mógłbym dodać biblioteki do mojego języka, może jak mylang -Llibname somefile.ext.
Klamka

9

Połączony mod div

Jest to nieco bardziej niszowych niż niektóre z propozycji, ale podczas pracy na liczbowo teoretyczna programów I często znajduję się chcąc operację, która wyskakuje dwie liczby całkowite ai bze stosu i popycha a/bi a%b. (Obecnie jest to 1$1$/@@%).


Ponieważ jest tak niszowa, może coś dvmw stylu DiV-Mod. Dzięki za wszystkie pomysły :-) +1
Klamka

8

Liczby

Zmień leksykon tak, aby wiodące 0 nie było częścią liczby:

# current behaviour
01     # -> 1

# new
01     # -> 0 1

_Zamiast tego należy również wpisać liczby ujemne :

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

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

Wow, to interesujące. Zwykle zwykle nie wypychasz dwóch liczb z rzędu, ale bardzo by to pomogło. Negatywna rzecz też jest świetna, zamiast 0 100-ujemnych 100. +1
Klamka

1
Myślałem o tym wcześniej. Nie powinno być żadnego wsparcia dla ujemnych literałów całkowitych. Jest to już obsługiwane ~. Np. -1 to 0~. To sprawia, że ​​niewielka liczba liczb jest dłuższa o jeden znak, ale usuwa umiarkowanie częstą potrzebę spacji po nim -.
Peter Taylor,

Chwileczkę, jak popchnąłbyś na przykład 1001? Myślę, że miałeś na myśli wiodące zero, a nie końcowe.
Klamka

@DoorknobofSnow Right.
Howard

Co byś pomyślał o zrobieniu {0\-}:~;( ~neguje liczbę) i używaniu notbitowego (tak jak and or xor)?
Klamka

8

Dostęp do całego stosu

GolfScript jest językiem opartym na stosie, ale dostęp do wszystkich oprócz trzech najlepszych pozycji na stosie jest ograniczony <integer>$do skopiowania n-tego elementu. Przydałoby się mieć coś w rodzaju rollpolecenia PostScript, aby łatwiej było pracować z więcej niż trzema „aktywnymi” zmiennymi.

Idealnie byłyby wersje z jednym argumentem i dwoma argumentami, ale jeśli wokół nie ma wystarczającej liczby nazw, wówczas argument ten powinien uzyskać preferencję dla znaku jednoznakowego.

Jeden argument wymaga tylko liczby przedmiotów do wyrzucenia. Np. 1 rollNic nie robi; 2 rolljest równoważne z \; 3 rolljest równoważne z @; 4 rolla dla wyższych liczb nie ma istniejącego odpowiednika; najbliższe, które jest możliwe, to coś w rodzaju

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

(i to nawet nie obsługuje liczb całkowitych w pewnych pozycjach na stosie lub aktywnych [, i prawie na pewno również pęka w pętlach).

Dwa argumenty również wymagają rzutu; a b roll2jest równoważne z {a roll}b*.


Tak jak Ruby rotate. Powinieneś edytować to w odpowiedzi CW.
Klamka

@Doorknob, no. Mówię o operowaniu na kawałku stosu, a nie na tablicy.
Peter Taylor

Umm ... Nie jestem pewien, co masz na myśli. Nie znam postscriptum, ale rollpo prostu obraca tablicę, prawda?
Klamka

@DoorknobofSnow, stos . Tablica to przedmiot, który trafia na stos.
Peter Taylor

Och, więc obraca cały stos . Ach, to może być przydatne! +1
Klamka

8

CJam

Zaimplementowałem „ulepszony GolfScript” i nazywa się CJam - http://sf.net/p/cjam
Teraz w drugim wydaniu (wersja 0.6) ma już wiele, jeśli nie większość omawianych tutaj funkcji. Spróbuję je wymienić:

  • wciąż napisane w Ruby - nie, java
  • użycie `jako separatora ciągów - nie, ale używa ciągów cudzysłowów z minimalnym odstępem ( \tylko znaki ucieczki \i ")
  • zmiennoprzecinkowa - obsługiwana, ale tylko standardowa „podwójna”, a nie dowolna precyzja
  • konwertuj typy na inne typy - tak
  • wyrażenia regularne - jeszcze nie, ale zaplanowane; użyje regularnych ciągów znaków ze specjalnymi operatorami
  • Obiekty Plik i Data - nie, ale można uzyskać bieżącą datę / godzinę
  • hashe - zakładając, że są one jak Python Dicts lub Javy Maps, to nie są obsługiwane (może rozważyć w przyszłości)
  • funkcje pomocnicze, aby zrobić jeszcze więcej - tak, dużo
  • `http://example.com`net - "example.com"g
  • wykonać ciąg jako kod Ruby - nie
  • bez komentarzy - dokładnie, #użyte do czegoś innego,"comments like this";
  • łatwiej dodawać funkcje - tak mi się wydaje, ale jestem też stronniczy :)
  • na Githubie - jeszcze lepiej (moim zdaniem nie strzelaj) - na SourceForge, używając hg
  • na licencji MIT - tak
  • brak ostatecznej nowej linii - prawda
  • losowo - mr
  • tr - er
  • próbka - nie zrobione, _,mr=
  • spłaszczanie - nie zrobione, ale prawdopodobnie łatwiejsze do osiągnięcia
  • mushed - nie, ale identyfikatory nie muszą być rozdzielane
  • debugowanie - tylko ślady stosu i edoperator do pokazywania stosu

  • elastyczne we / wy - tak, ale tylko wyraźne dane wejściowe

  • krótsze wbudowane - tak, b= podstawa, z= zip
  • oddzielne wiodące 0 - nie, ale można użyć predefiniowanych zmiennych
  • jednoznaczny -- tak, ale nie z _; 1 2-3-> 1 2 -3; 1 2m3->-1 3
  • toczyć / obracać stos - nie
  • zestaw tablic - t
  • divmod - md
  • zmień leksykon (dla identyfikatorów) - tak, więcej poniżej
  • produkt kartezjański - nie dokładnie taki sam, ale tak, m*
  • operatory Unicode - nie
  • identyfikatory jednoznakowe - predefiniowane operatory mają 1 lub 2 znaki, a zmienne są wielkimi literami; wszystkie mogą być łączone bez pomieszania leksemu / parsera
  • operatorzy na blokach - nie
  • sortowanie stabilne - tak
  • zamień symbole z powrotem w bloki kodu - nie, ale możesz dodać później
  • aktualna data / godzina - et
  • argumenty wiersza poleceń - ea
  • wyraźne oddzielanie wbudowanych - tak, ale wielkie litery to zmienne; wbudowane są lub zaczynają się od małych i specjalnych znaków
  • min i max - tak, obecnie tylko dla 2 wartości: e<,e>
  • wartość bezwzględna - z(GolfScript ma abs, nie brakuje)
  • suma i iloczyn tablicy - :+,:*
  • Odległość na Manhattanie - nie
  • chr - c(konwertuje na znak, a nie na ciąg)
  • przelej ciąg znaków na stos - ciągi CJam składają się ze znaków, a nie cyfr; aby rozlać postacie, wciąż jest{}/
  • wersja :tego zużywa to, co jest przechowywane - nie
  • operatory dla >=, <=- nie, użyj <!,>!
  • base64 i zlib - nie
  • skróty za 1 $, 2 $, 3 $, 4 $, 5 $ - nie
  • skopiuj dwa górne elementy stosu - planowane; na razie użyj1$1$
  • zmienne lokalne - nie
  • Funkcje HQ9 + - nie, dziękuję

CJam ma o wiele więcej funkcji, sprawdź https://sourceforge.net/p/cjam/wiki/Operators/


7
Nie zgadzam się z tym, że SourceForge i Mercurial są lepsze niż GitHub.
nyuszika7h

1
@ nyuszika7h jest w porządku, wszyscy mamy swoje preferencje
aditsu zrezygnowało, ponieważ SE to EVIL

Właśnie opublikowałem swoją pierwszą odpowiedź na CJam , ponieważ moja odpowiedź na GolfScript bardzo potrzebowała odpowiedniej funkcji sqrt. CJam jest znacznie szybszy niż GolfScript!
Dennis


@aditsu Czy uważasz CJam za dialekt GolfScript lub nowy język inspirowany GolfScript? (Oto powód, dla którego pytam: codegolf.stackexchange.com/questions/37464/... )
Martin Ender

6

Zmień leksykon

Lexer GolfScript traktuje identyfikator Ruby (wszystko, co pasuje do wyrażenia regularnego [_a-zA-Z][_a-zA-Z0-9]*) jako pojedynczy token. Jeśli zamiast tego jest traktowany [a-zA-Z]+jako token, który uwolniłby się _do wbudowania i pozwoliłby, aby po zmiennej alfa następowała dosłowna liczba całkowita bez oddzielania białych znaków.


Cóż, obecnie używam po prostu [a-z]+|[A-Z]+do musowania, więc podkreślenie jest bezpłatne. Jest to jednak ciekawy i bardzo wyjątkowy pomysł! +1
Klamka

5

Aliasy Unicode

Komendy wieloznakowe mogą mieć aliasy Unicode. Pozwoliłoby to zaoszczędzić na wyniku, gdy wynik jest liczony w znakach, a nie w bajtach.


7
uh ... nie chcemy kolejnego APL ...
John Dvorak

1
Golfscript nie jest jak APL, Unicode czy nie. Mamy już kilka innych APL-ów, takich jak J i K. (lub nawet R, które wyglądają na całkiem zainspirowane przez APL, do tego stopnia, że ​​możesz dość często dosłownie tłumaczyć)
marinus

Cechą wyróżniającą APL jest to, że używa on zupełnie innego zestawu znaków niż cokolwiek innego, a nie to, że używa natywnie arytmetyki wektorowej. Lubię J, używam go i często głosuję na odpowiedzi J. Jeszcze nie głosowałem na jedną odpowiedź APL. Gdybym chciał malować swoje programy zamiast je pisać, użyłbym Piet.
John Dvorak,

Myślę, że APL jest bardziej czytelny niż J, a na pewno bardziej czytelny niż Golfscript.
marinus

5

Rodzaj stabilny

$Wbudowane na blokach powinien wykonać stabilne sortowania.


5

Operator zestawu tablic

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

Jakieś wbudowane funkcje, które możemy udostępnić?


+1 Zacząłem pisać post na blogu o implementacji zestawu tablic, ale nigdy go nie skończyłem. Obecnie jest to niezwykle trudne w pełnej ogólności. To miałoby duży wpływ na niektóre wyzwania.
Peter Taylor,

Nie mogę uwierzyć, że nie jest to już wbudowane w skrypt golfowy. +1
Klamka

5

Identyfikatory jednoznakowe

To nie jest tak, że rozwiązanie do gry w golfa będzie miało zbyt wiele zmiennych. I oszczędziłoby to miejsca.


Hmm .. Można to również zrobić, zmieniając parser. Być może flaga określająca to zachowanie? Świetny pomysł! +1
Klamka

4

% jako wbudowane dla produktu

[1 2][1 2 3]%  # -> [[[1 1][1 2][1 3]][[2 1][2 2][2 3]]]

+1; możesz edytować moją odpowiedź CW i dodać tę
Klamka

Co z modulo?
MilkyWay90

3

Wsparcie dla Regex

Brak obsługi wyrażeń regularnych zawsze wydawał mi się dziwny w języku przeznaczonym do gry w golfa. Byłoby wspaniale mieć

  • <string> <string> <string> y(aka tr, używając do tego jednokierunkowego aliasu Perla)
  • <string> <string> <string> s (zastąpić)
  • <string> <string> <block> s (zamień na oddzwanianie)
  • <string> <string> m (mecz)

W swoim pytaniu już wspomniałem o wyrażeniu regularnym.
Klamka


3

Zmodyfikuj wbudowane |, i ^ w coś użytecznego na blokach

Np. <array/string> <block> |Może być użyty jako funkcja indeksu

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

Wszelkie pomysły na <array/string> <block> &lub <array/string> <block> ^?


Co array block =teraz robi?
John Dvorak,

@JanDvorak Porównaj. Przydatne, jeśli chcesz porównać ciąg do bloku, np "0<" {0<} =.
Howard

Jak często tego potrzebujesz? Wolę to porzucić i użyć słowa array block =„wybierz według predykatu”
John Dvorak,

@JanDvorak wybierz według predykatu jest już zaimplementowany przy użyciu ,.
Howard

Och nieważne. Kontynuuj :-)
John Dvorak

2

Sposób na zamianę symboli z powrotem w bloki kodu

Obecnie możemy powiązać bloki kodu z symbolami :, ale nie ma sposobu na odwrócenie procesu: wykonanie symbolu powiązanego z blokiem kodu po prostu wykonuje blok.

Widzę kilka sposobów na wdrożenie tego:

  1. dodaj nową składnię, np. w #foocelu wypchnięcia wartości foodo stosu, nawet jeśli jest to blok kodu, lub

  2. dodaj operator, aby rozwinąć każdy symbol w bloku kodu, tak aby (używając _jako nowego operatora), np . {2*}:dbl; {dbl dbl}_wygenerować {2* 2*}.

Widzę zalety obu metod. Ten drugi może zastąpić pierwszy, kosztem dwóch dodatkowych znaków ( {foo}_zamiast #foo), ale widzę pewne potencjalne zastosowania poprzedniej składni, w których te dwa znaki byłyby wygórowane (np. Używanie array #func %zamiast array {func} %).

Tymczasem poprzednia składnia mogłaby zostać użyta do zastąpienia drugiej, gdyby istniał wygodny sposób na iterację po tokenach w bloku kodu (który i tak mógłby być użyteczny samodzielnie).


W obu przypadkach proponuję, aby rozwinięcie symboli związanych z wbudowanymi funkcjami wbudowanymi (tj. Zaimplementowanymi w kodzie Ruby) zwróciło pewien rodzaj kodu pośredniczącego, który można by wywołać w celu uzyskania funkcjonalności wbudowanego, chociaż jest to niemożliwe lub po prostu mało prawdopodobne, aby zostać zastąpionym. Na przykład #$(lub {$}_) może zwrócić np. {builtin_dollar}Gdzie builtin_dollarzawierałoby rzeczywistą implementację $wbudowanego (i #builtin_dollarlub {builtin_dollar}_powinien po prostu zwrócić {builtin_dollar}).

Umożliwiłoby to ponowne zdefiniowanie wbudowanych elementów bez utraty dostępu do ich funkcjonalności (patrz moja wcześniejsza sugestia ), tak że gdybym, powiedzmy, z jakiegoś powodu chciałem zamienić znaczenie $i @, mógłbym po prostu zrobić #$ #@ :$; :@;(lub {$}_ {@}_ :$; :@;).


Nie jestem pewien, co _powinien zrobić operator, jeśli blok kodu zawiera przypisania zmiennych. Oczywistą rzeczą byłoby pozostawienie :symbolnietkniętych tokenów i rozwinięcie czegokolwiek innego, ale spowodowałoby to uszkodzenie _dowolnego kodu przy użyciu zmiennych lokalnych. Dzięki czemu nie złamać taki kod może być niepraktycznie skomplikowane, choć.
Ilmari Karonen

1
Twoja druga wersja pasuje wraz z spłaszczyć operatora na macierzach: [[1] [2] [3]] _ -> [1 2 3].
Howard

Więc jaki byłby wynik 2:A;{1:A;A}_?
Howard

Naiwnie {1:A;2}(lub, mówiąc technicznie, {1:A builtin_semicolon 2}jeśli uwzględniono wbudowaną funkcję rozszerzenia). Jeśli uwzględniono jakąś funkcję „wykluczania zmiennych lokalnych”, może to być uzasadnione {1:A;A}.
Ilmari Karonen

Lub być jeszcze bardziej technicznym {builtin_1 :A builtin_semicolon 2}.
Howard

1

Zmienne ustawienie wstępne z argumentami wiersza poleceń

Niestety nie ma nieprzypisanego char, ale może możemy tego użyć A?


_jest dostępny. Być może to? W każdym razie tak, golfscript potrzebuje sposobu na pobranie argumentów linii cmd +1
Klamka

0

Rodzime funkcje Ruby, które powinienem zaimplementować

To jest Wiki Wiki; edytuj i dodawaj funkcje, które Twoim zdaniem powinienem wdrożyć!

Format: „ nativeFunctionName( nameInMyLanguage)”

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

0

Weź również funkcje z APL i HQ9 +!

  • Skróty, jak w APL. EDYCJA: właśnie zobaczyłem odpowiedź „aliasy Unicode”. O to mi chodziło :)
  • Inne skróty zorientowane na golfa, jak w H9 +, HQ9 +, CHIQRSX9 +

Okej, więc jak byś to zaproponował? Jakieś konkretne pomysły?
Klamka

znaki Unicode pozwalające na wykonywanie skomplikowanych czynności w jednym znaku.
xem

@Doorknob of Snow, zaktualizowałem swoją odpowiedź skrótami, które chciałbym zobaczyć: te z APL i te z CHIRQSX9 + :)
xem

Hmm, rzecz hq9 + wydaje się zbyt cheaty :-P
klamce

Jest zorientowany na golfa: P, moim zdaniem, twój język powinien zrobić przynajmniej tak samo :)
xem

0

Wyraźne oddzielenie wbudowanych

np. stolice: wbudowane; dzięki czemu B dla bazy jest wykonalne


1
Jak wspomniano powyżej, nie ma potrzeby oddzielania. Jeśli ktoś lubi zastąpić wbudowane narzędzie, powinien to zrobić. Znalazłem nawet przydatne aplikacje takich operatorów zastępujących {-}:+.
Howard

Nie ma potrzeby, również w tym języku nie będzie rozróżniana wielkość liter.
Klamka

2
Ponieważ celem jest zapewnienie mniejszej liczby uderzeń na dołek, posiadanie rozróżniania wielkości liter i więcej wbudowanych skutecznie prowadzi do określenia misji.

0

Zmienne lokalne / zamknięcia

Jedną z rzeczy, których tak naprawdę brakuje w GolfScript, jest możliwość tymczasowej zmiany wartości symbolu .

W szczególności obecnie nie ma możliwości tymczasowego zastąpienia znaczenia „prymitywnego” wbudowanego: gdy raz, powiedzmy, redefiniujesz $, już nigdy nie będziesz sortować niczego w tym programie. (Cóż, przynajmniej bez napisania własnej implementacji sortowania). Byłoby naprawdę miło móc powiedzieć na przykład, że w tym bloku kodu $ oznacza coś innego, ale nadal ma normalne znaczenie w innym miejscu.

W związku z powyższym dobrze byłoby powiązać symbole w bloku kodu z ich bieżącą wartością . Pewnie, mogę pisać, mówić {$-1%}:rsorti być w stanie używać rsortdo sortowania i odwracania tablicy, ale działa to tylko tak długo, jak długo definicja $(lub -1lub %) się nie zmienia, ponieważ moja rsortfunkcja wciąż wywołuje symbol globalny $. Byłoby miło móc powiedzieć „zróbmy rsortto, co $-1%obecnie się dzieje, nawet jeśli te symbole zostaną później ponownie zdefiniowane”.

W szczególności standardowa biblioteka może korzystać z tego rodzaju wiązania. To trochę zaskakujące, gdy zdajemy sobie sprawę, że, powiedzmy, zmiana nzmienia zachowanie putslub że redefiniowanie !całkowicie popsuło xor. (Z drugiej strony należy tutaj zachować ostrożność, ponieważ w szczególności możliwość zmiany zachowania putsokazuje się być jedynym sposobem na uniknięcie drukowania ostatecznego nowego wiersza w obecnej wersji GS.)

Edycja: Możliwość przekształcenia symboli z powrotem w bloki kodu miałaby długą drogę do wdrożenia tej funkcji. W szczególności {foo}_składnia sugerowana w tej odpowiedzi skutecznie wykonałaby jeden poziom wiązania statycznego poprzez rozwinięcie wszystkich symboli w bloku kodu. Połącz to z kombinatorem punktowym do głębokiego wiązania statycznego, a Bob jest twoim wujem ...


Chodź - wszystkie nowe, wymyślne języki świętują leniwe oceny ;-) Zachowajmy tę funkcję w GolfScript.
Howard

Z drugiej strony - masz rację, jest to raczej cecha wiązania niż oceny. Ale potem - wiązanie statyczne jest bardziej złożone niż się wydaje - np. Zapewnia rekurencyjne wywołania wewnątrz definicji.
Howard

„zróbmy rsortto, co $-1%obecnie robi, nawet jeśli te symbole zostaną później ponownie zdefiniowane” Więc Emmental?
CalculatorFeline

0

Więcej wbudowanych funkcji

Spraw, aby wszystkie jednoliterowe zmienne az i AZ pełniły jakąś ogólną, przydatną funkcję. Niektóre wbudowane, których brakuje:

  • min i max: wszystkie lub niektóre z 2 najwyższych wartości stosu, najwyższych n wartości stosu, ponad tablicą
  • całkowita wartość
  • suma i iloczyn tablicy. dlaczego, {+}*kiedy możesz S? Masz tutaj 52 funkcje do pracy!
  • Dystans na Manhattanie ( x1 y1 x2 y2 --> abs(x2-x1)+abs(y2-y1)teraz. Musiałby być, @-A@@-A+jeśli Ajest wbudowaną wartością bezwzględną. Przyznaję, że pojawił się tylko w związku z moim najnowszym postem, ale zawsze myślałem, że to dobry sposób na rozszerzenie gry w golfa: zapisz co przydatne byłoby posiadanie, gromadzenie i dodawanie ich jako wbudowanych funkcji.
  • Konwertuj liczbę całkowitą na ciąg jednoznakowy (odpowiednik ciągu python chr).
  • Przelej ciąg na stos (obecnie {}/)
  • Wersja :tego zużywa to, co jest przechowywane. To by się nie przydało, aby utknąć w identyfikatorach.
  • Operatorzy dla >=,<=
  • Jak ktoś sugerował, sposób na umieszczenie zmiennej zawierającej blok na stosie bez wykonywania go. Możesz więc zmniejszyć ifs formularza 1{\}{|}ifdo czegoś podobnego1?\?|if
  • Wbudowana konwersja base64 i obsługa zlib sprawiają, że osadzanie danych zajmuje mniej znaków
  • Poza base64 utwórz niestandardowe kodowanie base93 (używając wszystkich drukowalnych znaków, które nie są ogranicznikami łańcucha).
  • Skróty do 1$, 2$, 3$, 4$,5$
  • Operator do skopiowania dwóch górnych elementów stosu, jakimi są, tj \.@.@\

-3

Byłoby miło, gdyby wartość zapisana lub obliczona w ostatnim wierszu funkcji została automatycznie zwrócona


3
Jest oparty na stosach, więc ...
marinus

1
Nie ma czegoś takiego jak funkcja.
Peter Taylor,

Funkcje nic nie zwracają ... i nazywa się je blokami
Klamka

To może być miłe ... w jakimś innym języku. (Nigdy więcej irytujących instrukcji zwrotnych na końcu funkcji! Tak! (Ale ja nigdy nie potrzebowałem instrukcji zwrotnych, więc ...))
CalculatorFeline
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.