Если я понимаю вас правильно, вот что вы хотите.
SET @start_res = 20150301;
SET @finish_res= 20150501;
SET @finish_check= 20150801;
SET @start_check= 20150301;
SET @daily_hos= 3;
SELECT
(SELECT COUNT(DAY_IN) FROM t_hospital WHERE
DAY_IN between @start_check and @finish_check and
RES_DATE between @start_res and @finish_res and
ID_daily_hos =@daily_hos) AS 'arr' ,
(SELECT COUNT(PAT_STATUS) FROM t_hospital WHERE
PAT_STATUS like '%ong%' and
DAY_IN between @start_check and @finish_check and
RES_DATE between @start_res and @finish_res and
ID_daily_hos =@daily_hos) AS 'ONG1' ,
(SELECT COUNT(PAT_STATUS) FROM t_hospital WHERE
PAT_STATUS like '%rtde%' and
DAY_IN between @start_check and @finish_check and
RES_DATE between @start_res and @finish_res and
ID_daily_hos =@daily_hos) AS 'RTED' ,
(SELECT COUNT(PAT_STATUS) FROM t_hospital WHERE
PAT_STATUS like '%pol%' and
DAY_IN between @start_check and @finish_check and
RES_DATE between @start_res and @finish_res and
ID_daily_hos =@daily_hos) AS 'POLI' ,
(SELECT COUNT(PAT_STATUS) FROM t_hospital WHERE
PAT_STATUS like '%para%' and
DAY_IN between @start_check and @finish_check and
RES_DATE between @start_res and @finish_res and
ID_daily_hos =@daily_hos) AS 'para'
там некоторая причина синтаксически, почему органы по мультивыражению того, (если) формы требуют (зубец)?
ответ - "да", хотя, возможно, не по причине Вы ожидаете. Поскольку язык Common LISP (в отличие от Схемы и другого Шепелявит) требует funcall
, Ваше предложение не неоднозначно. Даже если бы это было неоднозначно, пока Ваши пользователи знают, что круглые скобки подразумевают progn
здесь, это работало бы.
Однако никакие другие конструкции* на языке не имеют дополнительные единственные/двойные круглые скобки. Много конструкций имеет неявный progn
с, но их вводный синтаксис всегда является тем же.
, Например, cond
имеет неявное progn
для каждого ответвления:
(cond (test1 body1) (test2 body2) ...)
Вы не можете переключиться назад и вперед:
(cond test1 exp1 (test2 body2) t exp3)
Так, даже при том, что Ваше предложение не неоднозначно, оно не соответствует синтаксису остальной части языка. ОДНАКО! Как Вы сказал, макрос тривиален для реализации. Необходимо сделать это сами и видеть, работает ли это хорошо. Я мог легко быть неправым; я довольно смещаюсь, так как почти все мое Лепетание находится в Схеме.
*Except case
. Hmf. Теперь я думаю, что могут быть другие.
Язык Common LISP не прекрасен, потому что это прекрасно, это прекрасно, потому что это совершенствуемо.
Целый язык создается на 25 специальных операторах; if
один из тех, progn
другой.
if
обеспечивает просто основной механизм тестирования условия, затем переходя или к один или к другой адрес кода. progn
обеспечивает основной механизм выполнения нескольких вещей и возвращения значения последнего.
Существует несколько макросов в стандарте языка, которые основываются на этом - например. when
, unless
, cond
, case
.
Если Вы хотите, у Вас есть несколько опций сделать что-то как то, что Вы предполагаете: для одного Вы могли записать ifm
макрос, который ожидает неявный progn
s как и выражения else тогдашние, или Вы могли записать, что это как Вы сказало, так, чтобы это обнаружило намерение, или Вы могли даже записать макрос чтения для добавления синтаксического сахара для progn
.
Не все выражения являются списками. Для (let ((a 42)) (if some-cond (a b c) (d e f)))
Вы не знали бы, должен ли (a b c)
быть интерпретирован как вызов к функции a
или как неявный зубец.
Поскольку синтаксис для , ЕСЛИ (< - ссылка HyperSpec), определяется как:
if test-form then-form [else-form] => result*
существуют, не начинают или заканчивают маркеры. Существует тогдашняя ФОРМА и не THEN-FORM*. PROGN является механизмом для определения последовательности форм, где формы выполняются слева направо, и значения последней формы возвращаются.
Это, возможно, было определено как это:
my-if test-form (then-form*) [(else-form*)] => result*
(defmacro my-if (test then &optional else)
(assert (and (listp then) (listp else)) (then else))
`(if ,test (progn ,@then) (progn ,@else)))
(my-if (> (random 10) 5)
((print "high")
:high)
((print "low")
:low))
ну, уже существует конструкция, которая поддерживает несколько форм: COND.
(cond ((> (random 10) 5)
(print "high")
:high)
(t
(print "low")
:low))
типичный стиль должен использовать COND, когда несколько альтернатив нужно попробовать и когда существует несколько then/else-forms. ЕСЛИ используется, когда еще существует только один тест и и тогда и форма. Для других случаев нет КОГДА и ТО, ЕСЛИ. КОГДА И ЕСЛИ поддержка только один или ТОГДА не еще не формируется (форма (формы)).
я предполагаю, что хорошо иметь по крайней мере одну условную форму (ЕСЛИ в этом случае), который прибывает без добавленных слоев круглых скобок. Запись
(if (> (random 10) 5)
(progn
(print "high")
:high)
(progn
(print "low")
:low))
является тогда маленькой ценой для оплаты. Или запишите дополнительный PROGNs или переключитесь на вариант COND. Если Ваш код действительно извлек бы выгоду из того, ЕСЛИ с несколькими тогда и еще формируется, то просто пишут, что макрос (см. выше). Lisp имеет его, так, чтобы можно было быть собственным разработчиком языка. Это важно, хотя думать о представлении макроса: мой макрос корректен? это проверяет ошибки? действительно ли это стоит того? действительно ли это читаемо (для других?)?
Уже существуют макросы для расширенной версии. Эта книга действительно хороша: http://www.gigamonkeys.com/book/ Ваш ответ находится в этой главе: http://www.gigamonkeys.com/book/macros-standard-control-constructs.html
стандартные макросы когда и то, если.
В языке Common LISP, этом коде:
(if t
((lambda (x) (+ x 5)) 10)
20)
возвратится 15. С Вашим предложением я думаю, что оно видело бы, что истинный пункт является списком, и автоматически преобразуйте его в:
(if t
(progn (lambda (x) (+ x 5)) 10)
20)
который возвратился бы 10. Это правильно?
Я не уверен, что это "тривиально" для различения "список" и "вызов функции" в CL. Вы намереваетесь для этого изменения быть non-backwards-compatible? (Новые и интересные диалекты Lisp всегда прохладны, но затем это не язык Common LISP.) Или можно ли дать пример того, что Вы имеете в виду?
В Lisp круглые скобки указывают на функциональное приложение, не группируясь. Что означало бы Ваше выражение, была ли exp1
функция, которая возвратила функцию? Это назвали бы с аргументами (exp2) (exp3)
или нет?
Когда у Вас не 'еще' есть ответвление, стандартные макросы when
и unless
справка. Иначе лучше использовать cond
, если у Вас есть несколько выражений в каком-либо ответвлении.