LINUX.ORG.RU

CLOS: (call-next-method)


0

0

Из описания в PCL не понял, как (call-next-method) выбирает нужный метод.

Поскольку я буду обсуждать вопросы создания новых классов только в следующей главе, для понимания вы можете просто представить, что определенные классы уже существуют: предположим, что существует класс bank-account и он имеет два подкласса – checking-account и savings-account. Иерархия классов выглядит следующим образом:

(картинки с иерархией нет в тексте)

(defgeneric withdraw (account amount)
  (:documentation "Withdraw the specified amount from the account.
Signal an error if the current balance is less than amount."))

(defmethod withdraw ((account bank-account) amount)
  (when (< (balance account) amount)
    (error "Account overdrawn."))
  (decf (balance account) amount))

(defmethod withdraw ((account checking-account) amount)
  (let ((overdraft (- amount (balance account))))
    (when (plusp overdraft)
      (withdraw (overdraft-account account) overdraft)
      (incf (balance account) overdraft)))
  (call-next-method))

Функция CALL-NEXT-METHOD является частью системы обобщенных функций и используется для комбинации методов. Она сообщает, что контроль должен быть передан от текущего метода, к методу, специализированному для bank-account.

И нигде нет объяснения почему управление должно передаться именно специализации для bank-account, а из приведённого кода я не понимаю. А если ещё есть десяток методов (withdraw)?

Ответ на: комментарий от anonymous

сегодня легко поддаёшься влиянию троллей с лора, а завтра уже настоящие мошенники разводят тебя на бабки, и ты жертвуешь всё имущество какой-нибудь секте.

anonymous
()

Если упростить ситуацию, забыть про мультиметоды и eql, то call-next-method будет аналогичен вызову соответствующей виртуальной функции родительского класса в других языка. Пример на С++

class B: public A {
public:
  void draw();
};

void B::draw() {
   // Какая-то специфичная для B обработка
   A::draw();
}

P.S. Технические аспекты на LOR лучше не обсуждать (тролли замучают), пиши на lisper.ru ;)

archimag ★★★
()

Сеньк 2 Архимаг и второй Анонимус. Все непонятки были из-за отсутствующей картинки, где нарисована иерархия типов.

TirNaNOg
() автор топика
Ответ на: комментарий от ixrws

>как же как же, анонимус не нужен же!

а кому лисп-то нужен? по результатам последнего срача - никому. только пара человек, отметившихся в треде, получила что-то с написания кода на лиспе. предложение есть( куча людей из того треда что-то пишет на лиспе фор фан), а спроса нет - лисп не нужен.

и этому есть объяснение: свободные реализации как платформы просто неготовы к использованию( за двадцать лет-то) - в них убого всё, начиная от тредов, и заканчивая апликэйш деливери. платные же не выдерживают конкуренции с бесплатными нетом и жабой.

и анонимус очень нужен. кто же иначе будет развенчивать фантазии некоторых о лисперов о лиспе?

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

> Все непонятки были из-за отсутствующей картинки,

где нарисована иерархия типов.


Да, это мой косяк, сейчас картинки из снапшота вики не вытягиваются :( но это раз мешает освоению материала, то постараюсь побыстрей исправить...

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

Пока только в одном месте, в главе 16 «Обобщённые функции», до этого отсутствие картинок не мешало.

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

и анонимус очень нужен. кто же иначе будет развенчивать фантазии некоторых о лисперов о лиспе?

Анонимус нынче сдулся: пример с перлом в три строки в том топике рожал полдня, какие-то пхп, дельфи и 1с упоминал и кроме общей демагогии про «не нужно», ничего не смог сказать.

TirNaNOg
() автор топика
Ответ на: комментарий от TirNaNOg

полдня не аргумент - кто угодно может быть занят и больший промежуток времени.

пхп, дельфи и 1с - это нужно рынку. и вряд ли кто-то тут сможет предложить лучшее решение на лиспе, чем предлагают другие на озвученных технологиях в их нишах.

«не нужно», ничего не смог сказать. - что можно сказать, если лисп никому не нужен? обратное подтвердить проще, но это не подтвердилось.

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

>«не нужно», ничего не смог сказать. - что можно сказать, если лисп никому не нужен? обратное подтвердить проще, но это не подтвердилось.

+1. Тем более что нельзя доказывать отрицание. Пусть сами докажут, что лисп нужен.

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

Мне спор с собирательным образом чучела из темы про лисп совершенно неинтересен. Потому, что анонимус там не интеллектом давил оппонентов, а нундной тягомотиной уровня студента-недоучки.

Лично я тебе доказывать ничего не собираюсь, у меня естъ свои причины интересоваться лиспом и твоё особенное мнение по какому угодну вопросу связанному с программированием и ситуацией на рынке труда мне не интересно. ;)

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

> нельзя доказывать отрицание. Пусть сами докажут, что лисп нужен.

Что Лисп нужен было доказано несколько раз, а вы все 24 страницы занимались доказательством отрицания, чего по вашему же утверждению делать нельзя.

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

>Что Лисп нужен было доказано несколько раз,

ну ладно, пусть нужен, только кому он нужен? никому. никто почти не использует и спроса нет.

anonymous
()

в стандартном комбинаторе методов call-next-method вызывает следующий более специализированный метод

Love5an
()
Ответ на: комментарий от naryl

>> нельзя доказывать отрицание. Пусть сами докажут, что лисп нужен.

Что Лисп нужен было доказано несколько раз, а вы все 24 страницы занимались доказательством отрицания, чего по вашему же утверждению делать нельзя.


Ошибаешься, я занимался всего лишь опровержением ваших доказательств.

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

а кому лисп-то нужен? по результатам последнего срача - никому. только пара человек, отметившихся в треде, получила что-то с написания кода на лиспе. предложение есть( куча людей из того треда что-то пишет на лиспе фор фан), а спроса нет - лисп не нужен.

Фор фан - это движущая сила прогресса. Какое изобретение не возьми, всё двигалось исключительно личной интеллектуальной заинтересованностью учёных. Даже создание советской ядерной бомбы зиждется чисто на фане, а не на терроре её куратора: расстрелять любой дурак может, а вот создать Бомбу - нет. Поэтому, отрицая научно-рационализаторскую значимость фана, ты автоматически причисляешь себя к той части населения планеты, которую, по идее, нужно расстрелять, ибо только зря ресурсы угнетают. Вместо тебя, возможно, мог бы родиться талантливый человек.

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

>отрицая научно-рационализаторскую значимость фана

Дело не в фане, а в текущей полезности для текущего общества. Не уводи в сторону.

Кто-то может получать фан от того, что гадит в лифтах.

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

>нет

да, с чего ты в каждом топике всем на лиспе писать советуешь?

да ты еще и ханжа и лицемер

мат не к месту - свидетельство ограниченности, когда некто имеет очень ограниченные возможности выражения своих мыслей.

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

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

мат не к месту - свидетельство ограниченности, когда некто имеет очень ограниченные возможности выражения своих мыслей.

Это тебе кто сказал? Ему тоже передай, что он ханжа и лицемер.

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

> Ошибаешься, я занимался всего лишь опровержением ваших доказательств.

Ты, юзер по имени anonymous, занимался много чем.

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

>Потому что было бы совсем ништяк, если бы люди не страдали хуйней на разных недоязыках, не изобретали бы велосипеды, а писали бы на лиспе.
Конкретезирую немного свою т.з.:
Любая технология в программостроении несет в себе очень многое от того(или тех) языка программирования, на котором она написана, или, тем более, для которого она предназначена. И если язык - убогое говно, то технологии и продукты, на этом языке реализованные, тоже, как правило, представляют собой убогое говно. За примерами далеко ходить не надо, они повсюду - современные операционные системы, например.
Раньше обилие говна, и ограниченность применения хороших языков, вроде smalltalk, диалектов лиспа или каких-либо функциональных языков, оправдывалось исключительно убогостью компьютерного железа, но теперь, когда эта проблема стоит не так остро(по причине развития как оного железа, так и компиляторов и рантаймов), люди все-равно пишут на разнообразном говне разных степеней убогости, а это грустно.

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

>было бы совсем ништяк

бездоказательно.

на разных недоязыках

это вообще не верно, лисп по своей природе подразумевает проблемноориентированный подход.

не изобретали бы велосипеды, а писали бы на лиспе.

И это тоже не верно, в подавляющем большинстве областей свои инструменты, с максимально быстрым получением адекватного ожиданиям заказчика результата, низким порогом вхождения, и наличием большого количества работников. Эти инструменты нужны, они снижают стоимость и уменьшают риски. Соответственно они, в отличии от лиспа, и востребованы на рынке.

На лицо все плюсы конвейера, замену этого на лисп надо еще обосновать. Так что лисп как удел элиты с учёной степенью, связями и двадцатилетнем стажем, которая работает на себя за большие деньги, решает очень сложные задачи и не делиться результатом - выглядит куда как правдоподобнее.

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

>но теперь, когда эта проблема стоит не так остро(по причине развития как оного железа, так и компиляторов и рантаймов), люди все-равно пишут на разнообразном говне разных степеней убогости, а это грустно.

может пишут под уровень среднего пользователя продукта, а если ему не нужно лучше, то зачем? ограничения и ошибки в использовании от «человеческого фактора» влияют больше, чем от убогости технологии.

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

> На лицо все плюсы конвейера, замену этого на лисп

надо еще обосновать.


А зачем, собственно, всё заменять? Я не знаю, стал бы мир внезапно лучше, если бы всё внезапно переписали на CL, скорей всего нет. Дело ведь не в этом. Мне нравиться писать на CL, и я думаю, что для многих (но далеко не для всех) этот язык тоже бы очень подошёл, так почему о нём нельзя рассказывать? Почему нельзя рассказывать о чём то интересном? И почему я должен проявлять склонность к конформизму? Можно отдельно рассуждать о Common Lisp как о технологии, и совершенно ортогонально о его текущей роли в современно IT. Если для вас программирование не только способ получать зарплату, то первое будем вам не менее интересно, чем второе. А если вам действительно понравился Common Lisp, то вы будете стремиться получать за него зарплату. Я, например, становлюсь значительно более производительным когда пишу на CL. Если CL не нужен, то и я не нужен? Но это как бы не соответствует моим наблюдениям и пожеланиям моего заказчика. Т.е. я просто не пойму, в чем заключается ваша позиция.

Кстати, часто советуют прочитать SICP для «прочистки мозгов», да, отличная книга, но я вот также советую для тех же целей прочитать «Профессиональное программирование на PHP» (http://www.ozon.ru/context/detail/id/2527057/) - здорово «прочищает мозг» в обратном направлении (действительно, отличная книга).

archimag ★★★
()

TirNaNOg, изучай лисп тише ))) А то опять тема на 20+ страниц срача будет.

А по теме в PCL все написано, а если заглянешь в последнюю главу там есть ссылка на книгу по КЛОСУ. А вообще когда не понятно бкри REPL и пробуй с разными make-instance. Например вот это:

 (defclass base1 () ())

(defclass sub1 (base1) ())

(defclass base2 () ())

(defclass sub2 (base2) ())

(defgeneric test (c1 c2))

(defmethod test ((c1 base1) (c2 base2))
  (format t "In base1 base2~%")
  (call-next-method))

(defmethod test ((c1 sub1) (c2 base2))
  (format t "In sub1 base2~%")
  (call-next-method))

(defmethod test ((c1 base1) (c2 sub2))
  (format t "In base1 sub2~%")
  (call-next-method))

(defmethod test ((c1 sub1) (c2 sub2))
  (format t "In sub1 sub2~%")
  (call-next-method))

(defmethod test ((c1 base1) c2)
  (format t "In base1 any~%")
  (call-next-method))

(defmethod test (c1 (c2 base2))
  (format t "In any base2~%")
  (call-next-method))

(defmethod test (c1 (c2 sub2))
  (format t "In any sub2~%")
  (call-next-method))

(defmethod test ((c1 sub1) c2)
  (format t "In sub1 any~%")
  (call-next-method))

(defmethod test (c1 c2)
  (format t "in any any ~%"))

(defparameter b1 (make-instance 'base1))

(defparameter b2 (make-instance 'base2))

(defparameter s1 (make-instance 'sub1))

(defparameter s2 (make-instance 'sub2))

(defmethod test ((c1 sub1) (c2 (eql s2)))
  (format t "in sub1 eql~%")
  (call-next-method))

(defmethod test ((c1 (eql s1)) (c2 (eql s2)))
  (format t "in eql eql~%")
  (call-next-method))

(defmethod test ((c1 (eql s1)) (c2 sub2))
  (format t "in eql sub2~%")
  (call-next-method))

Пользуйся фичей лиспа - возможностью экспериментировать!

cathode
()
Ответ на: комментарий от archimag

archimag +1000

Только сделай поправку на местный тролл-мод в контексте этого: «Если CL не нужен, то и я не нужен? Но это как бы не соответствует моим наблюдениям и пожеланиям моего заказчика»

здорово «прочищает мозг» в обратном направлении (действительно, отличная книга).

После прочтения книги купленной наугад в книжном - да, а вообще готов поспорить.

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

> а кому лисп-то нужен? по результатам последнего срача - никому.

Как это не нужен? А троллям с ЛОРа, чтоб крутизну свою адскую другим таким же троллям демонстрировать?

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

> у меня естъ свои причины интересоваться лиспом и твоё особенное мнение по какому угодну вопросу связанному с программированием и ситуацией на рынке труда мне не интересно.

Опа, типичный сектант.

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

> Кто-то может получать фан от того, что гадит в лифтах.

От этого пользы намного больше, чем от лиспа. Это рабочие места для уборщиц, это повод выпустить пар для озлобленного населения - пусть лучше обыватель ненавидит соседа, нагадившего в лифте, чем направит свой гнев на Власть. А от лиспа пользы для общества абсолютно никакой. Можно было бы предположить, что он способствует самоизоляции ботанов и им подобных генетически ущербных, однако, они и без всякого лиспа себе другие «for fun» находят, столь же эффективно отторгающие их от окружающей среды. Так что ботаны сами не размножаются, и их количество сохраняется на постоянном уровне, вполне статистически предсказуемом.

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

> Давайте сратся про фортран. Кому он нужен если есть matlab :))

Используемые в matlab реализации BLAS и LAPACK написаны на Фортране. Так что мимо лужи.

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

Тебе надо не лоре срать а в МК идти работать.

А от лиспа пользы для общества абсолютно никакой.

Кто бы сомневался...

Можно было бы предположить, что он способствует самоизоляции ботанов и им подобных генетически ущербных, однако, они и без всякого лиспа себе другие «for fun» находят, столь же эффективно отторгающие их от окружающей среды.

Это ты про толкиенистов или про фанатов стратрека сказал?

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

По статистике Бозе или по Эйлеру???

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

>> Используемые в matlab реализации BLAS и LAPACK написаны на Фортране. Так что мимо лужи.

А мы не про то, на чем ОНО написано, мы как-бэ про бэдлоязычок матлаба говорим, ага... И если уж об этом говорить, то LAS и LAPACK у них написан на C, как ни странно.

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

> Это ты про толкиенистов или про фанатов стратрека сказал?

И они в том числе. Ну и вообще любые ботаны-очкарики, надрачивающие на желечячки да пробирочки.

По статистике Бозе или по Эйлеру???

Ботаны, очевидно, подчиняются статистике Бозе-Эйнштейна, так как легко все могут находиться на одном квантовом уровне.

Но я не об этой статистике. Я о том, что ботаны рождаются в результате генетических нарушений (у здоровых родителей, потому как сами практически не размножаются). Вероятность этих отклонений известна. Она и определяет количество ботанов.

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

Ботаны, очевидно, подчиняются статистике Бозе-Эйнштейна

Вероятность этих отклонений известна. Она и определяет количество ботанов.


Ты - типичный ботан!

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

> Это ты про толкиенистов или про фанатов стратрека сказал?

Не знаю насчёт вторых, но первые прекрасно плодятся и размножаются. Их количество уже достигло критического уровня, необходимого для самостоятельного существования без привлечения новых людей со стороны.

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

> Не знаю насчёт вторых, но первые прекрасно плодятся и размножаются.

Да ты что? Они ещё в середине 90х закончились.

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

Опа, типичный сектант.

Конечно-конечно. :)

TirNaNOg
() автор топика

Товарищи лисповцы, вы-бы продвинули язык в массы. Написали-бы хорошую, актуальную книгу или цикл статей, на русском. Как программировать на этом языке GUI/3D графику к примеру? Без хорошей литературы на великом и могучем, воз всегда будет там где сейчас. Наслышан об этом языке только с лучшей стороны, но читать древние манускрипты это долго и не интересно.

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

> Написали-бы хорошую, актуальную книгу или цикл статей, на русском.

Тю. Русский язык нужен ещё меньше чем даже лисп. То есть, совсем не нужен и ещё даже вреден. Программист должен читать англоязычные источники, все остальные на 5-10 лет всегда отстают.

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

>Товарищи лисповцы, вы-бы продвинули язык в массы. Написали-бы хорошую, актуальную книгу или цикл статей, на русском. Как программировать на этом языке GUI/3D графику к примеру?

Дельное предложение. В общем-то, это все будет, видимо.

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

> Написали-бы хорошую, актуальную книгу или цикл статей, на русском.

Товарищи сделали перевод (осталась вычитка, которая немного затягивается) современной книги Practical Common Lisp, смотреть можно например здесь: http://lisper.ru/pcl/. Так же, сейчас есть подборка статей: http://lisper.ru/articles/ - статей пока очень мало, но со временем надеюсь будет больше, замечу, что статьи в стиле «удивительный и прекрасный» туда не добавляются (такая должна быть только одна), только - практически полезный материал. Плюс, http://lisper.ru/planet/ - агрегатор сообщений из блогов на русском о Common Lisp.

Как программировать на этом языке GUI/3D графику к примеру?


Суть та же, что и для C++ :) См. например cl-gtk2 и cl-opengl

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

Как программировать на этом языке GUI/3D графику к примеру?

Суть та же, что и для C++ :) См. например cl-gtk2 и cl-opengl

или вот еще как бывает: GOAL

korvin_ ★★★★★
()

А какой компиль посоветуете? Пока остановился на SBCL, как полноценном компиляторе в бинарный код.

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