首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SICP/SICP的应用函数

SICP/SICP的应用函数
EN

Stack Overflow用户
提问于 2021-06-17 20:44:44
回答 2查看 332关注 0票数 3

我在这里问了几个关于Scheme/SICP的问题,答案经常涉及到使用apply过程,这是我在SICP中没有看到过的,在这本书的索引中,它只列出了一次,结果是一个脚注。

一些用法的例子基本上都能回答这个问题:Going from Curry-0, 1, 2, to ...n

我对apply的工作方式很感兴趣,我想知道是否有一些例子可用。如何将应用过程重写为另一个函数,例如像这样重写map

代码语言:javascript
复制
#lang sicp

(define (map func sequence)
    (if (null? sequence) nil
        (cons (func (car sequence)) (map func (cdr sequence)))))

也许它只是用第一个参数进行函数调用?类似于:

代码语言:javascript
复制
(apply list '(1 2 3 4 5)) ; --> (list 1 2 3 4 5)
(apply + '(1 2 3))        ; --> (+ 1 2 3)

所以,也许类似于Python中的内容?

代码语言:javascript
复制
>>> args=[1,2,3]
>>> func='max'
>>> getattr(__builtins__, func)(*args)
3
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-18 15:27:03

您要求查看如何编码apply,而不是如何使用它。

It can be coded as

代码语言:javascript
复制
#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下在球拍中尝试它

代码语言:javascript
复制
> (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),它只是返回一个空的环境,它看起来像它。我们在这里实际上不需要任何环境,因为对论点的评估已经在那时完成了。

票数 1
EN

Stack Overflow用户

发布于 2021-06-17 21:01:45

当您想要调用具有动态参数数的函数时,将使用apply

您的map函数只允许调用带有一个参数的函数。您可以使用apply来映射具有不同数量的参数的函数,使用可变的列表数。

代码语言:javascript
复制
(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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68026340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档