Как работает оператор if в Scheme? - PullRequest
4 голосов
/ 22 апреля 2011

Это ссылка, которой я сейчас учу себя Схема, http://www.ccs.neu.edu/home/dorai/t-y-scheme/t-y-scheme-Z-H-1.html

По словам автора, enter image description here

Тогда я попробовал минимальный пример

(define (check-p x)
  (if (>= x 0)
      (display 1)))

, и DrScheme дал мне ошибки:

if: bad syntax (must have an "else" expression) in: (if (>= x 0) (display 1))

Если я добавлю дополнительный оператор в оператор if, тогда он будет работать.Но я не понимаю, зачем нам там дополнительное заявление?Вышеуказанный код имеет смысл для меня.Если число больше 0, отобразите 1, иначе ничего не делайте.Есть идеи?

Спасибо,

Ответы [ 3 ]

5 голосов
/ 22 апреля 2011

DrScheme включает в себя несколько «обучающих» диалектов Схемы, которые являются ограниченными подмножествами (они налагают больше ограничений, чем) стандартной схемы R 5 RS или R 6 RS. Используемый вами диалект, вероятно, ограничивает вас использованием операторов if, в которых вы предоставляете значения для обеих ветвей. Фактически, я только что проверил, и похоже, что все «обучающие» диалекты запрещают вам использовать оператор if только с одной ветвью.

Это поможет вам научиться программировать в аппликативном (иногда известном как функциональный ) стиле программирования, в котором вы не полагаетесь на побочные эффекты, а вместо этого вычисляете значения просто применяя функции и возвращая результаты от них. В аппликативном стиле, без побочных эффектов, единственным результатом оператора является возвращение значения. Оператор if, который не возвращает значение в одной из его ветвей, не будет иметь значения для этого случая; это было бы бесполезно и фактически вызывало бы неопределенное поведение, когда вы пытались использовать значение, возвращаемое этим оператором if. В аппликативном стиле каждое утверждение в языке является выражением, которое оценивается по значению, которое он вычисляет, а не по побочным эффектам, которые он вызывает.

Если вы используете display для предоставления вывода, вы не используете чисто аппликативный стиль. Это прекрасно, но многие введения в Scheme любят начинать с представления аппликативного стиля, потому что гораздо проще рассуждать и узнавать, как все на самом деле работает.

Поскольку вы не работаете с текстом, который предполагает аппликативный стиль программирования, я бы порекомендовал выбрать другой диалект. В меню «Язык» выберите «Выбрать язык», а затем я бы порекомендовал выбрать либо «R5RS» (который должен быть как можно ближе к стандарту), либо «Довольно большой» (то есть R5RS плюс куча удобных расширений PLT).

3 голосов
/ 22 апреля 2011

Какую версию Схемы вы используете? DrScheme 372 не имеет проблем с оператором if без предложения else.

В любом случае Scheme предоставляет операторы when и unless, которые действуют как оператор if, который имеет (соответственно) только ветвь then или только ветвь else. Учитывая это, нет необходимости в том, чтобы в операторе if его ветвь else была необязательной.

0 голосов
/ 31 августа 2013

попробуйте изменить это:

(define (check-p x)
(if (>= x 0)
(display 1)))

к этому:

(define (check-p x)
(when (>= x 0)
(display 1)))

В Racket должно работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...