Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scheme 在Racket中使用局部函数代替辅助函数_Scheme_Racket - Fatal编程技术网

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 '()))

哇!这是一个简单的解决办法。是的,我确实认为我在使用一种教学语言,但我会尝试使用你在这里提供的帮助我。谢谢:)