是否可以在方案中重复使用匿名函数时进行引用?
Is it possible to reference while recurring to anonymous function in scheme ?
我尝试编写函数,将一些数字添加到列表中的每个元素,然后对所有这些项求和。
(define (num-to-sumtup num)
(lambda (tup)
(cond
((null? tup) 0)
(else (+ (car tup) num (num-to-sumtup ())) ;; here I need to get reference on the inner function
可能吗?
是的,这是可能的。 num-to-sumtup
接受一个数字作为参数,returns 一个接受列表的函数。所以你执行它得到函数,然后执行那个函数。
(define (num-to-sumtup num)
(lambda (tup)
(cond
((null? tup) 0)
(else
(+ (car tup) num ((num-to-sumtup num) (cdr tup)))))))
;Value: num-to-sumtup
((num-to-sumtup 10) '(1 2 3 4 5))
;Value: 65
本着 sylwester 的回答精神,这里有另一个选择
(define (num-to-sup num)
(lambda (tup)
(foldl (lambda (x y) (+ num x y)) 0 tup)))
您不需要将其设为匿名过程。它的名称可能在 num-to-sumtup
范围内。以下是一些方法示例。最简单的方法是使用 SRFI-31 中定义的 rec
语法。
#!r6rs
(import (rnrs base)
(srfi :31))
(define (num-to-sumtup num)
(rec (recur tup)
(cond
((null? tup) 0)
(else (+ (car tup) num (recur (cdr tup)))))))
((num-to-sumtup 10) '(1 2 3 4 5)) ; ==> 65
您也可以使用 define
:
(define (num-to-sumtup num)
(define (sum-list tup)
(cond
((null? tup) 0)
(else (+ (car tup) num (sum-list (cdr tup))))))
sum-list); we return the locally named procedure
使用高阶程序和 cut
来自 SRFI-26。
#!r6rs
(import (rnrs base)
(rnrs lists) ; fold-left
(srfi :26)) ; cut
(define (num-to-sumtup num)
(lambda (tup)
(fold-left (cut + <> <> num) 0 tup)))
我尝试编写函数,将一些数字添加到列表中的每个元素,然后对所有这些项求和。
(define (num-to-sumtup num)
(lambda (tup)
(cond
((null? tup) 0)
(else (+ (car tup) num (num-to-sumtup ())) ;; here I need to get reference on the inner function
可能吗?
是的,这是可能的。 num-to-sumtup
接受一个数字作为参数,returns 一个接受列表的函数。所以你执行它得到函数,然后执行那个函数。
(define (num-to-sumtup num)
(lambda (tup)
(cond
((null? tup) 0)
(else
(+ (car tup) num ((num-to-sumtup num) (cdr tup)))))))
;Value: num-to-sumtup
((num-to-sumtup 10) '(1 2 3 4 5))
;Value: 65
本着 sylwester 的回答精神,这里有另一个选择
(define (num-to-sup num)
(lambda (tup)
(foldl (lambda (x y) (+ num x y)) 0 tup)))
您不需要将其设为匿名过程。它的名称可能在 num-to-sumtup
范围内。以下是一些方法示例。最简单的方法是使用 SRFI-31 中定义的 rec
语法。
#!r6rs
(import (rnrs base)
(srfi :31))
(define (num-to-sumtup num)
(rec (recur tup)
(cond
((null? tup) 0)
(else (+ (car tup) num (recur (cdr tup)))))))
((num-to-sumtup 10) '(1 2 3 4 5)) ; ==> 65
您也可以使用 define
:
(define (num-to-sumtup num)
(define (sum-list tup)
(cond
((null? tup) 0)
(else (+ (car tup) num (sum-list (cdr tup))))))
sum-list); we return the locally named procedure
使用高阶程序和 cut
来自 SRFI-26。
#!r6rs
(import (rnrs base)
(rnrs lists) ; fold-left
(srfi :26)) ; cut
(define (num-to-sumtup num)
(lambda (tup)
(fold-left (cut + <> <> num) 0 tup)))