如何在 Lisp 或 Scheme 中获得两个列表的乘积?

How to get the multiplication of two lists in Lisp or Scheme?

我想我以后必须深入研究 SICP,但如果它是两个列表:

a b c d
1 2 3

有没有一种标准的方法可以在 2、3 或 4 行中进行乘法运算?

所以想要的结果是

a1 a2 a3 b1 b2 b3 ... d1 d2 d3

如果我们使用任何命令式语言/方法来做,它很简单,但是如果我们以功能方式(通过声明方法)使用 Lisp / Scheme,是否有标准方法来完成?

DrRacket 有 cartesian-product:

(require racket/list)
(cartesian-product '(a b c d) '(1 2 3))

你可以这样重写你的 Javascript 代码(在 Racket 中):

> (apply append (map (lambda (a) (map (lambda (b) (list a b))
                                 '(1 2 3)))
                '(a b c d)))

'((a 1) (a 2) (a 3) (b 1) (b 2) (b 3) (c 1) (c 2) (c 3) (d 1) (d 2) (d 3))

或者在 Common Lisp 中:

CL-USER 1 > (apply #'append (mapcar (lambda (a) (mapcar (lambda (b) (list a b))
                                 '(1 2 3)))
                '(a b c d)))

((A 1) (A 2) (A 3) (B 1) (B 2) (B 3) (C 1) (C 2) (C 3) (D 1) (D 2) (D 3))