Scheme 在Racket中使用局部函数代替辅助函数
问题 我得到了一个符号列表,并被要求以某种方式对其进行操作,我已经完成了(在定义部分中找到),我想将此代码从助手函数转换为本地函数 定义 我正在处理的列表的第一个元素是标识符,列表的其余部分是项目的描述。例如,Scheme 在Racket中使用局部函数代替辅助函数,scheme,racket,Scheme,Racket,问题 我得到了一个符号列表,并被要求以某种方式对其进行操作,我已经完成了(在定义部分中找到),我想将此代码从助手函数转换为本地函数 定义 我正在处理的列表的第一个元素是标识符,列表的其余部分是项目的描述。例如,(列出“糖果”甜“轻”包装)。请注意,每个元素都是一个符号,每个列表可以有无限多的描述 给我一份清单,要求我列出所有项目的所有描述,没有重复项。秩序并不重要 示例 以下是我创建的列表: (list (list 'chips 'fresh 'crisp) (list 'oranges '
(列出“糖果”甜“轻”包装)
。请注意,每个元素都是一个符号,每个列表可以有无限多的描述
给我一份清单,要求我列出所有项目的所有描述,没有重复项。秩序并不重要
示例
以下是我创建的列表:
(list
(list 'chips 'fresh 'crisp)
(list 'oranges 'fresh 'sweet 'cold 'heavy)
(list 'person 'tall)
(list 'computer 'new 'heavy))
它应该输出(列出'新鲜'脆'甜'冷'重'高'新)
。注意“新鲜”不会出现两次,重的也不会出现
代码
; Main function
(define (get-desc lst) (remove-desc (add-list lst)))
; Function to process each individual list
(define (add-list lst)
(cond [(empty? lst) empty]
[else (append (add-row (rest (first lst))) (add-list (rest lst)))]))
; Process a single list, not nested
(define (add-row lst)
(cond [(empty? lst) empty]
[else (cons (first lst) (add-row (rest lst)))]))
; Removes duplicates in a list
(define (remove-desc lst)
(cond [(empty? lst) empty]
[else (cons (first lst) (remove-desc (filter (lambda (x) (not (symbol=? (first lst) x))) lst)))]))
所以代码做了它应该做的事情。但是如何将helper函数转换为本地函数呢?这是我第一次尝试使用local,我对它不是很熟悉。甚至可以将所有这些功能整合到一个函数中吗?NB:一些教学语言使用特殊的形式local
,但是问题中没有说明您使用的是任何特定的语言,所以我假设您使用的是#lang racket
通过将它们移动到主函数中表达式的上方,它们将成为该函数的局部:
(define (get-desc lst)
;; Function to process each individual list
(define (add-list lst)
(cond [(empty? lst) empty]
[else (append (add-row (rest (first lst))) (add-list (rest lst)))]))
;; Process a single list, not nested
(define (add-row lst)
(cond [(empty? lst) empty]
[else (cons (first lst) (add-row (rest lst)))]))
;; Removes duplicates in a list
(define (remove-desc lst)
(cond [(empty? lst) empty]
[else (cons (first lst) (remove-desc (filter (lambda (x) (not (symbol=? (first lst) x))) lst)))]))
;; Lets get ready to rumble!
(remove-desc (add-list lst)))
虽然不必要,但在将某些变量移动到另一个闭包中时,您可能不需要传递它们,因为主函数的参数将在帮助程序中可用,除非它们被具有相同名称的自身参数隐藏。例如
(define (rmap proc lst)
(rmap-helper proc lst '()))
(define (rmap-helper proc lst acc)
(if (null? lst)
acc
(rmap-helper proc
(cdr lst)
(cons (proc (car lst)) acc))))
但是,在移动实现时,可以使用从父闭包中永远不会更改的值
(define (rmap proc lst)
(define (rmap-helper lst acc)
(if (null? lst)
acc
(rmap-helper (cdr lst)
(cons (proc (car lst)) acc))))
(rmap-helper proc lst '()))
哇!这是一个简单的解决办法。是的,我确实认为我在使用一种教学语言,但我会尝试使用你在这里提供的帮助我。谢谢:)