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