LINUX.ORG.RU

В смоллтоке нет классов

 , ,


0

2

Как-то раз, услышав про то, что в смолтоке есть классы, я подумал, что автор языка выбрал ошибочное направление. Где то в википедии, я читал, что селф перенял у смолтока идеи объектов, но выкинул классы, и я подумал, что тру — это селф, а смолток ушел с праведного пути. Однако я ошибался. Оказывается в смолтоке не было никаких классов, то, что там называлось классами, по-факту есть прототипы. То есть в смолтоке не было классов. Вообще. Это просто терминологическое недоразумение.

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

«То, что мы рассмотрели, не отвечает на главный вопрос: как объект, получивший сообщение, находит метод, который надо выполнить? Остановимся подробно на механизмах поиска по сообщению необходимого метода и его выполнения. Итак, как уже отмечалось, выполнение любого действия в системе Смолток осуществляется с помощью посылки объекту сообщения. Получив сообщение, получатель ищет метод с соответствующим сообщению шаблоном, начиная поиск обычно со своего класса. Если объект — класс, то метод ищется среди методов класса, а если объект — экземпляр класса, то среди методов экземпляра класса. Если метод с соответствующим шаблоном находится в классе получателя, то он выполняется, и как результат его выполнения обязательно возвращается некоторый объект, который информирует того, кто послал сообщение, что выполнение метода завершилось с содержащимся в возвращаемом объекте результатом. А если метода с нужным шаблоном нет в классе? Тогда к работе подключается иерархия классов, а точнее, цепочка суперклассов для класса объекта-получателя. Если в классе подходящего метода нет, метод ищется в ближайшем его суперклассе. Если нужного метода нет в суперклассе, то поиск продолжается в следующем по иерархии суперклассе и так далее, пока не доберемся до класса Object.»

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

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

или не согласен:)

Вся твоя суть в одной фразе — свалить ещё один тред к неконструктивному срачу.

Deleted
()

Таким образом, в JS реализована точная копия смолтока

Таким образом, в java, python и прочих реализована точная копия Simula.

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

Лол, если ты не понял намёка, поясню: говорить, что все языки с общим типом ООП идентичны - глупость.

anonymous
()

пока не доберемся до класса Object

...а если и в нём нужного метода не нашлось, объекту отправляется сообщение doesNotUnderstand:, которое по-умолчанию кидает исключение. Однако, можно это поведение переопределить - отсюда прямая дорога к почти бесплатным декораторам, прокси-объектам, и прочим клёвым штукам.

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

А Вы не в курсе, в чем принципиальная разница между смоллтоком и селфом? Я раньше думал что в классах, но оказывается в смоллтоке те же прототипы.

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

Таким образом, в JS реализована точная копия смолтока.

Еще раз ВЫДЫХАЙ !!!!

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

Не, пардон, ошибся наверное, щас просмотрел бегло вики, там вроде динамическая типизация и прототипы, все как в JS, фактически, это, похоже, копия JS, с другим синтаксисом. Я чет разницы вообще не увидел. Не знаю, мож метатаблицы отличаются от хешей, а так — один в один.

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

Писал в один из удалённых(к сожалению) твоих тредов, тут повторю запрос: какой набор литературы нужно прочесть, чтобы создавать такие топики? Есть что-то специфическое? Крайне, до боли в пальцах ног, интересно.

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

Да не, я обрывками все читаю. В принципе, можешь почитать Хьюитта, я хот сам читал обрывками и мало, ящетаю, дело мужик говорит. Также про старые лиспы (до схемы) бумаги. А так, книжек годных очень мало.

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

А, ну и Кей, конечно, но он мало писал, к сожалению.

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

А можешь сказать, в чем принципиальная разница? Я не говорю, что я знаток, могу ошибаться, вывод сделал из беглого просмотра Вики. Но по описанию семантики — один в один.

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

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

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

Разница не для всех принципиальна. Из примеров, которые я активно юзаю — метатаблицы позволяют в некоторой общепринятой мере симулировать нужные виды ооп, причем в языке есть поддержка синтакса (:). Не только тупой лукап по исе/прото, а полностью чтения/присвоения в поля объекта, ну и очевидные хрени в виде арифметики, вызовов() и интерфейсов к стандартным tostring(), [i]pairs(), etc. Окружения, про которые я тебе давно толковал, позволяют погрузить функцию в собственный набор глобалов, ака песочницу, которую также можно обернуть в мету и получить анализатор/атомизатор/whatever работы функции, нужно для реактивности и транзакций. Корутины, ну это любой школьник знает как генераторы / легкие треды, я юзаю для асинхронки, только не в уебищном стиле колбеков жоэса, а в виде линейного кода. Этого я в жсе так и не увидел, только набор костылей, больные на голову автокасты и мутный синтаксис. Может и есть в каких-то видах, но ощущения законченности и планируемых границ у него нет — он идет по пути веба, ну туда ему и дорога.

arturpub ★★
()

Вот такие наркоманы потом и пишут книги для таких же наркоманов, которые тоже потом пишут книги для наркоманов, которые... пажи йо**на, так это же зигогистоморфный препроморфизм с классовыми лексическими замыканиями на прототипах и анафорических лямбдах!

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

Ок, я понял. Ты до лиспа дошёл уже? Вангую что когда дойдёшь постигнешь настоящее дао и исчезнешь как истинный даосист достигший настоящего просветления. Мира и добра тебе, о мыслящий! И да прибудет с тобой сила!

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

В Селфе там типизация вроде какая-то, не? Стронгток и Селф прямее повлияли на Java и JS, насколько я помню.

По мне так Newspeak веселее, но ни во что из перечисленного я особо не погружался.

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

Разница не для всех принципиальна. Из примеров, которые я активно юзаю — метатаблицы позволяют в некоторой общепринятой мере симулировать нужные виды ооп, причем в языке есть поддержка синтакса (:). Не только тупой лукап по исе/прото, а полностью чтения/присвоения в поля объекта, ну и очевидные хрени в виде арифметики, вызовов() и интерфейсов к стандартным tostring(), pairs(), etc. Окружения, про которые я тебе давно толковал, позволяют погрузить функцию в собственный набор глобалов, ака песочницу, которую также можно обернуть в мету и получить анализатор/атомизатор/whatever работы функции, нужно для реактивности и транзакций.

Про корутины я не в курсе, а все остальное, по-моему есть в js. Асинхронность без колбеков, я где-то тут на лоре интересовался, тоже есть, правда я не вникал.

причем в языке есть поддержка синтакса (:)

Это что значит? Мне кажется, при желании, в JS можно реализовать любой синтаксис. Там просто не принято, но вообще можно назвать переменную «foo bar baz»=1, только при этом нельзя вызов свойства через точку, а если будешь вызывать global[«foo bar baz»], у тебя реально будет переменная глобальная с именем foo bar baz или «huy:ok?». Просто не заморачиваются.

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

познакомьте молодого человека с царем!

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

В Селфе там типизация вроде какая-то, не?

Я пока нашел только вот это

даже базовые объекты, которые в Smalltalk были зарезервированными словами (nil, false), тоже являются обычными слотами в корневом объекте и извлекаются посредством посылки сообщения; таким образом в языке Self осталось только одно зарезервированное слово (resend — делегирования вызова родительским объектам), в то время как в Smalltalk их было пять;

http://dic.academic.ru/dic.nsf/ruwiki/747715

Про типы в статье ни слова.

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

object:show(math.pi) == object.show(object, math.pi), как видишь никаких замыканий (они кстати нигде не дешевые).

Пример метаокружений и нитетредов на жсе в студию, чисто ради спортивного интереса. Я как не ищу, все какая-то ерунда выходит.

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

нитетредов

Не, этого наверное нет, JS, вроде, однопоточный.

метаокружений

Метаокружения — это first-class окружения? Если да, то объекты сойдут на эту роль.

object:show(math.pi) == object.show(object, math.pi)

Поясни в 2-х словах, что тут происходит?

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

Метаокружения — это first-class окружения? Если да, то объекты сойдут на эту роль.

Если присвоение в поле ловится, то сойдут.

object:show(math.pi) == object.show(object, math.pi)

Поясни в 2-х словах, что тут происходит?

Первое выражение переписывается как второе. <expr>:<name>(<args>) при парсинге преобразуется в do local self=<expr>; self.<name>(self, <args>), таким образом не требуется делать замыканий для методов, но вызывать их приходится через двоеточие, а не через точку.

t = { name = "World" }
t.hello = function (self)
    print(string.format("Hello, %s!", self.name))
end

t:hello() -- "Hello, World!"
t.hello(t) -- "Hello, World!"
t.hello() -- attempt to index nil value
arturpub ★★
()
Ответ на: комментарий от arturpub

Я мож че не понял, но если речь идет просто о привязке к неймспейсу объекта, то есть типо того:

t={name: "World"}
u={name: "Universe"}
t.hello=function(ob){
	if(ob) return console.log("Hello "+ob.name) 
	console.log("Hello "+this.name)
}.bind(t)

t.hello() // --  Hello World
t.hello(t)// --  Hello World
t.hello(u)// --  Hello Universe

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

Кстати, с чего ты взял, что замыкания недешевы? Для чисто интерпретируемых ЯП, они дороги, но таких сейчас нет, практически, а для компилируемых, это, наверное, самая оптимальная стратегия связывания.

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

И, кстати про манки-патчинг. В JS манки-патчингом принято называть как раз таки расширение нативных объектов, в некотором смысле, как раз таки классов. Вот в прошлом треде, я например возжелал метод byName. Чуть позже я его реализовал таки, вот таким вот незамысловатым образом

;({}).__proto__.byName=function(name){var i; if((i = "foo") in this) return i}

ob={foo: 1}
console.log(ob.byName("foo"))// foo
Я добавил этот метод в нативный объект, а это и есть манки-патчинг чистой воды, с точки зрения JS. Теперь этот метод имеют абсолютно все объекты, не нужно добавлять ничего никуда, пыжиться. Разве не прелесть? Я ЗА манки-патчинг.

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

Пардон, там в определении ф-ции «foo»/name

Хз, вот тупой пример

;({}).__proto__.byName=function(name){var i; if((i = name) in this) return i}

man={hands: 2, legs: 2}

man[man.byName("hands")+"AND"+man.byName("legs")]=man.legs+man.hands
console.log(man)//{ hands: 2, legs: 2, handsANDlegs: 4 }

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

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

Ооп головного мозга, простите за резкость.

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

arturpub ★★
()
Последнее исправление: arturpub (всего исправлений: 1)
Ответ на: комментарий от anonimous

Замыкание это рантайм-объект в единственном экземпляре. Если у класса 20 методов и 500 объектов, то это +10000 маллоков, не считая затрат на извлечение переменных из скопа и синхронный рефкаунтинг/гц. Дело вкуса, конечно.

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

рантайм-объект

Я не спец но люди пишут:

For a closure it is necessary to build and maintain a separate environment. In a system with lexical bindings, this has to be done at each function call, and for compiled code it is the most efficient strategy anyway, because it is done once by the compiler, and can then be accessed as stack frames at runtime.

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

Здесь могла быть простыня о засирании неймспейсов, подходах к построению систем из абстрактных изолированных модулей и пользе формализации интерфейсов, но ее нет, это же жоэс :)

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

У людей просто нет оптимизации пустого замыкания до статичной функции, но наверное им видней. Очевидно, что когда есть стейт, то он либо валяется полноценным объектом в динамической памяти, либо ограничен по использованию, и это не замыкание, а стековый трамплин, как в нестандартной сишке.

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