Заблокирован

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

24.02.2017, 14:11. Показов 2130. Ответов 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
38223 / 21155 / 4314
Регистрация: 12.02.2012
Сообщений: 34,766
Записей в блоге: 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
38223 / 21155 / 4314
Регистрация: 12.02.2012
Сообщений: 34,766
Записей в блоге: 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
38223 / 21155 / 4314
Регистрация: 12.02.2012
Сообщений: 34,766
Записей в блоге: 14
25.02.2017, 19:00
Цитата Сообщение от actionpattern Посмотреть сообщение
Например в замене фекспров и динамического связывания на макросы и (дефолтное) лексическое связывание
- "замена динамического связывания на макросы" - что имеется в виду? Пример можно?
0
Заблокирован
25.02.2017, 19:03  [ТС]
Цитата Сообщение от Catstail Посмотреть сообщение
Надо же и код пописать,
Вот и научитесь писать что-нибудь сложней факториалов, потом будет о чем поговорить. Другие участники дискус
сии хоть знают о чем говорят.
Цитата Сообщение от Catstail Посмотреть сообщение
Интересно было бы взглянуть на Io-куайн.
Послушайте, уважаемый, Вы ошиблись адресом. Курсы программирования для детей в другом месте, тут взрослые дяди разговаривают, уймитесь пожалуйста, не засоряйте тред. Или, хотя бы оборачивайте свои откровения в тег OFF
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38223 / 21155 / 4314
Регистрация: 12.02.2012
Сообщений: 34,766
Записей в блоге: 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
38223 / 21155 / 4314
Регистрация: 12.02.2012
Сообщений: 34,766
Записей в блоге: 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
38223 / 21155 / 4314
Регистрация: 12.02.2012
Сообщений: 34,766
Записей в блоге: 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru