~filiplajszczak/guile-algorithms

d745c452749f458da7d09b570de0578e1eab867e — Filip Lajszczak 9 months ago fcdaeeb master
adds clojure style juxt.
3 files changed, 38 insertions(+), 0 deletions(-)

M algorithms.scm
M doc/algorithms.texi
M tests/test-algorithms.scm
M algorithms.scm => algorithms.scm +5 -0
@@ 16,6 16,7 @@
            generate
            increasing?
            init
            juxt
            product
            repeat
            replicate


@@ 56,6 57,10 @@
(define (init lst)
  (drop-right lst 1))

(define (juxt . procs)
  (λ args
    (map (λ (proc) (apply proc args)) procs)))

(define (product lst)
  (fold-right * 1 lst))


M doc/algorithms.texi => doc/algorithms.texi +22 -0
@@ 192,6 192,28 @@ Examples:
@end example
@end deffn

@deffn {Scheme Procedure} juxt @var{proc}@dots{}
Takes variable number of procedures and returns a procedure that is the juxtaposition
of those procedures.  The returned procedure takes a variable number of arguments, and
returns a list containing the result of applying each procedures to the
arguments.

This algorithm comes from Clojure's
@code{@url{https://clojuredocs.org/clojure.core/juxt, juxt}}.

Examples:
@example
> ((juxt first last) '(1 2 3))
'(1 3)
> ((juxt + *) 1 2 3 4)
'(10 24)
> ((juxt zip append)  '(1 2 3) '(4 5 6))
'(((1 4) (2 5) (3 6)) (1 2 3 4 5 6))
@end example
@end deffn



@deffn {Scheme Procedure} product @var{lst}
Returns the product of the elements in @var{lst}.


M tests/test-algorithms.scm => tests/test-algorithms.scm +11 -0
@@ 1,5 1,9 @@
(define-module (test-algoritms)
  #:use-module ((srfi srfi-1) #:select (first
                                        last
                                        zip))
  #:use-module (srfi srfi-64)

  #:use-module (algorithms))

(module-define! (resolve-module '(srfi srfi-64))


@@ 79,6 83,13 @@
  (test-equal '()
    (init '(1)))

  (test-equal '(5 6)
    ((juxt + *) 2 3))
  (test-equal '(1 3)
    ((juxt first last) '(1 2 3)))
  (test-equal '(((1 4) (2 5) (3 6)) (1 2 3 4 5 6))
    ((juxt zip append)  '(1 2 3) '(4 5 6)))

  (test-equal 6
    (product '(3 2 1)))
  (test-equal 3628800