首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >缩短重复的代码行

缩短重复的代码行
EN

Stack Overflow用户
提问于 2016-06-27 05:59:42
回答 1查看 136关注 0票数 0

我使用temp将值保存在临时搜索列表中,从最多的temp ( temp -5)到最小的temp (temp-1)。我想在搜索列表的撤销函数中添加这个函数。如果我使用的是temp-100而不是temp-1,那么如何将代码行缩短为循环呢?如果我使用"for循环“,我应该把cond放在哪里?

代码语言:javascript
复制
#lang racket
(define temp-flag 0)
(define temp-1 '())
(define temp-2 '())
(define temp-3 '())
(define temp-4 '())
(define temp-5 '())
(define search-list '(1 2 3 4 5 6 7 8 9 10))
(define (place-temp tf)
  (cond
    [(equal? tf 1)
     (set! temp-1 search-list)
     (set! temp-flag 5)]
    [(equal? tf 2)
     (set! temp-2 search-list)
     (set! temp-flag 1)]
    [(equal? tf 3)
     (set! temp-3 search-list) (set! temp-flag 2)]
    [(equal? tf 4)
     (set! temp-4 search-list) (set! temp-flag 3)]
    [(set! temp-5 search-list) (set! temp-flag 4)]
    ))  

 (place-temp temp-flag)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-30 19:28:02

解决你的问题的基本方法是迈克尔·维尔斯的建议。第一次(最少侵入性)尝试可能如下所示:

代码语言:javascript
复制
    (define temp-flag 0)
    (define search-list '(1 2 3 4 5 6 7 8 9 10))

    (define *num-of-temps* 5) ;; you will just have to change it to 100
    (define *temps* (make-vector *num-of-temps* '()))

    (define (next-temp-flag tf)
      (cond ((= tf 1) *num-of-temps*)
        ((and (> tf 1) (< tf *num-of-temps*)) (- tf 1))
        (else (- *num-of-temps* 1))))

    (define (place-temp tf)
      (vector-set! *temps* (- tf 1) search-list)
      (set! temp-flag (next-temp-flag tf)))

从临时标志的角度来看,它的工作原理完全相同。但这不是一个很酷的程序,所以让我们试着改进它。

首先,这个下一个临时标志有点奇怪,但它精确地模仿了cond语句对tf和temp标志的行为。我假设您只在索引temp-1、temp-2等时使用temp-标志,并且您不太关心tf大于5(或100,或者一般情况下大于*num-of-temps*)。所以第一件事你可以简化一下:

代码语言:javascript
复制
    (define (next-temp-flag tf)
      (if (= tf 1) *num-of-temps* (- tf 1)))

现在第二件事是向量(cf https://docs.racket-lang.org/reference/vectors.html)中的位置(‘indexes’)从0开始,而不是从1开始,所以例如你的temp-1现在是*( vectors 0)*。因此,您可以这样使用“减缩_tf_s”:

代码语言:javascript
复制
    (define (next-temp-flag tf)
      (if (= tf 0) (- *num-of-temps* 1) (- tf 1)))

    (define (place-temp tf)
      (vector-set! *temps* tf search-list)
      (set! temp-flag (next-temp-flag tf)))

显然(或不;)这个下一个临时标志现在可以用模函数表示:

代码语言:javascript
复制
    (define (next-temp-flag tf) (modulo (- tf 1) *num-of-temps*))

...and如果您想要一个更短的代码,您可以同样很好地将其内联到位-temp。

最后一件事是命名约定:也许您刚刚使用了这些define_s来设置一个最小的示例,但是如果项目中实际上有这些“全局变量”,那么命名约定就是使用星星,所以您宁愿使用*search-list*和*temp-标志*。还请注意,_place-temp正在产生副作用,因此您可能需要将其命名为place-temp!。如果你打算申请临时住所!到*temp标记*时,您可以完全删除参数。也许*临时位置*听起来比*临时标志更容易,因为它现在是一个位置。总之,你可能会以这样的结尾结束:

代码语言:javascript
复制
    (define *num-of-temps* 5) ;; you will just have to change it to 100
    (define *temps* (make-vector *num-of-temps* '()))

    (define *temp-position* (- *num-of-temps* 1)) ;; because (modulo -1 n) is n-1.
    (define *search-list* '(1 2 3 4 5 6 7 8 9 10))

    (define (place-temp!)
      (vector-set! *temps* *temp-position* *search-list*)
      (set! *temp-position* (modulo (- *temp-position* 1) *num-of-temps*)))

    (place-temp!)

对不起,这是一个很长的答案,但正如诗人说的‘我没有足够的时间写一个更短的答案’。我还怀疑,如果您想要实现undo,您可能需要其他的东西(堆栈而不是循环缓冲区) --但这远远超出了您的问题。

祝你的项目好运!

PS我希望当您习惯于计划时,您将减少依赖全局变量和过程,而更多地依赖本地绑定和函数(正如另一位诗人所说的‘保持功能性,我的朋友!’)。但是事情需要时间,最重要的是你喜欢你的黑客行为。

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

https://stackoverflow.com/questions/38046780

复制
相关文章

相似问题

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