Схема если заявление. Почему этот оператор отображения не выполняется? - PullRequest
0 голосов
/ 15 апреля 2020

Я использую следующий код:

(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 прямо перед запуском строки?

1 Ответ

4 голосов
/ 15 апреля 2020

Синтаксис 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))
  )

)
...