Una versión mejorada de GolfScript [cerrado]

12

Estoy planeando escribir un GolfScript mejorado para programas aún más cortos que pueden hacer más cosas. Esto no es un desafío; Es una solicitud de retroalimentación y consejos sobre lo que debo hacer. (ver etiquetas)

No estoy seguro de si esto debería ser Community Wiki. Si crees que sí, solo marca un moderador para convertirlo :)

Este lenguaje será muy similar a GolfScript. Todavía está escrito en Ruby. Sin embargo, tiene algunas diferencias:

  • Utilizándolo `como delimitador de cadena, porque es un carácter poco común, por lo que se necesitará menos escape. (Otro personaje puede reemplazar su función, como #(más sobre eso más adelante)). \`para escapar de un backtick, \\para escapar de una barra diagonal inversa, y no hay otras secuencias de escape. Si necesita una nueva línea, simplemente pegue una nueva línea literal real en la cadena.
  • Usando Ruby's Rationals para punto flotante de precisión arbitraria, uno de los principales defectos de GolfScript.
  • La capacidad de convertir tipos a otros tipos. Por ejemplo, puede convertir un bloque en una cadena.
  • Expresiones regulares. Probablemente creado con "...". Los operadores también estarán sobrecargados por ellos. Por ejemplo, "\W"~{`Invalid: non-word character`}{`OK`}if. Se ejecutará automáticamente cuando se empuje desde una variable, como bloques.
  • Objetos de archivo y fecha, para hacer más cosas que eran imposibles en GolfScript. Estos no tendrán literales, pero tendrán funciones para inicializarlos, como `file.txt`fl(el nombre de la función de creación de archivos puede cambiar).
  • Hashes tal vez, pero no estoy seguro de eso. ¿Debería?
  • Funciones de ayuda para hacer aún más. Por ejemplo, `http://example.com`netpara el acceso a la red (nuevamente, se netpuede cambiar el nombre del operador). rbejecutar una cadena como código Ruby. Habrá muchos más de estos; Sugerencias bienvenidas.
  • No hay comentarios, por lo que #puede usarse para otra cosa. Si quieres un comentario, `comment here`;funcionará bien. (Tal vez #pueda reemplazar `la función de)
  • Se reescribirá por completo de manera que sea mucho más fácil agregar funciones. Básicamente, el código será más legible. (¿Has visto la fuente de GolfScript? :/)
  • Estará en Github para que se pueda trabajar en colaboración. Lo licenciaré bajo MIT o algo así.
  • No hay una nueva línea final, por lo que las quines truculentas funcionan: P

Y los estoy diferenciando porque creo que son los cambios más drásticos y útiles (excepto quizás agregar punto flotante):

  • Tendrá muchas funciones de Ruby integradas. Por ejemplo, shuffle(que puede abreviarse como sf) (anteriormente tomaba 9 caracteres ), tr(anteriormente 14 caracteres ), sample( sm, previamente .,rand=), flatten( fl, anteriormente ???), etc.
  • Será aplastado, como Rebmu. Por ejemplo, ahora puede hacerlo ~:a0<{0a-}aIF(usando un nombre de variable de letra) en lugar de ~:$0<{0$-}$if(sobrescribiendo la función de clasificación). (ejemplo de aquí ). Tenga en cuenta que de esta manera, no distingue entre mayúsculas y minúsculas, y no se permiten números en los nombres de variables. Esto está bien en mi opinión ya que es un lenguaje de golf: P
  • Tendrá depuración. Agregaré la capacidad de proporcionar un indicador que especifique delimitadores de matriz, delimitadores de elementos, etc., salida de número (racional, flotante o int?), Siguiendo las instrucciones de una en una, tokenizando y generando cada token en lugar de ejecutar el programa, etc.

Entonces, mi pregunta es: ¿qué hay para mejorar? ¿Qué crees que debería agregar?

¿Alguna otra idea para esto, antes de comenzar a codificarlo?

Pomo de la puerta
fuente
Tenga en cuenta que si agrega mushing pierde sensibilidad a mayúsculas y minúsculas.
marinus
@marinus me doy cuenta de eso. Debería haberlo dejado claro; edición ...
Pomo de la puerta
Además, lo que realmente necesita es una forma de hacer E / S explícitas (para programas interactivos). El intérprete podría verificar de antemano si el programa usa E / S explícita y solo E / S implícita si no lo hace.
marinus
@marinus Genial, deberías agregar eso como respuesta entonces :)
Pomo de la puerta
1
@Claudiu Mi desarrollo en mi nuevo lenguaje está bastante vivo, aunque recientemente he estado bastante ocupado, así que no he hecho mucho con él por un tiempo. Sin embargo, algunas de estas ideas simplemente no son buenas, que no estoy usando: P
Pomo de la puerta

Respuestas:

17

E / S flexible

Golfscript no se puede utilizar actualmente para programas interactivos. Propongo que se agreguen algunas funciones para la entrada explícita (es decir readline, getchary amigos). El intérprete debería ver si el programa los usa antes de ejecutarlo.

Si el programa no llama a ninguna función de entrada, el intérprete debe actuar como lo hace normalmente Golfscript.

No esperaría que el intérprete detecte las funciones de entrada en el código evaluado generado en tiempo de ejecución, pero si de alguna manera puede hacer eso, felicitaciones.

marinus
fuente
Esta es una gran idea; io limitado es una de las grandes limitaciones de golfscript. +1
Pomo de la puerta
11

Incorporaciones más cortas

Alias ​​de un solo carácter para todos los comandos integrados que no los tienen. Usaría basemucho más si fuera justo B.

Peter Taylor
fuente
Pero, ¿qué pasa si se usa bcomo nombre de variable? Todavía; buena idea; solo recuerda no usar ese nombre si vas a usar la función, y si no estás usando la función, entonces no te afecta en absoluto.
Pomo de la puerta
@DoorknobofSnow, ya puede usar incorporados (e incluso tokens como ^o $) como nombres de variables. No empeora ese problema. Además, sugerí alias para permitir la compatibilidad con versiones anteriores, por lo que solo tendría que usar el nombre más largo si hubiera asignado algo más al alias más corto.
Peter Taylor
44
Zpara ziptambién sería muy útil.
Howard
Tal vez podamos lanzar una biblioteca estándar oficial para GolfScript. Pero no tengo claro cómo se puede incluir en las soluciones (falta #includey "#{IO.read'lib'}"~es demasiado largo).
Howard
@Howard Ahora que es una idea ... podría agregar bibliotecas a mi idioma, tal vez como mylang -Llibname somefile.ext.
Pomo de la puerta
9

Div-mod combinado

Este es un poco más nicho que algunas de las sugerencias, pero cuando trabajo en programas de teoría de números, frecuentemente me encuentro con ganas de una operación que saca dos enteros ay bde la pila y empuja a/by a%b. (En la actualidad esto es 1$1$/@@%).

Peter Taylor
fuente
Dado que es tan nicho, tal vez algo así como dvmpara DiV-Mod. Gracias por todas las ideas :-) +1
Pomo de la puerta
8

Números

Cambie el lexer de modo que el 0 inicial no forme parte de un número:

# current behaviour
01     # -> 1

# new
01     # -> 0 1

También los números negativos deben escribirse con _:

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

# new
1 2_3     # -> 1 2 -3
Howard
fuente
Wow eso es interesante. Por lo general, no suele presionar dos números seguidos, pero esto ayudaría mucho con eso. Lo negativo también es genial, en lugar de 0 100-100 negativo. +1
Pomo de la puerta
1
He pensado en esto antes. No debería haber ningún soporte para literales enteros negativos en absoluto. Ya está manejado por ~. Por ejemplo, -1 es 0~. Esto alarga un pequeño número de números en un carácter, pero elimina la necesidad moderadamente frecuente de espacios en blanco después -.
Peter Taylor
Espera un minuto, ¿cómo presionarías, por ejemplo, 1001? Creo que te referías al cero inicial, no al final.
Pomo de la puerta
@DoorknobofSnow Right.
Howard
¿Qué pensarías de hacer {0\-}:~;( ~un número negativo) y usarlo notpara bit a bit (como and or xor)?
Pomo de la puerta
8

Acceso a toda la pila.

GolfScript es un lenguaje basado en la pila, pero el acceso a todos menos los tres elementos principales de la pila se limita <integer>$a copiar el enésimo elemento. Sería útil tener algo como el rollcomando PostScript para que sea más fácil trabajar con más de tres variables "en vivo".

Idealmente, habría versiones de un argumento y de dos argumentos, pero si no hay suficientes nombres, entonces el argumento de un argumento debería tener preferencia por uno de un carácter.

El de un argumento solo toma el número de elementos para rodar. Por ejemplo 1 roll, no hace nada; 2 rolles equivalente a \; 3 rolles equivalente a @; 4 rolly para números más altos no tiene un equivalente existente; lo más cercano posible es algo así como

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

(y eso ni siquiera maneja números no enteros en ciertas posiciones en la pila, o activos [, y casi con seguridad también se rompe dentro de los bucles).

El de dos argumentos también toma una cantidad para rodar; a b roll2es equivalente a {a roll}b*.

Peter Taylor
fuente
Entonces, como el de Ruby rotate. Debería editar esto en la respuesta CW.
Pomo de la puerta
@Pomo de la puerta, no. Estoy hablando de operar en una porción de la pila, no en una matriz.
Peter Taylor
Umm ... no estoy seguro de lo que quieres decir. No estoy familiarizado con PostScript, pero rollsolo gira la matriz, ¿verdad?
Pomo de la puerta
@DoorknobofSnow, apilar . Una matriz es un elemento que va en la pila.
Peter Taylor
Oh, entonces gira toda la pila . ¡Ah, eso podría ser útil! +1
Pomo de la puerta
8

CJam

He implementado "un GolfScript mejorado" y se llama CJam - http://sf.net/p/cjam
Ahora en la segunda versión (versión 0.6) ya tiene muchas, si no la mayoría de las características discutidas aquí. Trataré de enumerarlos:

  • todavía escrito en Ruby - no, java
  • usando `como delimitador de cadena: no, pero usa cadenas entre comillas dobles con \escapes mínimos ( solo escapes \y ")
  • coma flotante - compatible, pero solo estándar "doble", no precisión arbitraria
  • convertir tipos a otros tipos: sí
  • expresiones regulares, aún no, pero planificadas; usará cadenas regulares con operadores especiales
  • Objetos de archivo y fecha: no, pero puede obtener la fecha / hora actual
  • hashes: suponiendo que sean como dictados de python o mapas de Java, entonces no son compatibles (puede considerar en el futuro)
  • funciones auxiliares para hacer aún más, sí, mucho
  • `http://example.com`net - "example.com"g
  • ejecutar una cadena como código Ruby - no
  • sin comentarios, exactamente, #usado para otra cosa,"comments like this";
  • más fácil de agregar funciones: creo que sí, pero también soy parcial :)
  • en Github - incluso mejor (en mi opinión, por favor no dispare) - en SourceForge, usando hg
  • licenciado bajo MIT - sí
  • sin nueva línea final - derecha
  • barajar mr
  • tr - er
  • muestra - no hecho, _,mr=
  • aplanar: no hecho, pero probablemente más fácil de lograr
  • mushed - no, pero los identificadores no necesitan separarse
  • depuración: solo trazas de pila y edoperador para mostrar la pila

  • E / S flexible: sí, pero solo entrada explícita

  • incorporaciones más cortas: sí, b= base, z= zip
  • Separe el 0 inicial - no, pero puede usar variables predefinidas
  • desambiguate -- sí, pero no con _; 1 2-3-> 1 2 -3; 1 2m3->-1 3
  • rodar / rotar la pila - no
  • conjunto de matriz t
  • divmod - md
  • cambiar el lexer (para identificadores) - sí, más abajo
  • producto cartesiano: no es exactamente lo mismo, pero sí, m*
  • operadores unicode - no
  • identificadores de un solo carácter: los operadores predefinidos tienen 1 o 2 caracteres y las variables son letras mayúsculas de un solo carácter; todos pueden ser concatenados sin confundir al lexer / parser
  • operadores en bloques - no
  • tipo estable - sí
  • Convierta los símbolos nuevamente en bloques de código, no, pero puede agregarlos más tarde
  • fecha / hora actual - et
  • línea de comando args - ea
  • separando claramente las incorporaciones, sí, pero las mayúsculas son variables; las incorporaciones son o comienzan con minúsculas y caracteres especiales
  • min y max - Sí, en la actualidad sólo para 2 valores: e<,e>
  • valor absoluto - z(GolfScript tiene abs, no falta)
  • suma y producto de una matriz - :+,:*
  • Distancia de Manhattan - no
  • chr - c(se convierte en un carácter, no en una cadena)
  • derrame una cadena sobre la pila: las cadenas de CJam están hechas de caracteres, no de números; para derramar los personajes sigue siendo{}/
  • una versión de :eso consume lo que está almacenado - no
  • operadores para >=, <=- no, uso <!,>!
  • base64 y zlib - no
  • atajos por 1 $, 2 $, 3 $, 4 $, 5 $ - no
  • copie los dos elementos principales de la pila: planeado; por ahora usar1$1$
  • variables locales - no
  • Funciones HQ9 +: no, gracias

CJam tiene muchas más funciones, consulte https://sourceforge.net/p/cjam/wiki/Operators/

aditsu renunció porque SE es MALO
fuente
77
No estoy de acuerdo con que SourceForge y Mercurial sean mejores que GitHub.
nyuszika7h
1
@ nyuszika7h está bien, todos tenemos nuestras preferencias
Aditsu se retiró porque SE es MAL
Acabo de publicar mi primera respuesta CJam , porque mi respuesta GolfScript necesitaba desesperadamente una función sqrt adecuada. ¡CJam es mucho más rápido que GolfScript!
Dennis
@Dennis Awesome :)
Aditsu renunció porque SE es MAL
@aditsu ¿Consideraría que CJam es un dialecto de GolfScript o un nuevo lenguaje inspirado en GolfScript? (Esta es la razón por la que pregunto: codegolf.stackexchange.com/questions/37464/… )
Martin Ender
6

Cambiar el lexer

El lexer de GolfScript trata un identificador Ruby (cualquier cosa que coincida con la expresión regular [_a-zA-Z][_a-zA-Z0-9]*) como un token único. Si en cambio, se trata [a-zA-Z]+como un token que se liberaría _para ser incorporado y permitiría que una variable alfa fuera seguida de un entero literal sin separar espacios en blanco.

Peter Taylor
fuente
Bueno, actualmente estoy usando simplemente [a-z]+|[A-Z]+, para el mushing, por lo que subrayar es gratis. ¡Sin embargo, esta es una idea interesante y muy única! +1
Pomo de la puerta
5

Alias ​​Unicode

Los comandos de varios caracteres pueden tener alias unicode. Esto ahorraría en la puntuación cuando la puntuación se cuenta en caracteres y no en bytes.

marinus
fuente
77
eh ... no queremos otra APL ...
John Dvorak
1
Golfscript no se parece en nada a APL, Unicode o no. Ya tenemos varios otros APL, como J y K. (R o incluso que parece bastante APL-inspirado para mí, hasta el punto de que se puede hacer traducciones literales muy a menudo)
marinus
El punto distintivo sobre APL es que usa un juego de caracteres muy diferente que cualquier otra cosa, no que usa aritmética vectorial de forma nativa. Me gusta J, lo uso y, por lo general, voté por las respuestas de J. Todavía tengo que votar una respuesta APL. Si quisiera pintar mis programas en lugar de escribirlos, usaría Piet.
John Dvorak
Creo que APL es más legible que J, ciertamente más legible que Golfscript.
marinus
5

Tipo estable

La $construcción en bloques debe realizar una clasificación estable.

Howard
fuente
5

Operador de conjunto de matrices

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

¿Algún incorporado que podamos poner a disposición para eso?

Howard
fuente
Empecé a escribir una publicación de blog sobre la implementación del conjunto de matrices, pero nunca la terminé. Actualmente es extremadamente difícil en general. Esto marcaría una gran diferencia en algunos desafíos.
Peter Taylor
No puedo creer que esto no esté integrado en golfscript ya. +1
Pomo de la puerta
5

Identificadores de un solo carácter

No es como si una solución de código de golf tuviera demasiadas variables. Y ahorraría en espacios.

James Wood
fuente
Hmm ... Esto también podría hacerse cambiando el analizador. ¿Quizás una bandera para especificar este comportamiento? ¡Gran idea! +1
Pomo de la puerta
4

% como incorporado para el producto

[1 2][1 2 3]%  # -> [[[1 1][1 2][1 3]][[2 1][2 2][2 3]]]
Howard
fuente
+1; puedes editar mi respuesta CW y agregar esta
Doorknob
¿Qué pasa con el módulo?
MilkyWay90
3

Soporte de expresiones regulares

La falta de soporte de expresiones regulares siempre me ha parecido extraño en un lenguaje diseñado para jugar al golf. Sería genial tener

  • <string> <string> <string> y(alias tr, usando el alias one-char de Perl para ello)
  • <string> <string> <string> s (sustituir)
  • <string> <string> <block> s (sustituir con devolución de llamada)
  • <string> <string> m (partido)
Peter Taylor
fuente
Ya mencioné regex en mi pregunta.
Pomo de la puerta
3

Construido para la fecha / hora actual

Actualmente es muy peculiar obtener fecha / hora usando evaluaciones de Ruby.

D     # -> [2013 12 31]
T     # -> [23 59 59]
Howard
fuente
¿Eso da fecha / hora en Lima o Zulu?
Peter Taylor
@PeterTaylor No sé - los tiempos están cambiando ;-)
Howard
@ howard ¿Querías decir, "Los tiempos están cambiando" ?
John Dvorak
Ya mencionado como el tipo de tiempo en el OP.
Pomo de la puerta
3

Los complementos Make |, & y ^ hacen algo útil en bloques

Por ejemplo, <array/string> <block> |se puede usar como función de índice

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

¿Alguna idea para <array/string> <block> &o <array/string> <block> ^?

Howard
fuente
¿Qué hace array block =ahora?
John Dvorak
@JanDvorak Comparar. Útil si desea comparar una cadena con un bloque, por ejemplo "0<" {0<} =.
Howard
¿Con qué frecuencia necesitas eso? Prefiero dejar eso y usarlo array block =para "seleccionar por predicado"
John Dvorak
@JanDvorak select by predicate ya está implementado usando ,.
Howard
Oh no importa. Adelante :-)
John Dvorak
2

Una forma de convertir los símbolos nuevamente en bloques de código

Actualmente, podemos vincular bloques de código a símbolos con :, pero no hay forma de revertir el proceso: la ejecución de un símbolo vinculado a un bloque de código solo ejecuta el bloque.

Puedo ver un par de formas de implementar esto:

  1. agregar nueva sintaxis, por ejemplo, #foopara empujar el valor de fooa la pila, incluso si es un bloque de código, o

  2. agregue un operador para expandir cada símbolo en un bloque de código, de modo que (utilizando _como el nuevo operador), por ejemplo {2*}:dbl; {dbl dbl}_, produciría {2* 2*}.

Puedo ver ventajas para ambos métodos. El último podría sustituir al primero, a costa de dos caracteres adicionales (en {foo}_lugar de #foo), pero puedo ver algunas aplicaciones potenciales para la sintaxis anterior donde esos dos caracteres serían prohibitivos (por ejemplo, usar en array #func %lugar de array {func} %).

Mientras tanto, la sintaxis anterior podría usarse para reemplazar la segunda si hubiera una forma conveniente de iterar sobre los tokens en un bloque de código (que de todos modos podría ser útil por sí solo).


En cualquier caso, propondría que los símbolos expandibles que están vinculados a las funciones integradas nativas (es decir, implementadas en el código Ruby) devuelvan algún tipo de código auxiliar que se pueda invocar para obtener la funcionalidad de la función integrada, aunque sea imposible o simplemente es poco probable que se anule. Por ejemplo #$(o {$}_) podría regresar {builtin_dollar}, por ejemplo , donde builtin_dollarcontendría la implementación real de la función $incorporada (y / #builtin_dollaro {builtin_dollar}_simplemente debería regresar {builtin_dollar}).

Esto permitiría redefinir las incorporaciones sin perder el acceso a su funcionalidad (vea mi sugerencia anterior ), de modo que si, por alguna razón, quisiera cambiar los significados de $y @, simplemente podría hacer #$ #@ :$; :@;(o {$}_ {@}_ :$; :@;).

revs Ilmari Karonen
fuente
Un detalle del que no estoy seguro es qué _debe hacer el operador si el bloque de código contiene asignaciones variables. Lo obvio sería dejar :symbolintactos los tokens y expandir cualquier otra cosa, pero esto provocaría la _ruptura de cualquier código utilizando variables locales. Sin embargo, hacer que no rompa ese código puede ser prácticamente complicado.
Ilmari Karonen
1
Su segunda versión encajaría junto con un operador de aplanar en arrays: [[1] [2] [3]] _ -> [1 2 3].
Howard
Entonces, ¿cuál sería el resultado 2:A;{1:A;A}_?
Howard
Ingenuamente {1:A;2}(o, para ser técnicos, {1:A builtin_semicolon 2}si se incluye la función de expansión incorporada). Si se incluye algún tipo de característica de "exclusión de variables locales", es probable que se evalúe como justo {1:A;A}.
Ilmari Karonen
O para ser aún más técnico {builtin_1 :A builtin_semicolon 2}.
Howard
1

Preset variable con argumentos de línea de comando

Desafortunadamente, no queda ningún personaje sin asignar, pero ¿tal vez podamos usarlo Apara eso?

Howard
fuente
_está disponible. Tal vez eso? De todos modos, sí, golfscript necesita una manera de tomar argumentos de línea de cmd +1
Pomo
0

Funciones nativas de Ruby que debería implementar

Esto es Wiki de la comunidad; ¡siéntase libre de editar y agregar las funciones que cree que debería implementar!

Formato: " nativeFunctionName( nameInMyLanguage)"

  • shuffle( sf)
  • tr( tr)
  • sample( sm)
Perilla de la puerta
fuente
0

¡Tome características de APL y HQ9 + también!

  • Atajos, como en APL. EDITAR: acabo de ver la respuesta "alias unicode". A eso me refería :)
  • Otros atajos orientados al golf, como en H9 +, HQ9 +, CHIQRSX9 +
xem
fuente
Bien, entonces, ¿cómo propondrías eso? ¿Alguna idea específica?
Pomo de la puerta
caracteres unicode que permiten hacer cosas complejas en un solo personaje.
xem
@Doorknob of Snow, actualicé mi respuesta con los atajos que me gustaría ver: los de APL y los de CHIRQSX9 + :)
xem
Hmm, la cosa parece hq9 + :-P demasiado cheaty
Pomo
Está orientado al golf: creo que tu idioma debería funcionar al menos igual :)
xem
0

Separando claramente los empotrados

por ejemplo, mayúsculas: incorporados; haciendo B para la base factible

usuario11485
fuente
1
Como se mencionó anteriormente, no hay necesidad de separarse. Si a alguien le gusta sobrescribir una construcción, debería poder hacerlo. Incluso encontré aplicaciones útiles de sobrescribir operadores como {-}:+.
Howard
No es necesario, también este lenguaje no distingue entre mayúsculas y minúsculas.
Pomo de la puerta
2
Dado que el objetivo es proporcionar menos golpes por hoyo, tener sensibilidad a las mayúsculas y más elementos incorporados conduce efectivamente a la declaración de la misión.
0

Variables locales / cierres

Una cosa que realmente extraño en GolfScript es la capacidad de cambiar temporalmente el valor de un símbolo .

En particular, actualmente no hay forma de anular temporalmente el significado de un "primitivo" integrado: una vez que, por ejemplo, redefinir $, nunca volverá a ordenar nada en ese programa. (Bueno, no sin escribir su propia implementación de clasificación, al menos). Sería realmente bueno poder decir, por ejemplo, que en este bloque de código $ significa algo más, pero aún así mantener el significado normal en otro lugar.

En relación con lo anterior, sería bueno vincular símbolos en un bloque de código a su valor actual . Claro, puedo escribir, decir, {$-1%}:rsorty ser capaz de usar rsortpara ordenar e invertir una matriz, pero eso funciona solo mientras la definición de $( -1oo %) no cambie, ya que mi rsortfunción todavía está llamando al símbolo global $. Sería bueno poder decir "dejar de rsorthacer lo $-1%que hace actualmente, incluso si esos símbolos se redefinen más tarde".

En particular, la biblioteca estándar podría usar este tipo de enlace. Es sorprendente darse cuenta de que, por ejemplo, cambiar los ncambios en el comportamiento de puts, o que redefinir !completamente arruina xor. (Por otra parte, se debe tener precaución aquí, ya que, en particular, la capacidad de cambiar el comportamiento de putsresulta ser la única forma de evitar imprimir una nueva línea final en la versión actual de GS).

Editar: Ser capaz de convertir los símbolos nuevamente en bloques de código contribuiría en gran medida a implementar esta funcionalidad. En particular, la {foo}_sintaxis sugerida en esa respuesta realizaría efectivamente un nivel de enlace estático al expandir todos los símbolos en un bloque de código. Combina eso con un combinador de punto fijo para una unión estática profunda, y Bob es tu tío ...

revs Ilmari Karonen
fuente
Vamos, todos los nuevos y elegantes lenguajes celebran la evaluación perezosa ;-) Mantengamos esa función en GolfScript.
Howard
Pensándolo bien, tienes razón, es más una característica de vinculación que de evaluación. Pero entonces, el enlace estático es más complejo de lo que parece, por ejemplo, proporciona llamadas recursivas dentro de una definición.
Howard
"hagamos rsortlo $-1%que hace actualmente, incluso si esos símbolos se redefinen más tarde" ¿Entonces Emmental?
CalculatorFeline
0

Más funciones incorporadas

Haga que todas las variables de una letra az y AZ realicen alguna función útil genérica. Algunos complementos que faltan:

  • min y max: todos o algunos de los 2 valores principales de la pila, los valores superiores de la pila n, sobre una matriz
  • valor absoluto
  • suma y producto de una matriz. ¿Por qué {+}*cuando puedes hacer S? ¡Tienes 52 funciones para trabajar aquí!
  • Distancia de Manhattan (es decir, x1 y1 x2 y2 --> abs(x2-x1)+abs(y2-y1)ahora tendría que ser @-A@@-A+si Aes un valor absoluto incorporado. Es cierto que esto solo surgió como pistas de mi publicación más reciente, pero siempre pensé que sería una buena manera de expandir golfscript: escriba qué sería útil tener funciones, recopilarlas y agregarlas como integradas.
  • Convierta un número entero en una cadena de un carácter (equivalente a la de Python chr).
  • Derramar una cuerda sobre la pila (actualmente {}/)
  • Una versión de :eso consume lo que está almacenado. Esto tendría que no quedar 'atascado' en los identificadores para ser útil.
  • Operadores para >=,<=
  • Como alguien sugirió, una forma de poner una variable que contiene un bloque en la pila sin ejecutarla. Entonces podría reducir los ifs de la forma 1{\}{|}ifa algo como1?\?|if
  • Conversión base64 incorporada y soporte zlib para hacer que la inserción de datos tome menos caracteres
  • Más allá de base64, cree una codificación base93 personalizada (utilizando todos los caracteres imprimibles que no sean el delimitador de cadena).
  • Atajos para 1$, 2$, 3$, 4$,5$
  • Un operador para copiar los dos elementos superiores de la pila tal como están, es decir \.@.@\
Claudiu
fuente
-3

Sería bueno si el valor escrito o calculado en la última línea de una función se devuelve automáticamente

xem
fuente
3
Está basado en la pila, así que ...
marinus
1
No existe tal cosa como una función.
Peter Taylor
Las funciones no devuelven nada ... y se llaman bloques
Pomo de la puerta
Eso podría ser bueno ... en algún otro idioma. (Sentencias de retorno No más molestos al final de las funciones Yay (Pero no he necesitado sentencias de retorno nunca, así que ...)!)
CalculatorFeline