Подтвердить что ты не робот

Возможно ли продлить отдельный объект в Smalltalk

Я занимаюсь исследованиями в Smalltalk-рефлексии, и мне было интересно, возможно ли расширить такой индивидуальный объект, как это возможно, например, в Ruby. При этом я имею в виду селектор, на который реагируют только конкретные объекты.

Вот некоторый код Ruby, который указывает, что я имею в виду. Для пояснения: в Ruby это открывает виртуальный класс для этого объекта и расширяет его с помощью нового определения. Важнейшая роль здесь заключается в том, что ничто не меняется в определении класса!

o = Object.new
o.instance_eval {def foo;puts "foo";end}
o.foo #=> "foo"

#however this will fail:
m = Object.new
m.foo #=> NoMethod error

Более конкретно, мой вопрос заключается в том, возможно ли это в стандартных реализациях Squeak/Pharo или других небольших томов, без добавления существенных структур или кода, чтобы это разрешить. Итак, другими словами с регулярными отражающими функциями, которые существуют в Smalltalk.

В качестве примера можно добавить методы, удалить методы, скомпилировать новый код в класс, изменить переменные экземпляра и практически все, но я не нашел способ расширить один объект.

Test addInstVarNamed: #var.
Test compile: 'var ^var'.
t:= Test new.
Test instVarNames.
t instVarNamed: #var put: 666. 
t var. #=> 666

Если ответ отрицательный, тогда объясните, почему. Я не ищу решение этой проблемы, а понимаю, почему она не находится в малом объеме.

4b9b3361

Ответ 1

В Smalltalk нет встроенного способа поведения, специфичного для экземпляра. Smalltalk придерживается принципа, согласно которому каждый объект принадлежит классу, а его поведение и форма состояния зависят от класса. Вот почему вы можете легко изменить класс (добавить inst vars, скомпилировать новые методы и т.д.), Но это означает изменение поведения ко всем его экземплярам. Однако существуют различные подходы (в соответствии с вкусом Smalltalk) для достижения специфичного для конкретного экземпляра поведения, такого как легкие классы, в котором идея состоит в создании специального (легкого) класса для конкретного экземпляра и замены исходного класса на пользовательский один. В результате у вас есть специальный класс для каждого "специального" экземпляра. AFAIK в Digitalk St, диспетчерский механизм немного более гибкий и позволяет легко реализовать поведение на основе экземпляров (см. 4-ю ссылку). Я оставлю здесь некоторые ссылки, которые могут оказаться полезными:

НТН

Изменить: ссылка, размещенная Эрнаном ( "Отладка объектов" Хинкла, Джонса и Джонсона) - это тот, к которому я обращался, и который не смог найти.

Ответ 2

Наличие специфического поведения экземпляра в Smalltalk в основном связано с изменением класса указателя и примитивного вызова. "Отладка объектов" статьи Боба Хинкла, Вики Джонса и Ральфа Э. Джонсона, опубликованного в The Smalltalk Report, том 2 № 9, Июль-август 1993 года, содержит все объяснения.

Я портировал оригинальный код классов Lightweight из версии, выпущенной в 1995 году Бобом Хинклом для VisualWorks 2.0. Источник VisualWorks включает код, разделенный на три пакета с именем "ParameterizedCompiler" , "Точка останова" и "Легкий" . Причина этого разделения была вызвана желанием иметь раздельную и повторно используемую функциональность. Все они имеют отдельные статьи в журналах ООП.

My Порт Squeak/Pharo содержит "Экземпляр браузера" на основе OmniBrowser (и более документация здесь), которая позволяет просматривать и изменять экземпляры, добавляющие легкий вес поведение через классический интерфейс браузера Smalltalk. Он будет работать в последних версиях Squeak 4.x без особых усилий. К сожалению, инфраструктура Pharo существенно изменилась с версий <= 1.2, поэтому может потребоваться некоторая работа для работы с последними версиями.

Instances Browser with an instance modified

В VisualWorks из-за глубоких изменений в графическом интерфейсе VisualWorks от 2.0 до 7.3 большинство инструментов для управления легкими классами не были включены. Если кто-то заинтересован, я могу загрузить пакет для VW 7.3

Instances Browser in VisualWorks

Базовый script для тестирования функций легких классов:

| aDate |
aDate := Date today.
aDate becomeLightweight.
aDate dispatchingClass 
        compile: 'day ^42' 
      notifying: nil 
         ifFail: [self error].
aDate day inspect

Ответ 3

Squeak Etoys сильно использует специфическое для объекта поведение и состояние. Это реализовано как "одноклассники". Когда вы создаете script для объекта Etoys (экземпляр класса Player), тогда класс объекта будет изменен на "uniclass", то есть на уникальный подкласс Player, который может иметь свои собственные методы (соответствующие Etoys скрипты) и переменные экземпляра (соответствующие пользовательским переменным Etoys).

Другие проекты на основе Squeak используют "анонимные" однократные слова, которые не входят в число подклассов в своем суперклассе. Это означает, что они довольно невидимы, поскольку они не отображаются в системном браузере, например (тогда как одноадресные стили Etoys отображаются в браузере).

Ответ 4

A collectage работает над новым рефлексивным API для Pharo Smalltalk, который называется Bifrost. вы можете проверить страницу проект Bifrost.

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

Ответ 5

Как отмечает @ewernli, Bifrost в основном делает Smalltalk объектно-ориентированной системой отражения. Все отражающие изменения нацелены сначала на объекты, а не на гибридный механизм с классами. Вы все равно можете делать все традиционные отражения класса, но поверх объектно-ориентированного отражения. То, что я считаю актуальным для этого нового подхода, - это ряд приложений, которые мы обнаружили, что улучшает то, как мы развивали и воспринимали живую систему:

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

Talents являются составными динамическими единицами повторного использования, такими как черты, но для объектов. Есть еще много приложений.

Ответ 6

В Ruby, насколько мне известно, словарь метода прикрепляется к объекту.

В Smalltalk словарь метода привязан к объекту Class, поэтому в изображении с изображением ванильного изображения Smalltalk вы не можете писать подобные вещи, похожие на eigenclass.

Сказав это, есть несколько библиотек прототипов: ответы на этот вопрос упоминают немало.