如何将此函数转换为内联调用
How to convert this function to an inline call
我有以下函数来缩放 (2-col) 矩阵:
(define (scale-matrix matrix scale)
(map (lambda (row)
(list (* scale (car row))
(* scale (cadr row))))
matrix))
(scale-matrix '((1 2) (3 4)) 3)
; ((3 6) (9 12))
但是,我很难将其转换为内联柯里化调用。这是我目前所在的位置:
(map
(lambda (row)
(lambda (scale)
(list (* scale (car row))
(* scale (cadr row)))))
'((1 2) (3 4)))
; (#<procedure:...esktop/sicp/021.scm:54:3> #<procedure:...esktop/sicp/021.scm:54:3>)
在这里传递标度和矩阵的正确方法是什么?换句话说,把 3
?
放在哪里
到目前为止,我得到的最接近的是对其中的 3
进行排序:
(map
(lambda (row)
((lambda (scale)
; 3 hardcoded, nil placeholder. How to actually 'call' with 3?
(list (* 3 (car row)) (* 3 (cadr row)))) nil))
'((1 2) (3 4)))
或者,我是否需要将 scale
作为第一个参数传递?它似乎以这种方式工作,但不确定是否需要这样做(甚至不确定为什么这样做!)
((lambda (scale)
(map (lambda (row)
(list (* scale (car row)) (* scale (cadr row))))
'((1 2) (3 4)))) 3)
; ((3 6) (9 12))
您最后一次尝试是正确的:您必须提取用于 scale
map
调用之外的 lambda
。您不能修改最里面的 lambda,map
需要一个带有一个参数的 lambda
,您不能在那里传递嵌套的 lambda
。所以如果你想咖喱 scale
别无选择,只能:
((lambda (scale)
(map (lambda (row)
(list (* scale (car row))
(* scale (cadr row))))
'((1 2) (3 4))))
3)
=> '((3 6) (9 12))
至于为什么 它有效,它就像任何其他匿名 lambda
调用一样。让我们看一个更简单的例子,这个:
(define (add1 n)
(+ 1 n))
(add1 41)
评估时相当于:
((lambda (n)
(+ 1 n))
41)
顺带一提,上面也是let
的展开求值方式:
(let ((n 41))
(+ 1 n))
所以你也可以像下面这样内联代码;但是你为什么要咖喱呢?原码带程序就对了
(let ((scale 3))
(map (lambda (row)
(list (* scale (car row))
(* scale (cadr row))))
'((1 2) (3 4))))
我有以下函数来缩放 (2-col) 矩阵:
(define (scale-matrix matrix scale)
(map (lambda (row)
(list (* scale (car row))
(* scale (cadr row))))
matrix))
(scale-matrix '((1 2) (3 4)) 3)
; ((3 6) (9 12))
但是,我很难将其转换为内联柯里化调用。这是我目前所在的位置:
(map
(lambda (row)
(lambda (scale)
(list (* scale (car row))
(* scale (cadr row)))))
'((1 2) (3 4)))
; (#<procedure:...esktop/sicp/021.scm:54:3> #<procedure:...esktop/sicp/021.scm:54:3>)
在这里传递标度和矩阵的正确方法是什么?换句话说,把 3
?
到目前为止,我得到的最接近的是对其中的 3
进行排序:
(map
(lambda (row)
((lambda (scale)
; 3 hardcoded, nil placeholder. How to actually 'call' with 3?
(list (* 3 (car row)) (* 3 (cadr row)))) nil))
'((1 2) (3 4)))
或者,我是否需要将 scale
作为第一个参数传递?它似乎以这种方式工作,但不确定是否需要这样做(甚至不确定为什么这样做!)
((lambda (scale)
(map (lambda (row)
(list (* scale (car row)) (* scale (cadr row))))
'((1 2) (3 4)))) 3)
; ((3 6) (9 12))
您最后一次尝试是正确的:您必须提取用于 scale
map
调用之外的 lambda
。您不能修改最里面的 lambda,map
需要一个带有一个参数的 lambda
,您不能在那里传递嵌套的 lambda
。所以如果你想咖喱 scale
别无选择,只能:
((lambda (scale)
(map (lambda (row)
(list (* scale (car row))
(* scale (cadr row))))
'((1 2) (3 4))))
3)
=> '((3 6) (9 12))
至于为什么 它有效,它就像任何其他匿名 lambda
调用一样。让我们看一个更简单的例子,这个:
(define (add1 n)
(+ 1 n))
(add1 41)
评估时相当于:
((lambda (n)
(+ 1 n))
41)
顺带一提,上面也是let
的展开求值方式:
(let ((n 41))
(+ 1 n))
所以你也可以像下面这样内联代码;但是你为什么要咖喱呢?原码带程序就对了
(let ((scale 3))
(map (lambda (row)
(list (* scale (car row))
(* scale (cadr row))))
'((1 2) (3 4))))