【问题标题】:Scheme if statement. Why does this display statement not run?方案 if 语句。为什么这个显示语句不运行?
【发布时间】:2020-07-28 23:06:36
【问题描述】:

我正在运行以下代码:

(define (myignore x)
    0
)
(define (myinterpreter mylist)
  (evaluate mylist)
)

(define (evaluate mylist)

  (if (eqv? (car mylist) 'prog)
    (evaluate (cdr mylist))
    (display (integer? (car mylist)))
    (if (integer? (car mylist))
      (display "YESSS")
    )
  )

  (if (eqv? (car mylist) 'myignore)
    (myignore (cdr mylist))
  )

)

(myinterpreter '(prog 5))

我想知道为什么包含 (display ("YESSS")) 的行没有运行,尽管 (display (integer? (car mylist))) 在行运行之前等于 true?

【问题讨论】:

  • 你用的是什么Scheme方言?
  • 在这个站点上运行的是repl.it/languages/scheme。我相信scheme48?
  • 上面写着 BiwaScheme。

标签: functional-programming scheme lisp


【解决方案1】:

if 的语法是:

(if predicate
    consequent
    optional-alternative)

在您的代码中,consequent(evaluate (cdr mylist))optional-alternative(display (integer? (car mylist)))。之后的所有内容都将被忽略。

如果要执行多个表达式,则必须将它们包装在begin中。

(define (evaluate mylist)

  (if (eqv? (car mylist) 'prog)
    (evaluate (cdr mylist))
    (begin 
      (display (integer? (car mylist)))
      (if (integer? (car mylist))
        (display "YESSS")
      )
    )
  )

  (if (eqv? (car mylist) 'myignore)
    (myignore (cdr mylist))
  )

)

【讨论】:

  • 如果你只想插入到任何可能的 if 语句中怎么办?我尝试将(display "hello) 包裹在(begin) 中,但没有成功。
  • (begin (display "hello")) 应该可以正常工作。没有看到完整的代码,我无法判断你做错了什么。
  • 您在"hello 末尾缺少"。这是复制错误还是代码不起作用?
  • 我一定是打错字了。将其包裹在 begin 中确实有效。 (define (value a b) (if (> a b) "A" (begin (display "A is greater") ) ) (if (> b a) "B" (begin (display "B is greater") ) ) ) (value 1 2)。这是一个演示。
  • 当然,如果只执行一个表达式,则无需使用begin
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-14
  • 1970-01-01
  • 2013-09-11
  • 2012-09-10
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多