Eine verbesserte Version von GolfScript [geschlossen]


12

Ich plane, ein verbessertes GolfScript für noch kürzere Programme zu schreiben, die mehr können. Dies ist keine Herausforderung. Es ist eine Bitte um Feedback und Tipps, was ich tun soll. (siehe tags)

Ich bin mir nicht sicher, ob dies Community Wiki sein soll. Wenn Sie so denken, markieren Sie es einfach, damit ein Moderator es konvertiert :)

Diese Sprache wird GolfScript sehr ähnlich sein. Es ist immer noch in Ruby geschrieben. Es gibt jedoch einige Unterschiede:

  • Wird `als Zeichenkettenbegrenzer verwendet, da es sich um ein ungewöhnliches Zeichen handelt, sodass weniger Escapezeichen erforderlich sind. (Ein anderes Zeichen kann seine Funktion ersetzen, wie #(dazu später mehr)). \`einem Backtick \\zu entkommen, einem Backslash zu entkommen, und es gibt keine anderen Escape-Sequenzen. Wenn Sie eine neue Zeile benötigen, kleben Sie einfach eine tatsächliche wörtliche Zeile in die Zeichenfolge.
  • Die Verwendung von Ruby's Rationalfür Gleitkommazahlen mit willkürlicher Genauigkeit ist einer der Hauptfehler von GolfScript.
  • Die Möglichkeit, Typen in andere Typen zu konvertieren. Sie können beispielsweise einen Block in eine Zeichenfolge konvertieren.
  • Reguläre Ausdrücke. Wahrscheinlich erstellt mit "...". Die Operatoren werden auch für sie überlastet. Zum Beispiel "\W"~{`Invalid: non-word character`}{`OK`}if. Wird automatisch ausgeführt, wenn von einer Variablen wie Blöcken gedrückt wird.
  • Datei- und Datumsobjekte, um mehr Dinge zu tun, die in GolfScript nicht möglich waren. Diese haben keine Literale, aber Funktionen zum Initialisieren, wie zB `file.txt`fl(der Name der Funktion zum Erstellen von Dateien kann sich ändern).
  • Haschs vielleicht, aber da bin ich mir nicht sicher. Sollte ich?
  • Der Helfer kann noch mehr. Zum Beispiel `http://example.com`netfür den Netzwerkzugriff (erneut kann der netBetreiber umbenannt werden). rbum einen String als Ruby-Code auszuführen. Es wird noch viel mehr davon geben; Vorschläge willkommen.
  • Keine Kommentare, so dass #für etwas anderes verwendet werden kann. Wenn Sie einen Kommentar wünschen, `comment here`;wird gut funktionieren. (Vielleicht #kann `'s die Funktion ersetzen )
  • Es wird komplett neu geschrieben, so dass das Hinzufügen von Funktionen viel einfacher wird. Grundsätzlich ist der Code besser lesbar. (Haben Sie die GolfScript-Quelle gesehen? :/)
  • Es wird auf Github sein, damit gemeinsam daran gearbeitet werden kann. Ich werde es unter MIT lizenzieren oder so.
  • Keine abschließende Newline, daher funktionieren betrügerische Quines: P

Und ich setze diese Punkte auseinander, weil ich denke, dass sie die drastischsten und hilfreichsten Änderungen sind (außer vielleicht das Hinzufügen von Gleitkommazahlen):

  • Es werden viele Ruby-Funktionen eingebaut. Zum Beispiel shuffle(was abgekürzt werden kann sf) (früher 9 Zeichen ), tr(früher 14 Zeichen ), sample( smfrüher .,rand=), flatten( flfrüher ???) usw.
  • Es wird wie Rebmu gemixt. Zum Beispiel können Sie jetzt ~:a0<{0a-}aIF(unter Verwendung eines Buchstabenvariablennamens) anstatt ~:$0<{0$-}$if(die Sortierfunktion zu überschreiben). (Beispiel von hier ). Beachten Sie, dass auf diese Weise die Groß- und Kleinschreibung nicht berücksichtigt wird und in Variablennamen keine Zahlen zulässig sind. Dies ist meiner Meinung nach in Ordnung, da es eine Golfsprache ist: P
  • Es wird ein Debugging haben. Ich werde die Möglichkeit hinzufügen, ein Flag bereitzustellen, das Array-Begrenzer, Element-Begrenzer usw. angibt, die Ausgabe von Zahlen (rational, float oder int?), Schrittweise Anweisungen durchläuft, jedes Token tokenisiert und ausgibt, anstatt das Programm auszuführen. etc.

Meine Frage lautet also: Was gibt es zu verbessern? Was denkst du sollte ich hinzufügen?

Irgendwelche anderen Ideen dafür, bevor ich anfange, es zu codieren?


Beachten Sie, dass beim Hinzufügen von Mushing die Groß- und Kleinschreibung nicht mehr berücksichtigt wird.
Marinus

@marinus Mir ist klar, dass. Ich hätte das klarstellen sollen; Bearbeitung ...
Türklinke

Was es auch wirklich braucht, ist eine Möglichkeit, explizite E / A (für interaktive Programme) durchzuführen. Der Interpreter kann im Voraus prüfen, ob das Programm explizite E / A verwendet, und implizite E / A nur, wenn dies nicht der Fall ist.
Marinus

@marinus Toll, das solltest du dann als Antwort hinzufügen :)
Türklinke

1
@Claudiu Meine Entwicklung in meiner neuen Sprache ist ziemlich lebendig, obwohl ich in letzter Zeit ziemlich beschäftigt war, also habe ich eine Weile nicht mehr viel damit gemacht. Einige dieser Ideen sind jedoch keine guten Ideen, die ich nicht verwende: P
Türklinke

Antworten:


17

Flexibles I / O

Golfscript kann derzeit nicht für interaktive Programme verwendet werden. Ich schlage vor , einige Funktionen für explizite Eingabe hinzugefügt werden ( das heißt readline,getchar und Freunde). Der Interpreter sollte prüfen, ob das Programm diese verwendet, bevor es ausgeführt wird.

Wenn das Programm keine Eingabefunktionen aufruft, sollte sich der Interpreter wie bei Golfscript verhalten.

Ich würde nicht erwarten, dass der Interpreter Eingabefunktionen in ausgewertetem Code erkennt, der zur Laufzeit generiert wird, aber wenn er das irgendwie kann, ein dickes Lob.


Das ist eine großartige Idee. limited io ist eine der großen einschränkungen von golfscript. +1
Türklinke

11

Kürzere Einbauten

Einzelzeichen-Aliase für alle eingebauten Befehle, die diese nicht haben. Ich würde baseviel mehr verwenden, wenn es nur so wäre B.


Aber was ist, wenn Sie bals Variablennamen verwenden? Immer noch; gute Idee; Sie müssen nur daran denken, diesen Namen nicht zu verwenden, wenn Sie die Funktion verwenden möchten, und wenn Sie die Funktion nicht verwenden, hat dies keinerlei Auswirkungen auf Sie.
Türklinke

@DoorknobofSnow, Sie können bereits integrierte (und sogar Tokens wie ^oder $) als Variablennamen verwenden. Es macht dieses Problem nicht schlimmer. Außerdem habe ich Aliase vorgeschlagen, um die Abwärtskompatibilität zu ermöglichen. Sie müssten also nur den längeren Namen verwenden, wenn Sie dem kürzeren Alias ​​etwas anderes zugewiesen hätten.
Peter Taylor

4
Zfür zipwäre auch sehr nützlich.
Howard

Vielleicht können wir eine offizielle Standardbibliothek für GolfScript veröffentlichen. Ich bin mir aber nicht sicher, wie es in Lösungen aufgenommen werden kann (fehlt #includeund "#{IO.read'lib'}"~ist zu lang).
Howard

@Howard Nun, das ist eine Idee ... Ich könnte meiner Sprache Bibliotheken hinzufügen, vielleicht wie mylang -Llibname somefile.ext.
Türklinke

9

Kombinierter Div-Mod

Das ist ein bisschen mehr Nische als einige der Vorschläge, aber wenn sie auf zahlentheoretische Programmen arbeiten selbst finde ich häufig eine Operation zu wollen , die zwei ganze Zahlen erscheinen aund baus dem Stapel und Stösse a/bund a%b. (Derzeit ist dies 1$1$/@@%).


Da es so eine Nische ist, vielleicht so etwas wie dvmfür DiV-Mod. Danke für all die Ideen :-) +1
Türklinke

8

Zahlen

Ändern Sie das Lexer so, dass führende 0 nicht Teil einer Zahl ist:

# current behaviour
01     # -> 1

# new
01     # -> 0 1

_Stattdessen sollten auch negative Zahlen geschrieben werden:

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

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

Wow, das ist interessant. Normalerweise schiebt man normalerweise nicht zwei Zahlen hintereinander, aber das würde viel helfen. Das Negative ist auch großartig, anstatt 0 100-für das Negative 100. +1
Türklinke

1
Ich habe darüber schon einmal nachgedacht. Es sollte überhaupt keine Unterstützung für negative Integer-Literale geben. Es wird bereits von gehandhabt ~. ZB -1 ist 0~. Dies verlängert eine kleine Anzahl von Zahlen um ein Zeichen, beseitigt jedoch die mäßig häufige Notwendigkeit von Leerzeichen danach -.
Peter Taylor

Warten Sie eine Minute, wie würden Sie beispielsweise 1001 drücken? Ich denke, Sie meinten die führende Null, nicht die nachlaufende.
Türklinke

@DoorknobofSnow Richtig.
Howard

Was denkst du darüber, eine Zahl zu tun {0\-}:~;( ~negativ zu machen) und notbitweise zu verwenden (genau wie and or xor)?
Türklinke

8

Zugriff auf den gesamten Stapel

GolfScript ist eine stapelbasierte Sprache, aber der Zugriff auf alle Elemente außer den drei obersten auf dem Stapel ist auf <integer>$das Kopieren des n-ten Elements beschränkt. Es wäre nützlich, so etwas wie den PostScript- rollBefehl zu haben, damit es einfacher ist, mit mehr als drei "Live" -Variablen zu arbeiten.

Idealerweise gibt es eine Ein-Argument- und eine Zwei-Argument-Version, aber wenn nicht genügend Namen in der Nähe sind, sollte das Ein-Argument eine Ein-Zeichen-Version bevorzugen.

Die Ein-Argument-Eins nimmt nur die Anzahl der zu würfelnden Gegenstände. ZB 1 rollmacht nichts; 2 rollist gleichbedeutend mit \; 3 rollist gleichbedeutend mit @; 4 rollund für höhere Nummern gibt es kein vorhandenes Äquivalent; das nächstmögliche ist so etwas wie

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

(und das behandelt nicht einmal Nicht-Ganzzahlen an bestimmten Positionen des Stapels oder aktiv [und bricht mit ziemlicher Sicherheit auch innerhalb von Schleifen).

Die Zwei-Argumente-Variante benötigt ebenfalls einen Betrag, um zu würfeln. a b roll2ist äquivalent zu {a roll}b*.


Also, wie Ruby's rotate. Sie sollten dies in der CW-Antwort bearbeiten.
Türknauf

@Doorknob, nein. Ich spreche von einer Operation auf einem Slice des Stapels, nicht auf einem Array.
Peter Taylor

Ähm ... Ich bin mir nicht sicher, was du meinst. Ich kenne mich nicht mit Postscript aus, sondern rolldrehe nur das Array, oder?
Türknauf

@DoorknobofSnow, Stapel . Ein Array ist ein Element, das auf dem Stapel abgelegt wird.
Peter Taylor

Oh, also dreht es den ganzen Stapel . Ah, das könnte nützlich sein! +1
Türklinke

8

CJam

Ich habe "ein verbessertes GolfScript" implementiert und es heißt CJam - http://sf.net/p/cjam. In
der zweiten Version (Version 0.6) enthält es bereits viele, wenn nicht die meisten der hier diskutierten Funktionen. Ich werde versuchen, sie aufzulisten:

  • noch in Ruby - Nope, Java geschrieben
  • Verwenden `als Zeichenkettenbegrenzer - nein, aber es werden Zeichenketten in doppelten Anführungszeichen mit minimalem Escape-Zeichen verwendet ( \nur Escape- Zeichen \und ")
  • Gleitkomma - unterstützt, aber nur Standard "double", keine willkürliche Genauigkeit
  • Typen in andere Typen konvertieren - ja
  • reguläre Ausdrücke - noch nicht, aber geplant; verwendet reguläre Zeichenfolgen mit speziellen Operatoren
  • Datei- und Datumsobjekte - nein, kann aber das aktuelle Datum / die aktuelle Uhrzeit abrufen
  • Hashes - vorausgesetzt, diese sind wie Python-Diktate oder Java-Maps, dann werden sie nicht unterstützt (wird möglicherweise in Zukunft berücksichtigt)
  • Hilfsfunktionen, um noch mehr zu erreichen - ja, sehr viel
  • `http://example.com`net - "example.com"g
  • führe einen string als ruby ​​code aus - nope
  • keine Kommentare - genau, #für etwas anderes verwendet,"comments like this";
  • einfachere Funktionen hinzuzufügen - ich denke schon, aber ich bin auch voreingenommen :)
  • auf Github - noch besser (meiner Meinung nach nicht fotografieren) - auf SourceForge mit hg
  • lizenziert unter MIT - ja
  • kein abschließender Zeilenumbruch - richtig
  • Mischen - mr
  • tr - er
  • Probe - nicht fertig, _,mr=
  • Abflachen - nicht getan, aber wahrscheinlich leichter zu erreichen
  • Nein, aber die Bezeichner müssen nicht getrennt werden
  • Debugging - Nur Stapel-Traces und edOperator zum Anzeigen des Stapels

  • flexible I / O - ja, aber nur explizite Eingabe

  • kürzere Einbauten - ja, b= Sockel, z= Reißverschluss
  • separate führende 0 - nein, kann aber vordefinierte Variablen verwenden
  • klarstellen -- ja, aber nicht mit _; 1 2-3-> 1 2 -3; 1 2m3->-1 3
  • den Stapel rollen / drehen - nein
  • Array-Set - t
  • divmod - md
  • Ändern Sie das Lexer (für Bezeichner) - ja, mehr unten
  • kartesisches Produkt - nicht genau das gleiche, aber ja, m*
  • Unicode-Operatoren - Nr
  • Einzelzeichen-IDs - Vordefinierte Operatoren haben 1 oder 2 Zeichen, und Variablen sind Großbuchstaben mit Einzelzeichen. Sie können alle verkettet werden, ohne den Lexer / Parser zu verwirren
  • Bediener auf Blöcken - Nr
  • stabile Sorte - ja
  • Symbole wieder in Codeblöcke umwandeln - nein, kann aber später hinzugefügt werden
  • aktuelles Datum / Uhrzeit - et
  • Befehlszeilenargumente - ea
  • Eingebaute Elemente klar voneinander trennen - ja, aber Großbuchstaben sind Variablen; Built-Ins sind oder beginnen mit Kleinbuchstaben und Sonderzeichen
  • min und max - ja, die derzeit nur für 2 Werte: e<,e>
  • absoluter Wert - z(GolfScript hatabs nicht gefehlt)
  • Summe und Produkt eines Arrays - :+,:*
  • Manhattan Entfernung - nein
  • chr - c(konvertiert in ein Zeichen, keine Zeichenkette)
  • Verschütten Sie eine Zeichenfolge auf den Stapel - CJam-Zeichenfolgen bestehen aus Zeichen und nicht aus Zahlen. um die Charaktere zu verschütten ist es still{}/
  • eine Version von : davon verbraucht, was gespeichert ist - nein
  • Operatoren für >=, <=- nein, verwenden <!,>!
  • base64 und zlib - nope
  • Abkürzungen für 1 $, 2 $, 3 $, 4 $, 5 $ - nein
  • Kopieren Sie die beiden obersten Stapelelemente - geplant; für jetzt verwenden1$1$
  • lokale Variablen - nein
  • HQ9 + Funktionen - nein, danke

CJam hat viel mehr Funktionen, siehe https://sourceforge.net/p/cjam/wiki/Operators/


7
Ich bin nicht einverstanden damit, dass SourceForge und Mercurial besser sind als GitHub.
nyuszika7h

1
@ nyuszika7h es ist in Ordnung, wir haben alle unsere Vorlieben
aditsu kündigen, weil SE ist böse

Ich habe gerade meine allererste CJam-Antwort gepostet , weil meine GolfScript-Antwort dringend eine richtige sqrt-Funktion benötigte. CJam ist viel schneller als GolfScript!
Dennis

@ Tennis Awesome :)
aditsu verlassen, weil SE ist EVIL

@aditsu Würden Sie CJam als einen GolfScript-Dialekt oder eine neue, von GolfScript inspirierte Sprache betrachten? (Hier ist der Grund, warum ich frage : codegolf.stackexchange.com/questions/37464/… )
Martin Ender

6

Ändern Sie den Lexer

Der GolfScript-Lexer behandelt einen Ruby-Bezeichner (alles, was mit dem regulären Ausdruck übereinstimmt [_a-zA-Z][_a-zA-Z0-9]*) als einen einzigen Token. Wenn es stattdessen [a-zA-Z]+als Token behandelt wird , entsteht ein integriertes Token, auf das _eine Alpha-Variable von einer Literal-Ganzzahl gefolgt werden kann, ohne Leerzeichen zu trennen.


Naja, momentan benutze ich einfach [a-z]+|[A-Z]+zum Mushen, also ist der Unterstrich kostenlos. Dies ist jedoch eine interessante und sehr einzigartige Idee! +1
Türklinke

5

Unicode-Aliase

Befehle mit mehreren Zeichen können Unicode-Aliase enthalten. Dies würde die Punktzahl einsparen, wenn die Punktzahl in Zeichen und nicht in Bytes gezählt wird.


7
Äh ... wir wollen keine weitere APL ...
John Dvorak

1
Golfscript ist nichts wie APL, Unicode oder nein. Wir haben bereits mehrere andere APLs, wie J und K. (oder sogar R, das für mich ziemlich APL-inspiriert aussieht, bis zu dem Punkt, dass Sie häufig wörtliche Übersetzungen machen können)
Marinus

Das Besondere an APL ist, dass es einen ganz anderen Zeichensatz verwendet als alles andere, und nicht, dass es Vektorarithmetik nativ verwendet. Ich mag J, ich benutze es und ich stimme J Antworten im Allgemeinen zu. Ich habe noch upvote eine APL Antwort. Wenn ich meine Programme malen wollte, anstatt sie zu schreiben, würde ich Piet verwenden.
John Dvorak

Ich denke, APL ist besser lesbar als J, sicherlich besser lesbar als Golfscript.
Marinus

5

Stabile Sorte

Die $eingebauten Blöcke sollten eine stabile Sortierung ausführen.


5

Array-Set-Operator

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

Können wir dafür ein eingebautes Gerät zur Verfügung stellen?


+1 Ich habe angefangen, einen Blog-Beitrag über die Implementierung von Array-Sets zu schreiben, habe ihn aber nie abgeschlossen. Es ist derzeit extrem schwer in voller Allgemeinheit. Dies würde für einige Herausforderungen einen großen Unterschied bedeuten.
Peter Taylor

Ich kann nicht glauben, dass dies nicht bereits in Golfscript eingebaut ist. +1
Türklinke

5

Einzelzeichen-IDs

Es ist nicht so, dass eine Code-Golf-Lösung zu viele Variablen enthalten würde. Und es würde Platz sparen.


Hmm .. Dies könnte auch durch Ändern des Parsers erfolgen. Vielleicht eine Flagge, um dieses Verhalten zu spezifizieren? Großartige Idee! +1
Türklinke

4

% als eingebaut für Produkt

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

+1; Sie könnten meine CW-Antwort bearbeiten und diese hinzufügen
Türknauf

Was ist mit Modulo?
MilkyWay90

3

Regex-Unterstützung

Der Mangel an Regex-Unterstützung hat mich in einer für das Golfen konzipierten Sprache immer als merkwürdig empfunden. Es wäre toll zu haben

  • <string> <string> <string> y(auch bekannt trals Perls One-Char-Alias)
  • <string> <string> <string> s (Ersatz)
  • <string> <string> <block> s (durch Rückruf ersetzen)
  • <string> <string> m (Spiel)

Ich habe in meiner Frage bereits Regex erwähnt.
Türknauf


3

Make |, & and ^ built-ins do something useful on blocks

E.g. <array/string> <block> | can be used as index function

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

Any ideas for <array/string> <block> & or <array/string> <block> ^?


What does array block = do now?
John Dvorak

@JanDvorak Compare. Useful if you want to compare a string to a block, e.g. "0<" {0<} =.
Howard

How often do you need that? I'd rather drop that, and use array block = for "select by predicate"
John Dvorak

@JanDvorak select by predicate is already implemented using ,.
Howard

oh, never mind. Go on :-)
John Dvorak

2

A way to turn symbols back into code blocks

Currently, we can bind code blocks to symbols with :, but there's no way to reverse the process: executing a symbol bound to a code block just executes the block.

I can see a couple of ways to implement this:

  1. add new syntax, e.g. #foo to push the value of foo to the stack, even if it's a code block, or

  2. add an operator to expand every symbol in a code block, so that (using _ as the new operator), e.g. {2*}:dbl; {dbl dbl}_ would produce {2* 2*}.

I can see advantages to both methods. The latter could substitute for the former, at the cost of two extra chars ({foo}_ instead of #foo), but I can see some potential applications for the former syntax where those two chars would be prohibitive (e.g. using array #func % instead of array {func} %).

Meanwhile, the former syntax could be used to replace the latter if there was a convenient way to somehow iterate over the tokens in a code block (which could be useful on its own, anyway).


In either case, I'd propose that expanding symbols that are bound to native built-ins (i.e. implemented in Ruby code) should return some kind of stub that could be called to obtain the functionality of the built-in, while being either impossible or just unlikely to be overridden. For example #$ (or {$}_) could return e.g. {builtin_dollar}, where builtin_dollar would contain the actual implementation of the $ built-in (and #builtin_dollar or {builtin_dollar}_ should just return {builtin_dollar} itself).

This would allow built-ins to be redefined without losing access to their functionality (see my earlier suggestion), so that if I, say, for some reason wanted to swap the meanings of $ and @, I could just do #$ #@ :$; :@; (or {$}_ {@}_ :$; :@;).


One detail I'm not sure of is what the _ operator should do if the code block contains variable assignments. The obvious thing would be to just leave any :symbol tokens untouched and expand anything else, but this would cause _ to break any code using local variables. Making it not break such code might be impractically complicated, though.
Ilmari Karonen

1
Your second version would fit together with an flatten operator on arrays: [[1] [2] [3]] _ -> [1 2 3].
Howard

So what would be the result of 2:A;{1:A;A}_?
Howard

Naïvely, {1:A;2} (or, to be technical, {1:A builtin_semicolon 2} if the built-in expansion feature was included). If some kind of "local variable exclusion" feature was included, it might plausibly evaluate to just {1:A;A}.
Ilmari Karonen

Or to be even more technical {builtin_1 :A builtin_semicolon 2}.
Howard

1

Variable preset with command line args

Unfortunately, there isn't any char left unassigned, but maybe we can use A for that?


_ is available. Perhaps that? Anyway, yes, golfscript needs a way of taking cmd line args +1
Doorknob

0

Native Ruby functions that I should implement

This is Community Wiki; feel free to edit and add the functions you think I should implement!

Format: "nativeFunctionName (nameInMyLanguage)"

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

0

Take features from APL and HQ9+ too!

  • Shortcuts, like in APL. EDIT: just saw the answer "unicode aliases". That's what I meant :)
  • Other golf-oriented shortcuts, like in H9+, HQ9+, CHIQRSX9+

Okay, so how would you propose that? Any specific ideas?
Doorknob

unicode characters allowing to do complex things in just one character.
xem

@Doorknob of Snow , I updated my answer with the shortcuts I'd like to see: those from APL, and those from CHIRQSX9+ :)
xem

Hmm, the hq9+ thing seems too cheaty :-P
Doorknob

It's golf oriented :P im my opinion your language should do at least as well :)
xem

0

Clearly separating built-ins

e.g. capitals : built-ins ; making B for base feasable


1
As mentioned above there is no need to separate. If someone likes to overwrite a builtin he should be able to do so. I even found useful applications of overwriting operators like {-}:+.
Howard

No need, also this language will be case insensitive.
Doorknob

2
Since the goal is to provide less strokes per hole, having case sensitivity and more built-ins effectively leads towards the mission statement.

0

Local variables / closures

One thing I really miss in GolfScript is the ability to temporarily change the value of a symbol.

In particular, there's currently no way to temporarily override the meaning of a "primitive" built-in: once you, say, redefine $, you're never going to sort anything in that program again. (Well, not without writing your own sort implementation, at least.) It would be really nice to be able to say, for example, that in this code block $ means something else, but still keep the normal meaning elsewhere.

Related to the above, it would be nice to bind symbols in a code block to their current value. Sure, I can write, say, {$-1%}:rsort and be able to use rsort to sort and reverse an array, but that works only as long as the definition of $ (or -1 or %) doesn't change, since my rsort function is still calling the global symbol $. It would be nice to be able to say "let rsort do what $-1% currently does, even if those symbols are later redefined."

In particular, the standard library could use this kind of binding. It's kind of surprising to realize that, say, changing n changes the behavior of puts, or that redefining ! completely messes up xor. (Then again, some caution should be exercised here, since, in particular, the ability to change the behavior of puts turns out to be turns out to be the only way to avoid printing a final newline in the current version of GS.)

Edit: Being able to turn symbols back into code blocks would go a long way towards implementing this functionality. In particular, the {foo}_ syntax suggested in that answer would effectively perform one level of static binding by expanding all symbols in a code block. Combine that with a fixpoint combinator for deep static binding, and Bob's your uncle...


Come on - all the fancy new languages celebrate lazy evaluation ;-) Let's keep that feature in GolfScript.
Howard

On second thought - you're right, it is more a feature of binding than evaluation. But then - static binding is more complex than it sounds - e.g. provide recursive calls inside a definition.
Howard

"let rsort do what $-1% currently does, even if those symbols are later redefined" So Emmental?
CalculatorFeline

0

More built-in functions

Make all the single-letter variables a-z and A-Z perform some generic, useful function. Some built-ins that are lacking:

  • min and max: all or some of top 2 stack values, top n stack values, over an array
  • absolute value
  • sum and product of an array. why do {+}* when you can do S? You have 52 functions to work with here!
  • Manhattan distance (i.e. x1 y1 x2 y2 --> abs(x2-x1)+abs(y2-y1). Now it'd have to be @-A@@-A+ if A is a built-in absolute value. Granted this only came up caues of my most recent post but I always figured that'd be a good way to expand golfscript: write down what functions would be handy to have, collect them, and add them as built-ins.
  • Convert an integer to a one-character string (equivalent of python's chr).
  • Spill a string onto the stack (currently {}/)
  • A version of : that consumes what is stored. This would have to not get 'stuck' to identifiers to be useful.
  • Operators for >=, <=
  • As someone suggested, a way to put a variable containing a block onto the stack without executing it. So you could reduce ifs of the form 1{\}{|}if to something like 1?\?|if
  • Built-in base64 conversion and zlib support to make embedding data take less characters
  • Beyond base64, make a custom base93 encoding (using all printable characters that aren't the string delimiter).
  • Shortcuts for 1$, 2$, 3$, 4$, 5$
  • An operator to copy the top two stack items as they are, i.e. \.@.@\

-3

It'd be nice if the value written or computed in the last line of a function was automatically returned


3
It's stack-based, so...
marinus

1
There's no such thing as a function.
Peter Taylor

Functions don't return anything... and they're called blocks
Doorknob

That might be nice...in some other language. (No more annoying return statements at the end of functions! Yay! (But I haven't needed return statements ever, so...))
CalculatorFeline
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.