【问题标题】:Scheme list as an argument方案列表作为参数
【发布时间】:2020-05-16 04:13:01
【问题描述】:

所以在Scheme中,如果我将一个列表作为参数,我将如何以相同的顺序对该列表进行评估?

我会写: (定义(函数列表) (列表)

我真的不明白。

【问题讨论】:

  • 您所说的“对自己进行评估”是什么意思? “相同的顺序”是什么意思?
  • 例如,像一个函数,它将课程列表作为参数,它会按照课程名称的顺序将其评估为课程名称
  • 由于函数接受参数,它已经是一个值......列表已经被评估,所以函数对评估顺序无能为力。唯一可以让您使用评估顺序的东西是 thunk 函数列表或惰性承诺列表,其中可以调用/强制调用函数/承诺值来评估主体。是这个意思吗?
  • 您能否给出一个更具体的代码示例,说明您将如何调用该函数,以及您希望在该特定调用中的评估顺序是什么样的?

标签: list scheme racket


【解决方案1】:

您的问题缺少示例。

这是你想要的吗:

(define (f . args) 
    args)

可以这样使用:

> (f 1 2 3)
(1 2 3)

【讨论】:

    【解决方案2】:

    如果您有一个列表和一个“评估”该列表元素的函数,并且您想构造另一个列表,该列表是在列表的每个元素上调用该函数的结果,那么您正在做的事情称为 将函数映射到列表上,函数会执行此操作,称为map。给定以下两个定义:

    (define course-names '((1 "Exploding buckets 101")
                           (2 "Squirrel cooking 201")
                           (4 "Flamethrower maintenance 211")))
    
    (define (course->name c)
      (let ((found (assq c course-names)))
        (if found (second found) "UNKNOWN SECRET COURSE")))
    

    然后

    > (map course->name '(1 2 3 4))
    '("Exploding buckets 101"
      "Squirrel cooking 201"
      "UNKNOWN SECRET COURSE"
      "Flamethrower maintenance 211")
    

    值得看看如何编写 map 之类的东西:这是一种方法:

    (define (simple-map f l)
      (define (simple-map-loop tail accum)
        (if (null? tail)
            (reverse accum)
            (simple-map-loop (rest tail) (cons (f (first tail)) accum))))
      (simple-map-loop l '()))
    

    【讨论】:

      【解决方案3】:

      或:

      (define (f lst)
        lst)
      

      用作:

      (f '(1 2 3))
      ;; '(1 2 3)
      

      【讨论】:

        猜你喜欢
        • 2011-08-04
        • 2019-03-20
        • 2013-04-18
        • 2014-12-31
        • 1970-01-01
        • 2017-03-08
        • 2014-05-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多