Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Заблокирован

Есть ли в LISP методы?

24.02.2017, 14:11. Показов 2097. Ответов 35

Студворк — интернет-сервис помощи студентам
Здравствуйте уважаемые участники.

Разбираюсь сейчас с объектной системой лиспа, и возник такой вопрос.

Правильно ли я понимаю, что несмотря на то, что в лиспе есть определение "defmethod", на самом деле в качестве этого "метода" реально просто вызывается функция, и никаких сообщений там реально нет?

Могу ли я реализовать какой-то перехватчик, как например

Code
1
2
3
4
5
test = function(argument){print(argument)}// обычная функция
myObject.undefinedMethod(test(100)) // вызов несуществующего метода, в качестве аргумента подаем вызов функции, печатающей свой аргумент. В myObject определен перехватчик типа "no such method", который просто выводит строку "no such method"
 
// в итоге получаем
>> no such method // побочный эффект функции test не выполнился
?

Добавлено через 10 минут
UPD нашел вот такую вот реализацию,
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
; Default method-missing
(defmethod method-missing (m (self t) &rest args)
    (format t "~s not found, no replacement method provided!~%" (cons m (cons self args)))
    ; Should throw an exception ...
    nil
)
; Override global no-applicable-method handler
(defmethod no-applicable-method (m &rest args)
    (format t "~s not found, calling method-missing!~%" (cons m args))
    (apply #'method-missing (cons m args))
)
; Now it's possible to make limited dynamic proxies
(defclass dynamic-proxy () ((obj :accessor obj :initarg :obj)))
(defun make-dynamic-proxy (obj) (make-instance 'dynamic-proxy :obj obj))
(defmethod set-obj ((self dynamic-proxy) new-obj) (setf (slot-value self 'obj) new-obj))
 
(defmethod method-missing (m (self dynamic-proxy) &rest args)
    (apply m (cons (obj self) args))
)
Но пишут, что она не совместима со множественной диспетчеризацией. Есть ли еще варианты, которые не конфликтуют с объектной системой?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.02.2017, 14:11
Ответы с готовыми решениями:

Какие числовые предикаты есть в lisp'e?
есть ли в лиспе еще какие нибудь числовые предикаты, кроме zerop, plusp, minusp?

Есть кто знающий LISP в CADе 2008?
Может есть здесь кто-то, кто может в с помощью LISP упростить работу конструкторов в AutoCAD 2008? А может нет здесь таких??? ...

Clojure Сильно ли различаются диалекты lisp? Есть ли смысл учить Elisp?
Здравствуйте, уважаемые лисперы. Захотел выучить лисп, дабы познать сатори программирования. Скачал Emacs+slime, возрадовался, изучил...

35
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38210 / 21143 / 4313
Регистрация: 12.02.2012
Сообщений: 34,757
Записей в блоге: 14
25.02.2017, 18:42
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от actionpattern Посмотреть сообщение
Советую вам идти списки обрабатывать, это у Вас лучше получается
- да, у меня это неплохо получается (не то, что у вас). А, как я понял, с моим выводом по Common Lisp вы согласились? Отрадно.
Дискуссию можно завершить.
0
Заблокирован
25.02.2017, 18:47  [ТС]
Цитата Сообщение от Catstail Посмотреть сообщение
и где в Лиспе проявляется "static thinking"?
Например в замене фекспров и динамического связывания на макросы и (дефолтное)лексическое связывание

Добавлено через 2 минуты
Цитата Сообщение от Catstail Посмотреть сообщение
с моим выводом по Common Lisp
Я что-то не видел никакого вывода. Там были какие-то голословные утверждения про жаваскрипт и общелисп, которые никто даже не понял, что там, к чему. Вернемся, однако к ООП.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38210 / 21143 / 4313
Регистрация: 12.02.2012
Сообщений: 34,757
Записей в блоге: 14
25.02.2017, 18:57
Цитата Сообщение от actionpattern Посмотреть сообщение
Как нибудь может реализую
- будет очень интересно взглянуть. Надо же и код пописать, а не только "бла-бла-бла".

Цитата Сообщение от actionpattern Посмотреть сообщение
ваш метациклический интерпретатор -- никчемная игрушка для лохов, можете его в одну строку реализовать
- это вы так Лисп на Лиспе представляете?.. Вынужден вас разочаровать - eval нужно не использовать, а реализовать самому (используя 8-9 базовых функций Лиспа).

Да, вспомнил еще один занятный синтаксический тест - написать программу, печатающую собственный исходный текст (т.н. программу-куайн). На Лиспе это выглядит так:

Lisp
1
((LAMBDA (x) (LIST x (LIST (QUOTE QUOTE) x))) (QUOTE (LAMBDA (x) (LIST x (LIST (QUOTE QUOTE) x)))))
Интересно было бы взглянуть на Io-куайн.
0
Заблокирован
25.02.2017, 18:58  [ТС]
Цитата Сообщение от Catstail Посмотреть сообщение
Сравнивать нужно по "всем фичам" в совокупности. И если так сравнить к примеру Io и Javascript,
Да, доперло, о чем это. Типичный диагноз.
не сваливать в кучу разные полезные конструкции и средства, а напротив — удалить слабости и ограничения, вызывающие необходимость добавления в язык новых возможностей
Это когда то пытались приколотить гвоздями к лиспу, не вышло. А де-факто это как раз про Io
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38210 / 21143 / 4313
Регистрация: 12.02.2012
Сообщений: 34,757
Записей в блоге: 14
25.02.2017, 19:00
Цитата Сообщение от actionpattern Посмотреть сообщение
Например в замене фекспров и динамического связывания на макросы и (дефолтное) лексическое связывание
- "замена динамического связывания на макросы" - что имеется в виду? Пример можно?
0
Заблокирован
25.02.2017, 19:03  [ТС]
Цитата Сообщение от Catstail Посмотреть сообщение
Надо же и код пописать,
Вот и научитесь писать что-нибудь сложней факториалов, потом будет о чем поговорить. Другие участники дискус
сии хоть знают о чем говорят.
Цитата Сообщение от Catstail Посмотреть сообщение
Интересно было бы взглянуть на Io-куайн.
Послушайте, уважаемый, Вы ошиблись адресом. Курсы программирования для детей в другом месте, тут взрослые дяди разговаривают, уймитесь пожалуйста, не засоряйте тред. Или, хотя бы оборачивайте свои откровения в тег OFF
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38210 / 21143 / 4313
Регистрация: 12.02.2012
Сообщений: 34,757
Записей в блоге: 14
25.02.2017, 19:09
Цитата Сообщение от actionpattern Посмотреть сообщение
Да, доперло, о чем это.
- вот и славно. Лучше поздно, чем никогда.
Цитата Сообщение от actionpattern Посмотреть сообщение
Это когда то пытались приколотить гвоздями к лиспу, не вышло.
- голословное утверждение...

Я мог бы продолжить (о силе Лиспа). Есть такой занятный (и, уж извините, более распространенный, чем Io) язык. Называется - Пролог. Реализация простого интерпретатора Пролога на Лиспе - те же 150-200 строк. А на Io?

Кстати, мои "нападки" на Io вынуждены. Мне Io даже нравится (поверхностное знакомство по книге "7 языков за 7 недель". Но утверждать, что только Io - язык, а все остальные - обман, это, мягко говоря, преувеличение.

Добавлено через 1 минуту
Цитата Сообщение от actionpattern Посмотреть сообщение
Послушайте, уважаемый, Вы ошиблись адресом. Курсы программирования для детей в другом месте, тут взрослые дяди разговаривают, уймитесь пожалуйста, не засоряйте тред. Или, хотя бы оборачивайте свои откровения в тег OFF
- это называется "я этого не умею". Вот так и надо говорить. Взрослый дядя - а простейший код написать не можешь... Стыдно должно быть.
0
Заблокирован
25.02.2017, 19:18  [ТС]
Цитата Сообщение от Catstail Посмотреть сообщение
Реализация простого интерпретатора Пролога на Лиспе - те же 150-200 строк. А на Io?
Я толком не знаю, как пролог работает, поэтому я не знаю, сколько там будет строк. В принципе, за исключением мелких сниппетов, сахара и готовых макроподстановок, любой язык сольет Io на сколько-нибудь сложном коде, включая лисп. А есть вещи, которые лисп вообще не может, этот тред -- лишнее тому подтверждение.

Добавлено через 4 минуты
Цитата Сообщение от Catstail Посмотреть сообщение
- это называется "я этого не умею". Вот так и надо говорить. Взрослый дядя - а простейший код написать не можешь... Стыдно должно быть.
Code
1
thisMessage print
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38210 / 21143 / 4313
Регистрация: 12.02.2012
Сообщений: 34,757
Записей в блоге: 14
25.02.2017, 19:22
Для любых двух языков А и Б можно найти вещь, которую "может" один и "не может" А точнее (применительно к теме) - можно найти вещь, которая в одном языке реализуется изящно, а в другом - не очень. Если вы хотели доказать это - то не стоит ломиться в открытую дверь.

А о мощи языков (в целом) нужно судить по конкретным примерам. Жду куайн на Io.

Да, и неплохо бы внести ясность в вопрос: что означает "замена динамического связывания на макросы".

Добавлено через 1 минуту
Цитата Сообщение от actionpattern Посмотреть сообщение
thisMessage print
- и будет напечатано "thisMessage print"?
0
Заблокирован
25.02.2017, 19:33  [ТС]
Цитата Сообщение от Catstail Посмотреть сообщение
- и будет напечатано "thisMessage print"?
да. Еще текст чтобы тупой форумный движок соизволил пропустить

Добавлено через 42 секунды
Цитата Сообщение от Catstail Посмотреть сообщение
Да, и неплохо бы внести ясность в вопрос: что означает "замена динамического связывания на макросы".
Я сказал фекспров на макросы.

изучайте основы. Тут не ликбез

Добавлено через 3 минуты
Цитата Сообщение от Catstail Посмотреть сообщение
Для любых двух языков А и Б можно найти вещь, которую "может" один и "не может" А точнее (применительно к теме) - можно найти вещь, которая в одном языке реализуется изящно, а в другом - не очень
Это касается только мелких сниппетов, которыми так гордятся хаскелисты и им подобные

Добавлено через 3 минуты
Цитата Сообщение от actionpattern Посмотреть сообщение
Это касается только мелких сниппетов, которыми так гордятся хаскелисты и им подобные
Да и то, "изящество" путем подключения тонн библиотек и кучи сахара -- весьма сомнительное изящество
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38210 / 21143 / 4313
Регистрация: 12.02.2012
Сообщений: 34,757
Записей в блоге: 14
25.02.2017, 19:48
Куайн хорош, но такие трюки куайном не считаются. Эдак и в бэйсике (старом) куайн пишется так
Visual Basic
1
10 list
. Впрочем, моя вина (я не оговорил условие).

А вот "замена динамического связывания на макросы" - это "в огороде бузина, а в Киеве дядя". Как я понимаю, очередная декларация, которых уже много было. Будем считать, что вы сказать по этому поводу ничего не можете.

Добавлено через 51 секунду
Цитата Сообщение от actionpattern Посмотреть сообщение
"изящество" путем подключения тонн библиотек
- это я не считаю изяществом.

Добавлено через 2 минуты
Цитата Сообщение от actionpattern Посмотреть сообщение
Я сказал фекспров на макросы
- вы сказали "фекспров и динамического связывания на макросы". Замена fexpr на макросы - очевидна и правильна. Вопросов у меня не возникло. А вот "динамическое связывание на макросы" - это вообще что?
0
 Аватар для nullxdth
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
25.02.2017, 23:12
Цитата Сообщение от actionpattern Посмотреть сообщение
Лисп задекларировал фичу, у меня, дескать, у лишпика, есть метаобъектный протокол.
Ты не торопись. Полегче Ты ещё пару дней назад не понимал conses в Lisp, а сейчас уже хочешь про MOP разговаривать. Пока ещё очень рано.

Добавлено через 14 минут
Цитата Сообщение от actionpattern Посмотреть сообщение
Мы же не о мелочевке, а о Великом и Могучем, lol. К чему эти сравнения
Так ты ведь не об обработки вызовов отсутствующих методов говоришь, а об evaluation strategy: eager vs lazy. Ты почему-то всё в одну кучу смешал и ко всему подряд предъявляешь претензии.
Скажем, в Ruby, касательно "no such method":
Ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Foo
  def method_missing(name, *args)
    puts "! #{name}(#{args.join(', ')})."
  end
end
 
def test(n)
  puts "Invoke test."
  n
end
 
Foo.new().foo test(100)
 
 
# Invoke test.
# ! foo(100).
Функция test будет вычислена, ибо Ruby как и Common Lisp - eager, так сказать.
На CL подобная функциональность выглядит похоже:
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
(defclass foo ()
  ())
 
 
(defgeneric foo (x &rest args))
 
 
(defmethod no-applicable-method :around (name &rest args)
  (format t "~&! ~A~%" (cons name args)))
 
 
(defun test (n)
  (format t "~&Invoke test.~%")
  n)
 
(foo (make-instance 'foo) (test 100))
 
;; Invoke test.
;; ! (#<STANDARD-GENERIC-FUNCTION COMMON-LISP-USER::FOO (0)> #<FOO {100323AEE3}>
;;    100)
Разница конечно кое-какая есть, но ты пока с этим разберись что-ли.
0
Заблокирован
26.02.2017, 00:32  [ТС]
Цитата Сообщение от nullxdth Посмотреть сообщение
а об evaluation strategy: eager vs lazy. Ты почему-то всё в одну кучу смешал и ко всему подряд предъявляешь претензии.
Это, на самом деле, взаимосвязанные вещи. ИМХО, если объект получает сообщение, никто не должен наперед батьки там ничего вычислять, иначе это не сообщение.
Цитата Сообщение от nullxdth Посмотреть сообщение
Ruby
Я, кстати говоря, про руби был лучшего мнения. Сегодня читал, что в руби к тому же и классы нельзя менять когда экземпляры уже созданны. Может и напрасно про руби говорят, что он смоллток-лайк.

Добавлено через 58 минут
Цитата Сообщение от nullxdth Посмотреть сообщение
puts "! #{name}(#{args.join(', ')})."
У тебя, кстати, возможно, вычисляется из-за этих вот конструкций #{name}, попробуй без них
0
 Аватар для nullxdth
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
26.02.2017, 14:13
Цитата Сообщение от actionpattern Посмотреть сообщение
Это, на самом деле, взаимосвязанные вещи. ИМХО, если объект получает сообщение, никто не должен наперед батьки там ничего вычислять, иначе это не сообщение.
Нет, совершенно не связанные. Если рассуждать в терминах отправки сообщений, то если объект не обрабатывает сообщение x, то ему отправляется сообщение method_missing со всеми данными для сообщения x, включая информацию о самом x. И, если мы говорим, о eager strategy, то все аргументы для x предварительно вычисляются перед отправкой method_missing. Никаких противоречий.

Добавлено через 1 минуту
Цитата Сообщение от actionpattern Посмотреть сообщение
У тебя, кстати, возможно, вычисляется из-за этих вот конструкций #{name}, попробуй без них
name и args в контексте method_missing уже вычислены. Это очевидно. Если тебе не очевидно - попробуй сам.
1
 Аватар для _JohnSmith
117 / 53 / 2
Регистрация: 12.02.2017
Сообщений: 194
27.02.2017, 00:28
Message passing must have??? Fill the power of Racket.
0
27.02.2017, 19:29

Не по теме:

С удовольствием читаю тред (и предыдущий, про диспетчеризацию,тоже доставил много удовольствия). actionpattern, я тебе даже завидую - так упороться может не каждый... и не каждому дано так на лету переобуваться и делать вид что так и задумано. Кстати, может пропустил, но где эти 4 строки на io которые делают мультидиспетчерезацию?
nullxdth, респект за качественные ответы. Даже не ожидал что можно так спокойно отвечать на откровенный тролинг и тупость
Catstail, зачет как модератору. Столько бреда прочесть и не забанить сразу - надо мощные нервы иметь. И кстати, аналогия с десятиклассником помнящим производителей материнских карт очень понравилась.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.02.2017, 19:29

Книги или другой источник, где описана история версий Lisp и Common Lisp
Доброго времени суток.Такой вопрос,знаете какой-нибудь источник,где описана история версий Lisp и Common Lisp.Только не всякие...

Организация циклов в Lisp (bee lisp demo)
разбираюсь с простыми задачами, эти пока не знаю, как решать... помогите пожалуйста. 1. Слова в предложении разделены пробелами....

Какие методы есть у объекта ActiveForm ?
Мне сказали что с помощью ActiveForm.rtfText.SelRTF можно получить выделенный текст, но Visual Basic ругается на эту строку. Какие...

Какие есть основные методы оптимизации?
Какие есть основные методы оптимизации?

Какие есть методы в классе System.Console?
WriteLine(String, Object) WriteLine(String, Object) WriteLine(UInt64) WriteLine(UInt32) Это методы? Или я ошибаюсь?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
SUNO Ai - Река Без Дна
zorxor 31.07.2026
Автор стихотворения - астрофизик Марина Катыс Ссылка на сгенерированную музыкальную композицию: https:/ / suno. com/ song/ 6f6e5464-b290-4650-be6c-44c85f8d8013 Я говорю, что Время- как вода течет. . .
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Салют, шампанское, овации! :drink:
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru