Про "если .." в схеме (plt-схема) - PullRequest
16 голосов
/ 17 июля 2009

У меня было довольно простое требование в моей программе Scheme, чтобы выполнить больше чем одно утверждение, в true условии «если». , Поэтому я пишу свой код, что-то вроде этого:

(if (= 1 1)
 ((expression1) (expression2))  ; these 2 expressions are to be
                                ; executed when the condition is true
  (expression3))

Очевидно, что вышесказанное не работает, так как я случайно создал # процедуру с # аргументами. Итак, чтобы получить мой проделанную работу, я просто помещаю вышеприведенные выражения в новую функцию и вызовите его оттуда, вместо expression1, expression2. Это работы.

Итак, моя точка зрения здесь: есть ли другая условная конструкция, которая может поддержать мое требование здесь?

Ответы [ 5 ]

22 голосов
/ 17 июля 2009

В MIT-схеме, которая не сильно отличается, вы можете использовать begin:

(if (= 1 1)
    (begin expression1 expression2)
    expression3)

Или используйте Cond:

(cond ((= 1 1) expression1 expression2)
      (else expression3))
2 голосов
/ 17 июля 2009

(begin ...) - это то, как вы оцениваете несколько выражений и возвращаете последнее. Многие другие конструкции действуют как «неявные» блоки begin (они допускают несколько выражений, как и блок begin, но вам не нужно говорить begin), как тело предложения cond, тело define для функций, тело lambda, тело let и т.д .; Вы могли использовать это, не осознавая этого. Но для if это невозможно в синтаксисе, потому что есть два выражения (одно для истины и одно для ложных) рядом друг с другом, и поэтому разрешение нескольких выражений сделает его неоднозначным. Поэтому вы должны использовать явную конструкцию begin.

1 голос
/ 17 июля 2009

вы можете использовать (начало ...), чтобы получить то, что вы хотите, в истинной ветви вашего оператора if Смотри здесь

1 голос
/ 17 июля 2009

Вы можете использовать COND или поместить выражения в что-то вроде PROGN в Лиспе (я не уверен, как это вызывается в схеме PLT. edit: это называется BEGIN ).

COND выглядит так на схеме:

(cond [(= 1 1)
       (expression1)
       (expression2)]
      [else
       (expression3)])
0 голосов
/ 16 сентября 2012

Использование оператора if с более чем двумя случаями подразумевает вложение, например ::10000

(if (test-1)               ; "if"
    (expression-1)
    (if (test-2)           ; "else-if"
        (expression-2)
        (expression-3)))  ; "else"

Использование cond представляется предпочтительным способом выражения условных операторов, поскольку его легче читать, чем набор вложенных if s, и вы также можете выполнять несколько операторов, не используя выражение begin:

(cond ((test-1)
       (expression-1))
      ((test-2) 
       (expression-2)
       (expression-3))
      (else 
       (default-expression)))
...