如何检查用户是否未将任何内容放入列表中?方案编程

时间:2017-10-31 07:06:34

标签: scheme racket

(define (min list)
 (cond ((empty? (car list) '"It is empty"))  <- Problem is here. Code work without this line.
       ((empty? (cdr list)) (car list))         ;to check list is empty
       ((< (car list) (min (cdr list))) (cdr list))
       (else (min (cdr list) ))))

我是计划编程语言的新手。我试图从列表中获得最小值。当我把(),程序给我一个错误:cdr:合同违规预期:对?给出:&#39;()。我想在这里做的是我想要打印出来当用户输入()时它是空的。是否有可能在Scheme编程中这样做?

3 个答案:

答案 0 :(得分:0)

你可以在How To Design Programs, 2e这个由Racket语言开发者编写的教科书中找到这个问题的答案 - 以及更多 -

在这种情况下,您希望将模板用于列表上的功能。第II节更详细地介绍了这一点,更具体地说,第9.1节。

答案 1 :(得分:0)

Scheme和其他Lisp语言中列表的结构基于cons-cells。每个cons-cell都包含一个值(car)和指向列表中下一个cons单元格的指针(cdr,发音为see-dar),如下所示:

         +-+-+                  
         |1|----+               
         +-+-+  |               
                +-+-+           
                |2|---+         
                +-+-+ |         
                      +-+-+     
                      |3| |     
                      +-+-+

列表结束的最后一个单元格包含一个零。在Scheme表示法中,cons-cell看起来像这样:

(1 . 2)

所以没有任何语法糖的列表看起来像这样:

(1 . (2 . (3 . (4 . nil))))

一个空列表,由一个如下所示的cons单元格组成:

(nil)

请注意,空列表没有car?空列表被视为nil,因此:

(1 . (2 . (3 . (4 . ()))))

就像前一个一样。

现在,当你使用语法糖时,列表看起来像这样:

(1 2 3 4)

但底层结构是一样的。因此,要测试是否有空列表,请测试它是否为nil(哪个Scheme使用empty?函数)。因此,不是在列表的汽车上调用empty?,这是错误的思考和错误,而是在列表中调用它。所以你的功能应该是这样的:

(define (min list)
 (cond ((empty? list "It is empty"))
       ((empty? (cdr list)) (car list))
       ((< (car list) (min (cdr list))) (cdr list))
       (else (min (cdr list) ))))

请注意,第二个分支检查列表是否为空,正如您的评论所示:它检查列表是否只有一个元素或没有元素。如果你的cdr是空的,但你的车没有(第二臂允许),那么你有一个元素列表:

(foo . ())

希望这有帮助!

有关如何改善特定功能的更多信息,请查看Oscar Lopez's answer to this question

答案 2 :(得分:0)

我想你要打印空列表或获取最小值,对吧?

(define (min list)
      (if (null? list)
          "It's empty."
          (let loop ([loop_list list]
                     [min_value (car list)])
            (if (null? loop_list)
                min_value
                (loop
                 (cdr loop_list)
                 (if (< min_value (car loop_list)) min_value (car loop_list)))))))