Je prévois d'écrire un GolfScript amélioré pour des programmes encore plus courts qui peuvent faire plus de choses. Ce n'est pas un défi; c'est une demande de rétroaction et de conseils sur ce que je dois faire. (voir tags)
Je ne sais pas si cela devrait être un wiki communautaire. Si vous le pensez, il suffit de signaler un modérateur pour le convertir :)
Ce langage sera très similaire à GolfScript. Il est toujours écrit en Ruby. Cependant, il présente quelques différences:
- Utilisation
`
comme délimiteur de chaîne, car il s'agit d'un caractère inhabituel, donc moins d'échappement sera nécessaire. (Un autre personnage peut remplacer sa fonction, comme#
(plus à ce sujet plus tard)).\`
pour échapper à un backtick,\\
pour échapper à une barre oblique inverse, et il n'y a pas d'autres séquences d'échappement. Si vous avez besoin d'une nouvelle ligne, collez simplement une nouvelle ligne littérale réelle dans la chaîne. - Utilisation de Ruby
Rational
pour une virgule flottante de précision arbitraire, l'un des principaux défauts de GolfScript. - La possibilité de convertir des types en d'autres types. Par exemple, vous pouvez convertir un bloc en chaîne.
- Expressions régulières. Probablement créé avec
"..."
. Les opérateurs seront également surchargés pour eux. Par exemple"\W"~{`Invalid: non-word character`}{`OK`}if
,. S'exécute automatiquement lorsqu'il est poussé à partir d'une variable, comme des blocs. - Objets Fichier et Date, pour faire plus de choses qui étaient impossibles dans GolfScript. Ceux-ci n'auront pas de littéraux, mais auront des fonctions pour les initialiser, comme
`file.txt`fl
(le nom de la fonction de création de fichier peut changer). - Hashs peut-être, mais je ne suis pas sûr à ce sujet. Devrais-je?
- Fonctions d'aide pour faire encore plus. Par exemple,
`http://example.com`net
pour l'accès au réseau (encore une fois, l'net
opérateur peut être renommé).rb
pour exécuter une chaîne en tant que code Ruby. Il y en aura beaucoup plus; suggestions bienvenues. - Pas de commentaires, donc ça
#
peut être utilisé pour autre chose. Si vous voulez un commentaire,`comment here`;
cela fonctionnera bien. (Peut-être#
peut remplacer`
la fonction de) - Il sera complètement réécrit de manière à ce qu'il soit beaucoup plus facile d'ajouter des fonctions. Fondamentalement, le code sera plus lisible. (Avez-vous vu la source GolfScript?
:/
) - Il sera sur Github afin qu'il puisse être travaillé en collaboration. Je vais le concéder sous licence MIT ou quelque chose.
- Pas de nouvelle ligne finale, donc les quines tricheuses fonctionnent: P
Et je les distingue parce que je pense que ce sont les changements les plus drastiques et les plus utiles (sauf peut-être l'ajout de virgule flottante):
- Il aura de nombreuses fonctions Ruby intégrées. Par exemple,
shuffle
(qui peut être abrégé ensf
) (a précédemment pris 9 caractères ),tr
(auparavant 14 caractères ),sample
(sm
, précédemment.,rand=
),flatten
(fl
, précédemment ???), etc. - Il sera écrasé, comme Rebmu. Par exemple, vous pouvez maintenant faire
~:a0<{0a-}aIF
(en utilisant un nom de variable de lettre) au lieu de~:$0<{0$-}$if
(écraser la fonction de tri). (exemple d'ici ). Notez que de cette façon, il ne respecte pas la casse et les nombres ne sont pas autorisés dans les noms de variables. C'est correct à mon avis car c'est une langue de golf: P - Il aura un débogage. J'ajouterai la possibilité de fournir un indicateur spécifiant les délimiteurs de tableau, les délimiteurs d'éléments, etc., la sortie numérique (rationnelle, flottante ou int?), Parcourant les instructions une par une, jetant et sortant chaque jeton au lieu d'exécuter le programme, etc.
Alors, ma question est: qu'est-ce qu'il y a à améliorer? Que pensez-vous que je devrais ajouter?
Avez-vous d'autres idées à ce sujet avant de commencer à le coder?
la source
Réponses:
E / S flexibles
Golfscript ne peut actuellement pas être utilisé pour des programmes interactifs. Je propose d'ajouter quelques fonctions pour une entrée explicite (c.
readline
-à- d .getchar
Et amis). L'interpréteur doit voir si le programme les utilise avant de l'exécuter.Si le programme n'appelle aucune fonction d'entrée, l'interpréteur doit agir comme Golfscript le fait normalement.
Je ne m'attendrais pas à ce que l'interpréteur détecte les fonctions d'entrée dans le code évalué généré lors de l'exécution, mais si cela peut le faire, bravo.
la source
Intégrés plus courts
Alias à un seul caractère pour toutes les commandes intégrées qui n'en ont pas. J'en utiliserais
base
beaucoup plus si c'était justeB
.la source
b
comme nom de variable? Encore; bonne idée; vous vous souvenez juste de ne pas utiliser ce nom si vous allez utiliser la fonction, et si vous n'utilisez pas la fonction, cela ne vous affecte pas du tout.^
ou$
) comme noms de variables. Cela n'aggrave pas ce problème. De plus, j'ai suggéré des alias pour permettre la compatibilité descendante, donc il vous suffirait d'utiliser le nom plus long si vous aviez assigné autre chose à l'alias plus court.Z
carzip
serait également très utile.#include
et"#{IO.read'lib'}"~
trop long).mylang -Llibname somefile.ext
.Div-mod combiné
Ceci est un peu plus créneau que quelques - unes des suggestions, mais lorsque l'on travaille sur les programmes en nombre théorétique je trouve souvent moi - même vouloir une opération qui apparaît deux entiers
a
etb
de la pile et poussea/b
eta%b
. (À l'heure actuelle, c'est1$1$/@@%
).la source
dvm
pour DiV-Mod. Merci pour toutes les idées :-) +1Nombres
Modifiez le lexeur de sorte que le 0 en tête ne fasse pas partie d'un nombre:
Les nombres négatifs doivent également être écrits à la
_
place:la source
0 100-
100 négatifs. +1~
. Par exemple, -1 est0~
. Cela rallonge un petit nombre de chiffres d'un caractère, mais supprime le besoin modérément fréquent d'espaces après-
.{0\-}:~;
(~
négatif-un nombre) et d'utilisernot
pour bit à bit (tout commeand or xor
)?Accès à toute la pile
GolfScript est un langage basé sur la pile, mais l'accès à tous, sauf les trois premiers éléments de la pile, est limité
<integer>$
à la copie du nième élément. Il serait utile d'avoir quelque chose comme laroll
commande de PostScript pour qu'il soit plus facile de travailler avec plus de trois variables "live".Idéalement, il y aurait des versions à un argument et à deux arguments, mais s'il n'y a pas assez de noms, le seul argument devrait avoir la préférence pour un seul caractère.
Celui à un argument prend simplement le nombre d'objets à lancer. Par exemple,
1 roll
ne fait rien;2 roll
est équivalent à\
;3 roll
est équivalent à@
;4 roll
et pour les nombres supérieurs n'a pas d'équivalent existant; le plus proche possible est quelque chose comme(et cela ne gère même pas les non entiers à certaines positions de la pile, ou actifs
[
, et se casse presque certainement aussi à l'intérieur des boucles).Celui à deux arguments prend également un montant à rouler;
a b roll2
est équivalent à{a roll}b*
.la source
rotate
. Vous devez modifier cela dans la réponse CW.roll
tourne simplement le tableau, non?CJam
J'ai implémenté "un GolfScript amélioré" et il s'appelle CJam - http://sf.net/p/cjam
Maintenant, dans la deuxième version (version 0.6), il a déjà beaucoup, sinon la plupart des fonctionnalités discutées ici. Je vais essayer de les lister:
`
comme délimiteur de chaîne - non, mais il utilise des chaînes entre guillemets doubles avec un échappement minimal (\
échappements uniquement\
et"
)`http://example.com`net
-"example.com"g
#
utilisé pour autre chose,"comments like this";
mr
er
_,mr=
débogage - uniquement les traces de pile et
ed
opérateur pour afficher la pileE / S flexibles - oui, mais uniquement entrée explicite
b
= base,z
= zip-
- oui, mais pas avec_
;1 2-3
->1 2 -3
;1 2m3
->-1 3
t
md
m*
et
ea
e<
,e>
z
(GolfScript aabs
, ne manque pas):+
,:*
c
(converti en caractère, pas en chaîne){}/
:
qui consomme ce qui est stocké - non>=
,<=
- non, utiliser<!
,>!
1$1$
CJam a beaucoup plus de fonctionnalités, consultez https://sourceforge.net/p/cjam/wiki/Operators/
la source
Changer le lexer
Le lexer de GolfScript traite un identificateur Ruby (tout ce qui correspond à l'expression régulière
[_a-zA-Z][_a-zA-Z0-9]*
) comme un seul jeton. Si au lieu de cela, il était traité[a-zA-Z]+
comme un jeton, cela se libérerait_
pour être intégré et permettrait à une variable alpha d'être suivie d'un entier littéral sans séparer les espaces.la source
[a-z]+|[A-Z]+
pour le mushing, donc le soulignement est gratuit. C'est une idée intéressante et très unique! +1Alias Unicode
Les commandes à plusieurs caractères peuvent avoir des alias Unicode. Cela permettrait d'économiser sur le score lorsque le score est compté en caractères et non en octets.
la source
Tri stable
Les
$
blocs intégrés doivent effectuer un tri stable.la source
Opérateur d'ensemble de tableaux
Y a-t-il une fonction intégrée que nous pouvons mettre à disposition pour cela?
la source
Identifiants à un seul caractère
Ce n'est pas comme si une solution de golf de code comportait trop de variables. Et cela économiserait de l'espace.
la source
% intégré au produit
la source
Prise en charge de Regex
Le manque de support des regex m'a toujours paru étrange dans un langage conçu pour le golf. Ce serait formidable d'avoir
<string> <string> <string> y
(akatr
, en utilisant l' alias à un caractère de Perl pour cela)<string> <string> <string> s
(remplacer)<string> <string> <block> s
(substitut avec rappel)<string> <string> m
(rencontre)la source
Builtins pour la date / heure actuelle
Il est actuellement très excentrique d'obtenir la date / l'heure en utilisant des rubis evals.
la source
Les commandes intégrées |, & et ^ font quelque chose d'utile sur les blocs
Par exemple,
<array/string> <block> |
peut être utilisé comme fonction d'indexDes idées pour
<array/string> <block> &
ou<array/string> <block> ^
?la source
array block =
-on maintenant?"0<" {0<} =
.array block =
pour "sélectionner par prédicat",
.Un moyen de transformer les symboles en blocs de code
Actuellement, nous pouvons lier des blocs de code à des symboles avec
:
, mais il n'y a aucun moyen d'inverser le processus: l'exécution d'un symbole lié à un bloc de code exécute simplement le bloc.Je peux voir quelques façons de mettre en œuvre cela:
ajouter une nouvelle syntaxe, par exemple
#foo
pour pousser la valeur defoo
dans la pile, même s'il s'agit d'un bloc de code, ouajouter un opérateur pour développer chaque symbole dans un bloc de code, de sorte que (en utilisant
_
comme nouvel opérateur), par exemple{2*}:dbl; {dbl dbl}_
, produise{2* 2*}
.Je peux voir les avantages des deux méthodes. Ce dernier pourrait se substituer au premier, au prix de deux caractères supplémentaires (
{foo}_
au lieu de#foo
), mais je peux voir quelques applications potentielles pour l'ancienne syntaxe où ces deux caractères seraient prohibitifs (par exemple, utiliserarray #func %
au lieu dearray {func} %
).Pendant ce temps, l'ancienne syntaxe pourrait être utilisée pour remplacer la seconde s'il existait un moyen pratique d'itérer d'une manière ou d'une autre sur les jetons dans un bloc de code (qui pourrait être utile en soi, de toute façon).
Dans les deux cas, je proposerais que l'expansion des symboles liés aux composants natifs (c'est-à-dire implémentés dans le code Ruby) retourne une sorte de stub qui pourrait être appelé pour obtenir la fonctionnalité du module intégré, tout en étant impossible ou tout simplement peu susceptible d'être annulé. Par exemple
#$
(ou{$}_
) pourrait retourner par exemple{builtin_dollar}
, oùbuiltin_dollar
contiendrait l'implémentation réelle de la fonction$
intégrée (et#builtin_dollar
ou{builtin_dollar}_
devrait simplement se retourner{builtin_dollar}
).Cela permettrait aux redéfinitions intégrées d'être redéfinies sans perdre l'accès à leurs fonctionnalités (voir ma suggestion précédente ), de sorte que si, disons, pour une raison quelconque , je voulais permuter la signification de
$
et@
, je pourrais simplement le faire#$ #@ :$; :@;
(ou{$}_ {@}_ :$; :@;
).la source
_
opérateur doit faire si le bloc de code contient des affectations de variables. La chose évidente serait de laisser les:symbol
jetons intacts et de développer quoi que ce soit d'autre, mais cela provoquerait la_
rupture de tout code à l'aide de variables locales. Cependant, faire en sorte qu'il ne casse pas un tel code pourrait être compliqué.[[1] [2] [3]] _ -> [1 2 3]
.2:A;{1:A;A}_
?{1:A;2}
(ou, pour être technique,{1:A builtin_semicolon 2}
si la fonction d'extension intégrée était incluse). Si une sorte de «exclusion de variable locale» était incluse, elle pourrait vraisemblablement être évaluée comme juste{1:A;A}
.{builtin_1 :A builtin_semicolon 2}
.Préréglage variable avec des arguments de ligne de commande
Malheureusement, il n'y a aucun caractère non affecté, mais peut-être pouvons-nous l'utiliser
A
pour cela?la source
_
est disponible. Peut-être ça? Quoi qu'il en soit, oui, golfscript a besoin d'un moyen de prendre les arguments de la ligne cmd +1Fonctions Ruby natives que je devrais implémenter
Ceci est le wiki communautaire; n'hésitez pas à modifier et ajouter les fonctions que vous pensez que je devrais implémenter!
Format: "
nativeFunctionName
(nameInMyLanguage
)"shuffle
(sf
)tr
(tr
)sample
(sm
)la source
Profitez également des fonctionnalités APL et HQ9 +!
la source
Séparer clairement les éléments intégrés
par exemple, les capitales: intégrées; rendre B pour la base réalisable
la source
{-}:+
.Variables locales / fermetures
Une chose qui me manque vraiment dans GolfScript est la possibilité de changer temporairement la valeur d'un symbole .
En particulier, il n'y a actuellement aucun moyen de remplacer temporairement la signification d'un intégré "primitif": une fois que vous avez, par exemple, redéfini
$
, vous ne trierez plus jamais rien dans ce programme. (Eh bien, pas sans avoir écrit votre propre implémentation de tri, au moins.) Ce serait vraiment bien de pouvoir dire, par exemple, que dans ce bloc de code$
signifie autre chose, mais gardez toujours le sens normal ailleurs.En relation avec ce qui précède, il serait bien de lier les symboles d'un bloc de code à leur valeur actuelle . Bien sûr, je peux écrire, dire
{$-1%}:rsort
et pouvoir utiliserrsort
pour trier et inverser un tableau, mais cela ne fonctionne que tant que la définition de$
(ou-1
ou%
) ne change pas, car marsort
fonction appelle toujours le symbole global$
. Ce serait bien de pouvoir dire "laissersort
faire ce$-1%
qui se passe actuellement, même si ces symboles sont redéfinis plus tard".En particulier, la bibliothèque standard pourrait utiliser ce type de liaison. Il est assez surprenant de constater que, par exemple, le changement
n
change le comportement deputs
, ou que la redéfinition!
gâche complètementxor
. (Là encore, une certaine prudence doit être exercée ici, car, en particulier, la possibilité de modifier le comportement desputs
tours s'avère être le seul moyen d'éviter d'éviter l'impression d'un retour à la ligne final dans la version actuelle de GS.)Edit: La possibilité de reconvertir les symboles en blocs de code contribuerait grandement à la mise en œuvre de cette fonctionnalité. En particulier, la
{foo}_
syntaxe suggérée dans cette réponse effectuerait efficacement un niveau de liaison statique en développant tous les symboles dans un bloc de code. Combinez cela avec un combinateur de points fixes pour une liaison statique profonde, et Bob est votre oncle ...la source
rsort
faire ce que fait$-1%
actuellement, même si ces symboles sont redéfinis plus tard" Alors Emmental?Plus de fonctions intégrées
Faites en sorte que toutes les variables à lettre unique az et AZ remplissent une fonction générique et utile. Quelques éléments intégrés qui manquent:
{+}*
quand vous pouvez le faireS
? Vous avez 52 fonctions avec lesquelles travailler ici!x1 y1 x2 y2 --> abs(x2-x1)+abs(y2-y1)
. Maintenant , il faudrait être@-A@@-A+
siA
est intégré en valeur absolue Accordé cela ne est venu caues de mon. Poste le plus récent mais j'ai toujours pensé que ce serait un bon moyen d'élargir golfscript: écrire ce les fonctions seraient utiles pour les avoir, les collecter et les ajouter en tant que fonctions intégrées.chr
).{}/
):
cela consomme ce qui est stocké. Cela ne devrait pas être «collé» aux identifiants pour être utile.>=
,<=
1{\}{|}if
à quelque chose comme1?\?|if
1$
,2$
,3$
,4$
,5$
\.@.@\
la source
Ce serait bien si la valeur écrite ou calculée dans la dernière ligne d'une fonction était retournée automatiquement
la source