Estou planejando escrever um GolfScript aprimorado para programas ainda mais curtos que podem fazer mais coisas. Isto não é um desafio; é um pedido de feedback e dicas sobre o que devo fazer. (ver tags)
Não tenho certeza se esse deve ser o Wiki da comunidade. Se você acha, basta sinalizar para um moderador convertê-lo :)
Essa linguagem será muito semelhante ao GolfScript. Ainda está escrito em Ruby. No entanto, há algumas diferenças:
- Usando
`
como um delimitador de string, por ser um caractere incomum, será necessário menos escape. (Outro personagem pode substituir sua função, como#
(mais sobre isso mais tarde)).\`
para escapar de um backtick,\\
para escapar de uma barra invertida e não há outras seqüências de escape. Se você precisar de uma nova linha, basta inserir uma nova linha literal na string. - Usando Ruby's
Rational
para o ponto flutuante de precisão arbitrária, uma das principais falhas do GolfScript. - A capacidade de converter tipos para outros tipos. Por exemplo, você pode converter um bloco em uma string.
- Expressões regulares. Provavelmente criado com
"..."
. Os operadores também serão sobrecarregados. Por exemplo"\W"~{`Invalid: non-word character`}{`OK`}if
,. Será executado automaticamente quando pressionado de uma variável, como blocos. - Objetos File e Date, para fazer mais coisas impossíveis no GolfScript. Eles não terão literais, mas terão funções para inicializá-los, como
`file.txt`fl
(o nome da função de criação de arquivo pode mudar). - Hashes talvez, mas não tenho certeza disso. Eu devo?
- O Helper funciona para fazer ainda mais. Por exemplo,
`http://example.com`net
para acesso à rede (novamente, onet
operador pode ser renomeado).rb
para executar uma string como código Ruby. Haverá muito mais desses; sugestões bem-vindas. - Sem comentários, para que
#
possa ser usado para outra coisa. Se você quiser um comentário,`comment here`;
funcionará bem. (Talvez#
possa substituir`
a função) - Ele será completamente reescrito de forma que será muito mais fácil adicionar funções. Basicamente, o código será mais legível. (Você viu a fonte GolfScript?
:/
) - Ele estará no Github para que possa ser trabalhado em colaboração. Vou licenciá-lo no MIT ou algo assim.
- Nenhuma nova linha final, portanto, as cotações mais baratas funcionam: P
E eu estou separando essas coisas porque acho que são as mudanças mais drásticas e úteis (exceto, talvez, a adição de ponto flutuante):
- Ele terá muitas funções Ruby integradas. Por exemplo,
shuffle
(que pode ser abreviado parasf
) (assumiu 9 caracteres anteriormente ),tr
(anteriormente 14 caracteres ),sample
(sm
, anteriormente.,rand=
),flatten
(fl
anteriormente ???), etc. - Será esmagado, como Rebmu. Por exemplo, agora você pode fazer
~:a0<{0a-}aIF
(usando um nome de variável de letra) em vez de~:$0<{0$-}$if
(substituir a função de classificação). (exemplo daqui ). Observe que, dessa maneira, não diferencia maiúsculas de minúsculas, e números não são permitidos em nomes de variáveis. Tudo bem na minha opinião, pois é uma linguagem de golfe: P - Ele terá depuração. Adicionarei a capacidade de fornecer um sinalizador especificando delimitadores de matriz, delimitadores de elemento etc., saída de número (racional, float ou int?), Percorrendo as instruções uma por vez, tokenizando e emitindo cada token em vez de executar o programa, etc.
Então, minha pergunta é: o que há para melhorar? O que você acha que devo adicionar?
Alguma outra idéia para isso, antes de começar a codificá-lo?
code-golf
tips
golfscript
Maçaneta da porta
fonte
fonte
Respostas:
E / S flexível
No momento, o Golfscript não pode ser usado para programas interativos. Proponho que sejam adicionadas algumas funções para entrada explícita (por exemplo
readline
,getchar
e amigos). O intérprete deve verificar se o programa os utiliza antes de executá-lo.Se o programa não chamar nenhuma função de entrada, o intérprete deve agir como o Golfscript normalmente.
Eu não esperaria que o intérprete detecta funções de entrada no código avaliado gerado em tempo de execução, mas se, de alguma forma, puder fazer isso, parabéns.
fonte
Built-ins mais curtos
Aliases de caractere único para todos os comandos internos que não os possuem. Eu usaria
base
muito mais se fosse justoB
.fonte
b
como um nome de variável? Ainda; boa ideia; lembre-se de não usar esse nome se for usar a função e, se não estiver usando a função, isso não afetará você.^
ou$
) como nomes de variáveis. Não piora esse problema. Além disso, sugeri aliases para permitir compatibilidade com versões anteriores; portanto, você teria que usar o nome mais longo se tivesse atribuído outra coisa ao alias mais curto.Z
poiszip
também seria muito útil.#include
e"#{IO.read'lib'}"~
é muito longo).mylang -Llibname somefile.ext
.Div-mod combinado
Este é um nicho um pouco mais do que algumas sugestões, mas, ao trabalhar em programas de teoria dos números, frequentemente me pego desejando uma operação que apareça dois números inteiros
a
eb
da pilha e empurrea/b
ea%b
. (Atualmente é isso1$1$/@@%
).fonte
dvm
DiV-Mod. Obrigado por todas as idéias :-) +1Números
Altere o lexer de modo que 0 à esquerda não faça parte de um número:
Números negativos também devem ser escritos com
_
:fonte
0 100-
100 negativa. +1~
. Por exemplo, -1 é0~
. Isso torna um número pequeno de números mais longo em um caractere, mas elimina a necessidade moderadamente frequente de espaço em branco depois-
.{0\-}:~;
(~
diminui o número de números) e usarnot
bit a bit (assim comoand or xor
)?Acesso a toda a pilha
GolfScript é uma linguagem baseada em pilha, mas o acesso a todos, exceto os três principais itens da pilha, é limitado
<integer>$
para copiar o enésimo item. Seria útil ter algo como oroll
comando PostScript para facilitar o trabalho com mais de três variáveis "ativas".Idealmente, haveria versões de um e dois argumentos, mas se não houver nomes suficientes por aí, o argumento deverá ter preferência por um de um caractere.
O one-arg one leva apenas o número de itens para rolar. Por exemplo
1 roll
, não faz nada;2 roll
é equivalente a\
;3 roll
é equivalente a@
;4 roll
e para números mais altos não tem um equivalente existente; o mais próximo possível é algo como(e isso nem lida com não-inteiros em determinadas posições da pilha, ou ativos
[
, e quase certamente quebra dentro de loops também).O de dois argumentos também leva uma quantidade para rolar;
a b roll2
é equivalente a{a roll}b*
.fonte
rotate
. Você deve editar isso na resposta da CW.roll
apenas gira o array, certo?CJam
Eu implementei "um GolfScript aprimorado" e ele é chamado CJam - http://sf.net/p/cjam
Agora, no segundo lançamento (versão 0.6), ele já possui muitos, senão a maioria dos recursos discutidos aqui. Vou tentar listá-los:
`
como um delimitador de string - não, mas usa strings com aspas duplas com escape mínimo (\
somente escape\
e"
)`http://example.com`net
-"example.com"g
#
usado para outra coisa,"comments like this";
mr
er
_,mr=
depuração - apenas rastreios de pilha e
ed
operador para mostrar a pilhaE / S flexível - sim, mas apenas entrada explícita
b
= base,z
= zip-
- sim, mas não com_
;1 2-3
->1 2 -3
;1 2m3
->-1 3
t
md
m*
et
ea
e<
,e>
z
(GolfScript temabs
, não falta):+
,:*
c
(converte em um caractere, não em uma string){}/
:
disso consome o que é armazenado - não>=
,<=
- não, use<!
,>!
1$1$
O CJam possui muito mais recursos, confira https://sourceforge.net/p/cjam/wiki/Operators/
fonte
Mude o lexer
O lexer do GolfScript trata um identificador Ruby (qualquer coisa que corresponda ao regex
[_a-zA-Z][_a-zA-Z0-9]*
) como um único token. Se, em vez disso, fosse tratado[a-zA-Z]+
como um token, seria liberado_
para ser incorporado e permitiria que uma variável alfa fosse seguida por um número inteiro literal sem separar o espaço em branco.fonte
[a-z]+|[A-Z]+
, para o mushing, então o sublinhado é gratuito. Esta é uma idéia interessante e muito original! +1Aliases Unicode
Comandos de vários caracteres podem ter aliases unicode. Isso economizaria a pontuação quando a contagem fosse contada em caracteres e não em bytes.
fonte
Classificação estável
Os
$
blocos internos devem executar uma classificação estável.fonte
Operador de conjunto de matrizes
Qualquer embutido que possamos disponibilizar para isso?
fonte
Identificadores de caracteres únicos
Não é como se uma solução de código de golfe tivesse muitas variáveis. E economizaria em espaços.
fonte
% conforme incorporado para o produto
fonte
Suporte Regex
A falta de suporte a regex sempre me pareceu estranho em um idioma projetado para jogar golfe. Seria ótimo ter
<string> <string> <string> y
(ou sejatr
, usando o alias de um caractere do Perl)<string> <string> <string> s
(substituto)<string> <string> <block> s
(substituir com retorno de chamada)<string> <string> m
(Combine)fonte
Builtins para data / hora atuais
Atualmente, é muito peculiar obter data / hora usando o Ruby evals.
fonte
Faça |, & e ^ built-ins fazerem algo útil em blocos
Por exemplo,
<array/string> <block> |
pode ser usado como função de índiceAlguma idéia para
<array/string> <block> &
ou<array/string> <block> ^
?fonte
array block =
faz agora?"0<" {0<} =
.array block =
para "selecionar pelo predicado",
.Uma maneira de transformar símbolos novamente em blocos de código
Atualmente, podemos vincular blocos de código a símbolos com
:
, mas não há como reverter o processo: executar um símbolo vinculado a um bloco de código apenas executa o bloco.Eu posso ver algumas maneiras de implementar isso:
adicione nova sintaxe, por exemplo,
#foo
para enviar o valorfoo
para a pilha, mesmo que seja um bloco de código, ouadicione um operador para expandir todos os símbolos em um bloco de código, para que (usando
_
como o novo operador), por exemplo{2*}:dbl; {dbl dbl}_
, produza{2* 2*}
.Eu posso ver vantagens para ambos os métodos. O último poderia substituir o primeiro, ao custo de dois caracteres extras (em
{foo}_
vez de#foo
), mas posso ver alguns aplicativos em potencial para a sintaxe anterior, onde esses dois caracteres seriam proibitivos (por exemplo, usar emarray #func %
vez dearray {func} %
).Enquanto isso, a sintaxe anterior poderia ser usada para substituir a última se houvesse uma maneira conveniente de iterar os tokens em um bloco de código (que poderia ser útil por si só).
Em ambos os casos, eu proporia que os símbolos de expansão vinculados aos incorporados nativos (ou seja, implementados no código Ruby) devolveriam algum tipo de stub que poderia ser chamado para obter a funcionalidade do embutido, além de ser impossível ou apenas improvável de ser substituído. Por exemplo
#$
(ou{$}_
) poderia retornar{builtin_dollar}
, por exemplo , ondebuiltin_dollar
conteria a implementação real do$
built-in (e#builtin_dollar
ou{builtin_dollar}_
deveria apenas retornar por{builtin_dollar}
si mesmo).Isso permitiria que os internos fossem redefinidos sem perder o acesso às suas funcionalidades (consulte minha sugestão anterior ), de modo que, se por algum motivo eu quisesse trocar os significados de
$
e@
, eu poderia apenas fazer#$ #@ :$; :@;
(ou{$}_ {@}_ :$; :@;
).fonte
_
operador deve fazer se o bloco de código contiver atribuições de variáveis. O óbvio seria deixar os:symbol
tokens intocados e expandir qualquer outra coisa, mas isso causaria_
a quebra de qualquer código usando variáveis locais. Fazer isso não quebrar esse código pode ser impraticávelmente complicado.[[1] [2] [3]] _ -> [1 2 3]
.2:A;{1:A;A}_
?{1:A;2}
(ou, para ser técnico,{1:A builtin_semicolon 2}
se o recurso de expansão embutido estiver incluído). Se algum tipo de recurso "exclusão de variável local" fosse incluído, ele poderia ser plausivelmente avaliado como justo{1:A;A}
.{builtin_1 :A builtin_semicolon 2}
.Predefinição de variável com argumentos de linha de comando
Infelizmente, não há nenhum caractere deixado sem atribuição, mas talvez possamos usá
A
-lo?fonte
_
está disponível. Talvez isso? Enfim, sim, o golfscript precisa de uma maneira de usar a linha cmd args +1Funções nativas de Ruby que devo implementar
Este é o Wiki da comunidade; fique à vontade para editar e adicionar as funções que você acha que devo implementar!
Formato: "
nativeFunctionName
(nameInMyLanguage
)"shuffle
(sf
)tr
(tr
)sample
(sm
)fonte
Aproveite também os recursos do APL e HQ9 +!
fonte
Separando claramente os embutidos
por exemplo, capitais: embutidos; tornando B viável para a base
fonte
{-}:+
.Variáveis / fechamentos locais
Uma coisa que realmente sinto falta no GolfScript é a capacidade de alterar temporariamente o valor de um símbolo .
Em particular, atualmente não há como substituir temporariamente o significado de um built-in "primitivo": uma vez que você redefine, por exemplo,
$
nunca mais classificará nada nesse programa. (Bem, não sem escrever sua própria implementação de classificação, pelo menos.) Seria muito bom poder dizer, por exemplo, que nesse bloco de código$
significa outra coisa, mas ainda assim mantenha o significado normal em outro lugar.Relacionado ao acima, seria bom vincular símbolos em um bloco de código ao seu valor atual . Claro, eu posso escrever, dizer
{$-1%}:rsort
e poder usarrsort
para classificar e reverter uma matriz, mas isso funciona apenas desde que a definição de$
(ou-1
ou%
) não mude, pois minharsort
função ainda está chamando o símbolo global$
. Seria bom poder dizer "deixersort
fazer o que$-1%
atualmente faz, mesmo que esses símbolos sejam redefinidos posteriormente".Em particular, a biblioteca padrão pode usar esse tipo de ligação. É meio surpreendente perceber que, digamos, mudar
n
muda o comportamento deputs
, ou que redefinir!
completamente atrapalhaxor
. (Mais uma vez, deve-se ter cautela aqui, já que, em particular, a capacidade de alterar o comportamento deputs
acaba sendo a única maneira de evitar a impressão de uma nova linha final na versão atual do GS.)Editar: Ser capaz de transformar símbolos novamente em blocos de código ajudaria bastante a implementar essa funcionalidade. Em particular, a
{foo}_
sintaxe sugerida nessa resposta efetivamente executaria um nível de ligação estática, expandindo todos os símbolos em um bloco de código. Combine isso com um combinador de ponto de fixação para ligação estática profunda e Bob é seu tio ...fonte
rsort
fazer o que$-1%
atualmente faz, mesmo que esses símbolos sejam redefinidos mais tarde" Então, Emmental?Mais funções integradas
Faça com que todas as variáveis de letra única az e AZ executem alguma função genérica e útil. Alguns built-ins que estão faltando:
{+}*
quando você pode fazerS
? Você tem 52 funções para trabalhar aqui!x1 y1 x2 y2 --> abs(x2-x1)+abs(y2-y1)
agora teria que ser@-A@@-A+
seA
é um valor absoluto embutido. Concedido isso apenas surgiram os resultados do meu post mais recente, mas sempre achei que seria uma boa maneira de expandir o script de golfe: escreva o que funções seriam úteis para ter, coletá-las e adicioná-las como integradas.chr
).{}/
):
disso consome o que está armazenado. Isso teria que não ficar 'preso' aos identificadores para ser útil.>=
,<=
1{\}{|}if
para algo como1?\?|if
1$
,2$
,3$
,4$
,5$
\.@.@\
fonte
Seria bom se o valor escrito ou calculado na última linha de uma função fosse retornado automaticamente
fonte