首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Racket -列表的输出内容

Racket -列表的输出内容
EN

Stack Overflow用户
提问于 2011-11-11 18:49:47
回答 4查看 12K关注 0票数 3

我定义了一个列表(在球拍/方案中):

代码语言:javascript
复制
(define myList (cons 'data1 (cons 'data2 (cons 'data3 (cons 'data4 empty)))))

代码语言:javascript
复制
(list 'data1 'data2 'data3 'data4)

我想写一个函数,循环遍历列表,并输出列表中的所有值。

代码语言:javascript
复制
(define (outputListData list)
  (cond 
    [(null? list) list]
    [else (getListData)]))

使用什么函数可以循环浏览列表的内容?我知道可以使用first & rest来获取列表数据,但我想这不是正确的方式。

顺便说一句:有没有像php.net这样的好的,紧凑的球拍参考?我发现官方的球拍文档非常令人困惑...

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-11-12 00:38:38

dyoo的解决方案在像球拍这样的方案中是很好和简洁的,它内置了有用的迭代例程。不过,仅供参考,您的“outputListData”并不是完成此操作的标准递归方式。你只需要修改几行代码:

代码语言:javascript
复制
(define (outputListData list)
  (cond 
    [(null? list) #f]             ; actually doesn't really matter what we return
    [else (printf "~s\n" (first list))    ; display the first item ...
          (outputListData (rest list))])) ; and start over with the rest

因为这是一种“命令式”的过程,不是用来返回值的,所以只要我们停止循环(避免无限循环),我们对空列表做什么都无关紧要。如果列表不为空,我们输出第一个元素并递归地从列表的其余部分开始。

顺便说一句,如果你只是在其他函数中间需要一个"for“循环,那么你可以用另一种方法写出几乎相同的东西:

代码语言:javascript
复制
(let loop ((l (list 'foo 'bar 'baz 'quux))) ; or put whatever input you need
   (cond ((null? l) #f)
         (else
           (printf "~s\n" (first l))
           (loop (rest l)))))

考虑这个“命名的let”的一种方式是,它定义了一个名为loop的临时函数,它的工作方式与上面的outputListData类似。Scheme有一个很好的特性,它不会为像这样的“尾部调用”增加堆栈,所以你总是可以用这种递归风格编写一个“迭代”的forwhile循环。

我强烈推荐Friedman和Felleisen的The Little Schemer,这是对这种函数编写风格的快速介绍!我是通过道格拉斯·克罗克福德的主页here找到的。

票数 3
EN

Stack Overflow用户

发布于 2011-11-12 00:07:11

您可以使用for循环。示例:

代码语言:javascript
复制
(for ([x (list 1 2 3)])
    (printf "~s -> ~s\n" x (* x x)))

当然,还有更多的函数方法可以做到这一点,但这种方法也有效。你可能想看看像“如何设计程序来做递归方法”这样的教科书。请参阅:http://www.ccs.neu.edu/home/matthias/HtDP2e/

票数 6
EN

Stack Overflow用户

发布于 2011-11-12 01:10:22

根据注释进行编辑:使用 for-each

代码语言:javascript
复制
(for-each display myList)

试试这个:

代码语言:javascript
复制
(void (map display myList))

将其分解:

当列表的value.

  • (map function lst):返回列表'((function a1) (function a2) ... (function an)).

时,

  • (void x)会导致x被忽略,而不是返回到REPL/父表达式

所以我们使用map来显示所有的项,但是因为我们只关心副作用,而不关心返回值,所以我们在返回的列表上调用void。

官方文档:

  • void
  • map
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8092878

复制
相关文章

相似问题

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