scheme - reggaeton - tag de musica latina preguntas
¿Cómo manejo un número no especificado de parámetros en Esquema? (2)
Además de la respuesta de Óscar López, también puede realizar una función anónima de argumentos variables como:
(lambda args ...)
Donde nuevamente, dentro de la lambda
, args
es una lista de los argumentos pasados.
Por ejemplo ((fn-stringappend string-append) "a" "b" "c")
Sé cómo manejar esto (fxyz)
. Pero ¿y si hay un número desconocido de parámetros? ¿Hay alguna manera de manejar este tipo de problema?
En Esquema puede usar la notación de puntos para declarar un procedimiento que recibe un número variable de argumentos (también conocido como varargs o función variadic ):
(define (procedure . args)
...)
Dentro del procedure
, args
será una lista con el cero o más argumentos pasados; llámalo así:
(procedure "a" "b" "c")
Como lo señaló @Arafinwe, aquí está la notación equivalente para un procedimiento anónimo:
(lambda args ...)
Llámalo así:
((lambda args ...) "a" "b" "c")
Recuerde que si necesita pasar los parámetros en una lista de tamaño desconocido a una función variadic, puede escribirlo así:
(apply procedure ''("a" "b" "c"))
(apply (lambda args ...) ''("a" "b" "c"))
ACTUALIZAR:
Con respecto al código en los comentarios, esto no funcionará como usted pretende:
(define (fp f)
(lambda (.z)
(f .z)))
Creo que te referías a esto:
(define (fp f)
(lambda z
(apply f z)))
Con un poco de azúcar sintáctico, el procedimiento anterior se puede simplificar aún más a esto:
(define ((fp f) . z)
(apply f z))
Pero eso es solo un largo camino para simplemente escribir:
(apply f z)
¿Esto es lo que necesitas?
(apply string-append ''("a" "b" "c"))
Porque de todos modos eso es equivalente a lo siguiente:
(string-append "a" "b" "c")
string-append
ya recibe cero o más argumentos (al menos, ese es el caso en Racket)