我在这里问了几个关于Scheme/SICP的问题,答案经常涉及到使用apply过程,这是我在SICP中没有看到过的,在这本书的索引中,它只列出了一次,结果是一个脚注。
一些用法的例子基本上都能回答这个问题:Going from Curry-0, 1, 2, to ...n。
我对apply的工作方式很感兴趣,我想知道是否有一些例子可用。如何将应用过程重写为另一个函数,例如像这样重写map?
#lang sicp
(define (map func sequence)
(if (null? sequence) nil
(cons (func (car sequence)) (map func (cdr sequence)))))也许它只是用第一个参数进行函数调用?类似于:
(apply list '(1 2 3 4 5)) ; --> (list 1 2 3 4 5)
(apply + '(1 2 3)) ; --> (+ 1 2 3)所以,也许类似于Python中的内容?
>>> args=[1,2,3]
>>> func='max'
>>> getattr(__builtins__, func)(*args)
3发布于 2021-06-18 15:27:03
您要求查看如何编码apply,而不是如何使用它。
#lang sicp
; (define (appl f xs) ; #lang racket
; (eval
; (cons f (map (lambda (x) (list 'quote x)) xs))))
(define (appl f xs) ; #lang r5rs, sicp
(eval
(cons f (map (lambda (x) (list 'quote x))
xs))
(null-environment 5)))在#lang sicp下在球拍中尝试它
> (display (appl list '(1 2 3 4 5)))
(1 2 3 4 5)
> (display ( list 1 2 3 4 5 ))
(1 2 3 4 5)
> (appl + (list (+ 1 2) 3))
6
> ( + (+ 1 2) 3 )
6
> (display (appl map (cons list '((1 2 3) (10 20 30)))))
((1 10) (2 20) (3 30))
> (display ( map list '(1 2 3) '(10 20 30) ))
((1 10) (2 20) (3 30))这是关于eval的文档的链接。
它需要一个环境作为第二个参数,所以我们为它提供了(null-environment 5),它只是返回一个空的环境,它看起来像它。我们在这里实际上不需要任何环境,因为对论点的评估已经在那时完成了。
发布于 2021-06-17 21:01:45
当您想要调用具有动态参数数的函数时,将使用apply。
您的map函数只允许调用带有一个参数的函数。您可以使用apply来映射具有不同数量的参数的函数,使用可变的列表数。
(define (map func . sequences)
(if (null? (car sequences))
'()
(cons (apply func (map car sequences))
(apply map func (map cdr sequences)))))
(map + '(1 2 3) '(4 5 6))
;; Output: (5 7 9)https://stackoverflow.com/questions/68026340
复制相似问题