В языке Common LISP, почему делают органы по мультивыражению того, (если) операторы требуют (зубец)?

Если я понимаю вас правильно, вот что вы хотите.

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'
14
задан 8 February 2009 в 18:55
поделиться

8 ответов

там некоторая причина синтаксически, почему органы по мультивыражению того, (если) формы требуют (зубец)?

ответ - "да", хотя, возможно, не по причине Вы ожидаете. Поскольку язык Common LISP (в отличие от Схемы и другого Шепелявит) требует funcall, Ваше предложение не неоднозначно. Даже если бы это было неоднозначно, пока Ваши пользователи знают, что круглые скобки подразумевают progn здесь, это работало бы.

Однако никакие другие конструкции* на языке не имеют дополнительные единственные/двойные круглые скобки. Много конструкций имеет неявный progn с, но их вводный синтаксис всегда является тем же.

, Например, cond имеет неявное progn для каждого ответвления:

(cond (test1 body1) (test2 body2) ...)

Вы не можете переключиться назад и вперед:

(cond test1 exp1 (test2 body2) t exp3)

Так, даже при том, что Ваше предложение не неоднозначно, оно не соответствует синтаксису остальной части языка. ОДНАКО! Как Вы сказал, макрос тривиален для реализации. Необходимо сделать это сами и видеть, работает ли это хорошо. Я мог легко быть неправым; я довольно смещаюсь, так как почти все мое Лепетание находится в Схеме.

*Except case. Hmf. Теперь я думаю, что могут быть другие.

6
ответ дан 1 December 2019 в 06:16
поделиться

Язык Common LISP не прекрасен, потому что это прекрасно, это прекрасно, потому что это совершенствуемо.

Целый язык создается на 25 специальных операторах; if один из тех, progn другой.

if обеспечивает просто основной механизм тестирования условия, затем переходя или к один или к другой адрес кода. progn обеспечивает основной механизм выполнения нескольких вещей и возвращения значения последнего.

Существует несколько макросов в стандарте языка, которые основываются на этом - например. when, unless, cond, case.

Если Вы хотите, у Вас есть несколько опций сделать что-то как то, что Вы предполагаете: для одного Вы могли записать ifm макрос, который ожидает неявный progns как и выражения else тогдашние, или Вы могли записать, что это как Вы сказало, так, чтобы это обнаружило намерение, или Вы могли даже записать макрос чтения для добавления синтаксического сахара для progn.

11
ответ дан 1 December 2019 в 06:16
поделиться

Не все выражения являются списками. Для (let ((a 42)) (if some-cond (a b c) (d e f))) Вы не знали бы, должен ли (a b c) быть интерпретирован как вызов к функции a или как неявный зубец.

4
ответ дан 1 December 2019 в 06:16
поделиться

Поскольку синтаксис для , ЕСЛИ (< - ссылка 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 имеет его, так, чтобы можно было быть собственным разработчиком языка. Это важно, хотя думать о представлении макроса: мой макрос корректен? это проверяет ошибки? действительно ли это стоит того? действительно ли это читаемо (для других?)?

4
ответ дан 1 December 2019 в 06:16
поделиться

Уже существуют макросы для расширенной версии. Эта книга действительно хороша: http://www.gigamonkeys.com/book/ Ваш ответ находится в этой главе: http://www.gigamonkeys.com/book/macros-standard-control-constructs.html

стандартные макросы когда и то, если.

3
ответ дан 1 December 2019 в 06:16
поделиться

В языке 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.) Или можно ли дать пример того, что Вы имеете в виду?

17
ответ дан 1 December 2019 в 06:16
поделиться

В Lisp круглые скобки указывают на функциональное приложение, не группируясь. Что означало бы Ваше выражение, была ли exp1 функция, которая возвратила функцию? Это назвали бы с аргументами (exp2) (exp3) или нет?

1
ответ дан 1 December 2019 в 06:16
поделиться

Когда у Вас не 'еще' есть ответвление, стандартные макросы when и unless справка. Иначе лучше использовать cond, если у Вас есть несколько выражений в каком-либо ответвлении.

2
ответ дан 1 December 2019 в 06:16
поделиться