我定义了一个列表(在球拍/方案中):
(define myList (cons 'data1 (cons 'data2 (cons 'data3 (cons 'data4 empty)))))或
(list 'data1 'data2 'data3 'data4)我想写一个函数,循环遍历列表,并输出列表中的所有值。
(define (outputListData list)
(cond
[(null? list) list]
[else (getListData)]))使用什么函数可以循环浏览列表的内容?我知道可以使用first & rest来获取列表数据,但我想这不是正确的方式。
顺便说一句:有没有像php.net这样的好的,紧凑的球拍参考?我发现官方的球拍文档非常令人困惑...
发布于 2011-11-12 00:38:38
dyoo的解决方案在像球拍这样的方案中是很好和简洁的,它内置了有用的迭代例程。不过,仅供参考,您的“outputListData”并不是完成此操作的标准递归方式。你只需要修改几行代码:
(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“循环,那么你可以用另一种方法写出几乎相同的东西:
(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有一个很好的特性,它不会为像这样的“尾部调用”增加堆栈,所以你总是可以用这种递归风格编写一个“迭代”的for或while循环。
我强烈推荐Friedman和Felleisen的The Little Schemer,这是对这种函数编写风格的快速介绍!我是通过道格拉斯·克罗克福德的主页here找到的。
发布于 2011-11-12 00:07:11
您可以使用for循环。示例:
(for ([x (list 1 2 3)])
(printf "~s -> ~s\n" x (* x x)))当然,还有更多的函数方法可以做到这一点,但这种方法也有效。你可能想看看像“如何设计程序来做递归方法”这样的教科书。请参阅:http://www.ccs.neu.edu/home/matthias/HtDP2e/
发布于 2011-11-12 01:10:22
根据注释进行编辑:使用 for-each
(for-each display myList)试试这个:
(void (map display myList))将其分解:
当列表的value.
(map function lst):返回列表'((function a1) (function a2) ... (function an)).时,
(void x)会导致x被忽略,而不是返回到REPL/父表达式所以我们使用map来显示所有的项,但是因为我们只关心副作用,而不关心返回值,所以我们在返回的列表上调用void。
官方文档:
https://stackoverflow.com/questions/8092878
复制相似问题