Scheme 方案:不能在if语句中使用t

Scheme 方案:不能在if语句中使用t,scheme,iteration,mit-scheme,Scheme,Iteration,Mit Scheme,如果问题标题有点混乱,我道歉。也许等你看完之后,你可以给我推荐一个更好的标题 作为在线课程家庭作业的一部分,我在麻省理工学院的scheme中写了一个迭代过程来显示从1到给定数字的数字 下面的代码可以正常工作: (define (count2-iter num) (define (iter counter) (cond ((> counter num) #t) (else (display counter)

如果问题标题有点混乱,我道歉。也许等你看完之后,你可以给我推荐一个更好的标题

作为在线课程家庭作业的一部分,我在麻省理工学院的scheme中写了一个迭代过程来显示从1到给定数字的数字

下面的代码可以正常工作:

(define (count2-iter num)
    (define (iter counter)
        (cond ((> counter num) #t)
              (else (display counter)
                (iter (+ counter 1)))))
    (iter 1))
输出:

1 ]=> (load "count2-iter.scm")

;Loading "count2-iter.scm"... done
;Value: count2-iter

1 ]=> (count2-iter 10)
12345678910
;Value: #t
1 ]=> (count2-iter1 5)
5
;The object #!unspecific is not applicable.
;To continue, call RESTART with an option number:
; (RESTART 2) => Specify a procedure to use in its place.
; (RESTART 1) => Return to read-eval-print level 1.
就我个人而言,我不喜欢仅在2个分支中使用cond,为此我尝试使用if

(define (count2-iter1 num)
    (define (loop idx)
        (if (> idx num)
            #t
            ((display idx)
             (loop (+ idx 1)))))
    (loop 1))
输出:

1 ]=> (load "count2-iter.scm")

;Loading "count2-iter.scm"... done
;Value: count2-iter

1 ]=> (count2-iter 10)
12345678910
;Value: #t
1 ]=> (count2-iter1 5)
5
;The object #!unspecific is not applicable.
;To continue, call RESTART with an option number:
; (RESTART 2) => Specify a procedure to use in its place.
; (RESTART 1) => Return to read-eval-print level 1.
为什么会这样?不应该以cond中使用的方式进行评估吗?非常感谢您的解释,因为我对Scheme还是新手。

请尝试以下方法:

(define (count2-iter1 num)
  (define (loop idx)
    (if (> idx num)
        #t
        (begin ; notice the difference!
          (display idx)
          (loop (+ idx 1)))))
  (loop 1))
原因如下:当使用if时,后续部分中只能有一个表达式,备选部分中只能有一个表达式。如果需要一个以上的表达,我们必须用begin来围绕它们。。。。您将表达式包围在…,这是不正确的,因为括号用于函数应用程序,这就是错误消息声明对象!不具体不适用

另一方面,当条件满足时,cond的每个子句都有一个隐式begin。就我个人而言,当我在条件后需要多个表达式时,我更愿意坚持使用cond,这样就不那么冗长了。

试试以下方法:

(define (count2-iter1 num)
  (define (loop idx)
    (if (> idx num)
        #t
        (begin ; notice the difference!
          (display idx)
          (loop (+ idx 1)))))
  (loop 1))
原因如下:当使用if时,后续部分中只能有一个表达式,备选部分中只能有一个表达式。如果需要一个以上的表达,我们必须用begin来围绕它们。。。。您将表达式包围在…,这是不正确的,因为括号用于函数应用程序,这就是错误消息声明对象!不具体不适用


另一方面,当条件满足时,cond的每个子句都有一个隐式begin。就我个人而言,当我需要在一个条件后使用多个表达式时,我更喜欢使用cond,因为它不太冗长。

+1,但就我个人而言,我认为反转条件更自然。如果没有其他分支,则更好的是何时或除非形式谢谢…我以前曾多次用begin写过cond,但从来都不知道它是隐含在那里的。+1,但我个人认为反转条件更为自然。如果没有其他分支,更好的是何时或除非形式谢谢你…我以前写过几次begin的cond,但从来都不知道它是隐含的。