2017-01-30 2 views
1

Я практиковал на языке Io. Найти источники так сложно. Как вы знаете, на языке Io нет класса. Но мы можем создавать наши классы с нашими потребностями. Во всяком случае, допустим, я хочу, чтобы это можно было запустить и создать класс Animal.Создание конструктора, добавление атрибутов и методов в язык Io

Animal := Class new("Animal", 
    withConstructor(nameParam, 
     name = nameParam 
    ) 
    withInstanceAttribute("name", "") 
    withInstanceAttribute("foodItemsEaten", 0) 
    withStaticAttribute("allFoodItemsEaten", 0) 
    withMethod("feed", howMuchFood, 
     foodItemsEaten = foodItemsEaten + howMuchFood 
     class allFoodItemsEaten = allFoodItemsEaten + howMuchFood 
     "#{name} has just eaten #{howMuchFood} food items." interpolate println 
    ) 
    withMethod("feedSummary", 
     "So far #{foodItemsEaten} food items eaten by #{name} and #{class allFoodItemsEaten} in total by all dogs." interpolate println 
    ) 
) 

Так у меня есть эта структура классов:

Class := Object clone 

Class new := method(name,     // Meta-class constructor 
    cls := Class clone 
    cls __name := name     // Name of the class 
    cls __instanceProto := Object clone // Prototype of instances - hold instance field along with their initial values 
    cls __instanceProto class := cls 

    call argAt(1) doInContext(cls) 
    cls 
) 

Я пытаюсь добавить метод withConstructor, например, но я не могу даже прочитать параметры.

Class withConstructor := method(nameParam 
    self 
) 

Я просто не мог справиться с этим, даже конструктором. В нем говорится: «Класс не отвечает nameParam». Синтаксис прост, но, я думаю, я до сих пор не понял структуру языка. Любая идея, похожие источники или кто-то, кто может это объяснить?

ответ

2

Чтобы ответить на ваш вопрос, вы должны попробовать: call argAt(1) doInContext(cos) где 2-й аргумент, который вы передаете этому методу, - это обертка do().

Теперь, игнорируя это, позвольте мне обратиться к реальной проблеме здесь. Классы и объекты - это одно и то же. Единственное отличие состоит в том, что обычно компиляторы ограничивают то, что вы можете делать с классами, и ограничиваете то, что вы можете делать с экземплярами. Ио не делает этого, он говорит, что вы можете рассматривать все как объект и использовать его, как хотите. Поэтому, учитывая это, рассмотрим, как Io обрабатывает наследование. Это не то, как языки, такие как Ruby, где они вводят определенные методы в новые объекты, чтобы они могли функционировать изолированно. Ио использует метод наследования, называемый «дифференциальное наследование». Как это было объяснено мне в 2004 году было примерно так:

«Подумайте, с точки зрения слонов Всем известно, что слон большой, серый, имеет 4 ноги, уши и хобот Так что, если кто-то спросит.. вы, что Dumbo выглядит, вы можете сказать: «Дамбо - короткий слон, с большими гибкими ушами, которые носят лук и могут летать». Вы не должны сказать им все, что слон сделан из описания Дамбо, мы знаем, что, потому что мы знаем, Дамбо слон и собственные атрибуты Дамбо в переопределять, что такое слон имеет»

Это означает, что ваш статическую переменную вы можете просто рассматривать его как обычную «переменную экземпляра» и просто не писать в нее в каких-либо случаях. Если вы это сделаете, он сохранит это перезаписанное значение. В Io нет такой вещи, как private scope, но вы можете немного подделать ее с помощью внешнего хранилища, если вам абсолютно необходимо, чтобы что-то было частным. Ио больше относится к «если вы знаете, что делаете, не стесняйтесь стрелять в ногу» на языках программирования.

+0

Я знал, что этот пример хорош для понимания языковой структуры. Я сделаю для этого дополнительные чтения. Мне очень понравилось IO, но ресурсов не так много, к сожалению. –

+0

Ну, я создал часть withConstructor. Как добавить атрибуты экземпляра? Какие-нибудь советы? –

+0

Это то, что нет различия между атрибутами «instance» и «class/static». Единственное различие заключается в том, как вы их используете. Вы должны добавить 'allFoodItemsEaten' в' Animal' напрямую, и если вы хотите установить его или обновить, скажите Animal обновить его, а не самостоятельно. – jer