О, “если..” в схеме (plt-схема)

Если Вы реализуете явно, Вы только будете в состоянии сослаться на интерфейсных участников через ссылку, которая имеет тип интерфейса. Ссылка, которая является типом класса с реализацией, не представит тех интерфейсных участников.

, Если Ваш класс с реализацией не общедоступен, за исключением метода, используемого для создания класса (который мог быть фабрикой или МОК контейнер), и за исключением методов интерфейса (конечно), тогда я не вижу преимущества для явной реализации интерфейсов.

Иначе, явно реализация интерфейсов удостоверяется, что ссылки на Ваш конкретный класс с реализацией не используются, позволяя Вам изменить ту реализацию в более позднее время. "Удостоверяется", я предполагаю, "преимущество". Хорошо учтенная реализация может выполнить это без явной реализации.

недостаток, по-моему, то, что Вы бросите типы к/от интерфейсу в коде реализации, который действительно имеет доступ к непубличным участникам.

Как много вещей, преимуществом является недостаток (и наоборот). Явно реализующие интерфейсы гарантируют, что Ваш код реализации реального класса не представлен.

16
задан coredump 18 October 2015 в 20:20
поделиться

4 ответа

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

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

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

(cond ((= 1 1) expression1 expression2)
      (else expression3))
22
ответ дан 30 November 2019 в 21:29
поделиться

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

1
ответ дан 30 November 2019 в 21:29
поделиться

(begin ...) is how you evaluate multiple expressions and return the last one. Many other constructs act as "implicit" begin blocks (they allow multiple expressions just like a begin block but you don't need to say begin), like the body of a cond clause, the body of a define for functions, the body of a lambda, the body of a let, etc.; you may have been using it without realizing it. But for if, that is not possible in the syntax because there are two expressions (the one for true and the one for false) next to each other, and so allowing multiple expressions would make it ambiguous. So you have to use an explicit begin construct.

2
ответ дан 30 November 2019 в 21:29
поделиться

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

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

(cond [(= 1 1)
       (expression1)
       (expression2)]
      [else
       (expression3)])
1
ответ дан 30 November 2019 в 21:29
поделиться