Task

Show one or more idiomatic ways of generating the Cartesian product of two arbitrary lists in your language.

Demonstrate that your function/method correctly returns:

{1, 2} × {3, 4} = {(1, 3), (1, 4), (2, 3), (2, 4)}
and, in contrast:

{3, 4} × {1, 2} = {(3, 1), (3, 2), (4, 1), (4, 2)}
Also demonstrate, using your function/method, that the product of an empty list with any other list is empty.

 {1, 2} × {} = {}
 {} × {1, 2} = {}
For extra credit, show or write a function returning the n-ary product of an arbitrary number of lists, each of arbitrary length. Your function might, for example, accept a single argument which is itself a list of lists, and return the n-ary product of those lists.

Use your n-ary Cartesian product function to show the following products:

 {1776, 1789} × {7, 12} × {4, 14, 23} × {0, 1}
 {1, 2, 3} × {30} × {500, 100}
 {1, 2, 3} × {} × {500, 100}


include ..\Utilitys.pmt
 
def cart
    ( ) var res
    -1 get var ta -1 del
    -1 get var he -1 del
    ta "" != he "" != and if
        he len nip for
            he swap get var h drop
            ta len nip for
                ta swap get var t drop
                ( h t ) flatten res swap 0 put var res
            endfor
        endfor
        len if res 0 put cart endif
    endif
enddef
 
/# ---------- MAIN ---------- #/
 
( ( 1 2 ) ( 3 4 ) ) cart
drop res print nl nl
 
( ( 1776 1789 ) ( 7 12 ) ( 4 14 23 ) ( 0 1 ) ) cart
drop res print nl nl
 
( ( 1 2 3 ) ( 30 ) ( 500 100 ) ) cart
drop res print nl nl
 
( ( 1 2 ) ( ) ) cart
drop res print nl nl