LINUX.ORG.RU

Статическая типизация в LISP


0

0

Вот возник такой вопрос. Следует ли мне вместо defun юзать defmethod с указанием типа аргумента? Это ведь будет быстрее работать? Скажем:

(defgeneric message (text))

(defmethod message ((text string))

...)

anonymous

Нет, будет работать медленнее. И это не статическая типизация, это специализация метода.

mv ★★★★★
()

Как принято, оптимизацию надо производить тогда, 
когда уже все написано и выявлены тонкие места. 
Если это так, то лучше писать:

(defun message (text)
   (declare (simple-string text))
      ...)

stassats ★★★★
()
Ответ на: комментарий от stassats

type в declare не забыл? :)

А если ещё используется sbcl, то нужно играться со speed и safety. С параметрами оптимизации у sbcl что-то неладное творится, оптимальный код генерируется, порой, при совершенно неожиданных комбинациях. Ну и если в CLOS не лезть и везде safety 0 использовать, то код получается весьма приличный.

mv ★★★★★
()
Ответ на: комментарий от den73

Особенно там смешно видеть такой комментарий:

;;; De-optimized by Isaac Gouy

mv ★★★★★
()

Еще по поводу оптимизаций SBCL --- http://www.sbcl.org/manual/Efficiency-Hacks.html

Также если не используются треды, то лучше sbcl без них скомпилировать. Дает совсем небольшой прирост.

Еще можно sb-ext::*derive-function-types* установить в t (описание в докстринге).

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

Если уж совсем нужно быстро, то можно переписать стандартные CL-функции на свои, более тупые.

Вот пример такой оптимизации http://paste.lisp.org/display/63665

stassats ★★★★
()
Ответ на: комментарий от stassats

;;; De-optimized by Isaac Gouy Я тоже не понял, но и разбираться не стал.

den73 ★★★★★
()
Ответ на: комментарий от anonymous

Читаем стандарт:

"declaration identifier n. one of the symbols declaration, dynamic-extent, ftype, function, ignore, inline, notinline, optimize, special, or type; ___or a symbol which is the name of a type__; or a symbol which has been declared to be a declaration identifier by using a declaration declaration."

stassats ★★★★
()
Ответ на: комментарий от mv

PCL - это "Practical Common Lisp"? Не знаю, не читал. Cltl2, то есть

http://www.cs.cmu.edu/Groups/AI/html/cltl/cltl2.html

- действительно можно (местами приятно) читать и лисп я учил как раз по нему. Но когда я читаю Common Lisp Hyperspec,

http://www.lispworks.com/documentation/HyperSpec/Front/index.htm

я так скрежещу зубами, что они быстро стачиваются. К сожалению, cltl2 устарел, в нём есть отличия от современного стандарта. Хотя для начала на эти отличия можно просто "забить".

den73 ★★★★★
()
Ответ на: комментарий от mv

Хакерской? Это как? Думаю, что PCL лучшая книга для начала, всем советую, кто хочет изучать лисп. Если до этого не сильно знаком с программированием, то Gentle Introduction to Symbolic Computation.

А cltl2 иначе, как справочник (с чем лучше справляется clhs), использовать трудно. Там же тебя не научат, как писать на лиспе (стиль и традиции).

stassats ★★★★
()
Ответ на: комментарий от stassats

> А cltl2 иначе, как справочник (с чем лучше справляется clhs), использовать трудно. Там же тебя не научат, как писать на лиспе (стиль и традиции).

А в pcl нет справочных данных. clhs же сильно сухой.

Естественно, одной книжки по предмету прочитать недостаточно.

mv ★★★★★
()
Ответ на: комментарий от den73

> Спасибо, но я не понимаю, почему этого до сих пор никто не сделал в электронной форме?

Кому cltl2 нужен, у того он в бумажном виде? :)

mv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.