#!/usr/bin/env sh # -*- wisp -*- exec guile -L $(dirname $(dirname $(realpath "$0"))) --language=wisp -e '(@@ (examples cartesian-sets) main)' -s "$0" "$@" ; !# ;; Implementation of the cartesian product over a list of lists, building on http://stackoverflow.com/a/20591545/7666 define-module : examples cartesian-sets . #:export : cartesian-product import : srfi srfi-1 ;; original define : cartesian-product-lambda . lists fold-right lambda : xs ys append-map (lambda (x) (map (lambda (y) (cons x y)) ys)) . xs . '(()) . lists ;; easier to understand define : cartesian-product . lists define : product-of-two xs ys define : cons-on-each-ys x map : lambda (y) (cons x y) . ys append-map cons-on-each-ys . xs fold-right product-of-two '(()) lists define : main args write : cartesian-product-lambda '(1 2) '(3 4) '(5 6) newline write : cartesian-product '(1 2) '(3 4) '(5 6) newline