‮Сдвиг по фазе (kincajou) wrote,
‮Сдвиг по фазе
kincajou

Lisp defstruct :constructor

Как-то это непривычно, что конструктор не может быть нормальной функцией, т.е. внутрь нельзя впихнуть немножечко исполняемого кода, чтобы он что-нибудь ещё полезное сделал. Скажем, создаёшь объект типа rectangle и задаёшь две точки - "правый верхний" и "левый нижкий" углы. Это запросто.

Но если вдруг где координакты ошибочные, то чтоб конструктор автоматически и упорядочил и переставил, так сделать уже нельзя... или можно?

Или два конструктора с одним и тем же именем, но с разным списком аргументов. Ну, типа перегрузки в Си++. Не удаётся сделать (и не понимаю, предусмотрено ли стандартом вообще). С другой стороны, всегда можно набросать функцию с другим именем и нужной сигнатурой, внутри которой и будет создаваться новый объект. Просто это непривычно.

(defstruct 
 (rectangle
  (:constructor make-rectangle (righttop leftbottom)
    ; А вот тут было бы полезно воткнуть код, упорядочивающий
    ; координаты, если вдруг, к примеру, "верх" ниже "низа".
    ; Я пробовал так сделать, но ECL, похоже, просто игнорирует всё, что тут написано.
    ; Но и на ошибку не ругается. То есть следующая фенька
    (format t "Here comes a rectangle!~%")
    ; вызвана не будет
  )
 )
 (righttop (make-point)) ; конструкторы точек заданы где-то снаружи, щас они нам не интересны
 (leftbottom (make-point))
)


А с другой стороны... логично. Функции возвращают "какие-то" значения, а конструктор возвращает созданный объект (или нуль, если какая ошибка). В самописном конструкторе легче допустить малозаметный ляпсус, так что такое ограничение может быть даже полезным.
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 4 comments