【问题标题】:The apply function in SICP/SchemeSICP/Scheme 中的 apply 函数
【发布时间】:2021-06-17 20:44:44
【问题描述】:

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

一些用法示例基本上是这个问题的每个答案:Going from Curry-0, 1, 2, to ...n

我对@9​​87654325@ 的工作原理很感兴趣,我想知道是否有一些示例可用。怎么把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

【问题讨论】:

标签: scheme lisp racket apply sicp


【解决方案1】:

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)

【讨论】:

  • 谢谢,那应该说map 而不是申请? (尝试执行apply + 时出现错误。)
  • 是的,很抱歉。
【解决方案2】:

您问的是如何编码apply,而不是如何使用它。

can be coded as

#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 下的 Racket 中试用:

> (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 的文档的链接。

它需要一个 environment 作为第二个参数,因此我们为它提供 (null-environment 5),它只返回一个空环境,看起来像这样。我们实际上不需要任何环境,因为此时参数的评估已经完成。

【讨论】:

  • 谢谢,5 在过程调用中很奇怪,但这似乎只是版本(如果是这样,为什么实现不能自己解决?)另外,你呢?还想添加指向null-environment 答案的链接吗?
  • 这是同一个链接。 :) 只需向下滚动几行,它实际上就是下一个条目。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-26
  • 2021-09-20
  • 2013-06-05
  • 1970-01-01
  • 2016-10-23
  • 1970-01-01
  • 2020-02-06
相关资源
最近更新 更多