Digs - Персональная территория

Авторский проект Артема Глазкова
? 
        Версия для печати (цвет)  

Brainfuck Labs

  Object Brainfuck


    Описание
    Каждая ячейка это теперь объект. Она хранит ClassType, т.е. указатель на класс и байт данных. Изначальные команды остаются рабочими и манипулируют байтами данных как обычными ячейками.

    Всего классов 26 (по количеству букв латинского алфавита) плюс базовый безымянный класс. Класс содержит всего один метод, который может быть вызван. Описание класса производится с помощью строчной буквы латинского алфавита, за которой в фигурных скобках идет описание метода. Например:

a{##@}

    Между именем класса и фигурной скобкой не должно быть пробела или посторонних символов.

    Указание в программе прописной буквы устанавливает в текущей ячейке соответствующий ClassType. Вызов метода объекта, находящегося в текущей ячейке, осуществляется командой «^».

    Как принято в ООП здесь так же присутствует наследование. Для наследования, при объявлении класса, нужно указать класс предок между именем нового класса и фигурной скобкой. Например:

ba{$##}

    Здесь класс b наследуется от класса a. Символ «$» это команда вызова метода предка.

    Описание классов происходит в момент выполнение программы, поэтому оно может присутствовать где угодно. Например, описание одного класса может происходить в методе другого класса. Также нет никакой структуры наследования. Т.е. b можно наследовать от a, c можно наследовать от b, а a, в свою очередь наследовать от c. И даже больше: класс можно наследовать от самого себя. При этом наследование будет именно от самого себя, а не от своего предыдущего описания. Т.е. таким образом, с помощью класса можно реализовать рекурсию.

    При вызове метода класса, содержимое метода копируется в специальную область, поэтому переопределение класса внутри себя самого не "перебьет" выполнение метода, но при последующем вызове (даже внутри текущего метода) будет выполняться уже новый метод.

    Изначально, каждая ячейка содержит ClassType базового класса, метод которого предназначен для очистки ячейки. Все 26 классов изначально являются наследника базового класса и их методы вызывают метод базового класса.

    Есть еще две команды, которые являются нестандартными для всего ООП. Это «*» и «/». Две эти команды, соответственно увеличивают и уменьшают на единицу ClassType в текущей ячейке. Т.е., к примеру, если в ячейке располагался объект класса b, то после операции «*» в ней будет находиться объект класса c. Для операций «*» и «/» за классом z следует класс a.

    Примечание для BFLabs
    (У BFLabs отдельная документация.)
    Так как язык двухпоточный, следует упомянуть о некоторых моментах. Команды вызова («$» и «^») и первая команда вызываемого метода выполняются в разных тактах. Т.е. между командой вызова и первой командой метода может быть выполнена еще одна команда, находящаяся в другом потоке. Метод очистки базового класса выполняется за один такт. Но так как его нужно вызвать, то вместе с командой вызова получается два такта. Объявление класса происходит за один такт.


    Примеры

    Hello World!
    Первая программа, которую пишут для всех языков, на Object BFLabs выглядит так:

a{++++}b{A^^^^}c{B^B^}d{----}C^C^^^.C^---.^^-..^-.>C^.C^B^^^-.B^^^.^-.D^--.^^.>C^+.

    Модификация предыдущего варианта с использованием наследования (всего на один байт больше):

a{++++}ba{$$$$}cb{$$}d{----}C^^A^^.C^---.A^^-..^-.>C^.^B^A^^-.B^A^^.^-.D^--.^^.>C^+.


    IF THEN ... ELSE ... ENDIF
    С помощью объектов реализовать такое становится просто. Объявляем какой-нибудь класс, метод которого должен реализовывать блок между THEN и ELSE. Далее делается проверка текущей ячейки, и если в ней не ноль, то в цикле переопределяем класс, реализовав блок ELSE ... ENDIF. Пример:

a{+++.}[a{--.}[-]]A^


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

a{>+<B}b{>-<A}A[^-]


    Масштабирование лабиринтов (BFLabs)
    Сразу код:

u{#}
v{###}
s{@xu{$}yv{$}rt{$}}
t{@xv{$}yu{$}rs{$}}
xu{$}yv{$}rt{$}

    Здесь u и v задают масштаб для, соответственно, осей x и y. Классы s и t это временные классы, от которых идет наследование класса разворота координат, и которые переопределяют классы движения.
    Теперь для сдвига на одну клетку в первом потоке нужно использовать X^, во втором – Y^. Для разворота (команда «@») используется R^. Разворот вызывает метод предка, который делает сам разворот, а также меняет наследование для x и y, чтобы сохранять направление масштабирования. При этом он еще подменяет своего предка, чтобы при следующем развороте вернуть все обратно. Если оба потока работают в одной ячейке, то установку объекта и вызов метода нужно экранировать.
    pattern2 из папки с примерами будет теперь выглядеть так:

1:
{u{#}
v{##}
s{@xu{$}yv{$}rt{$}}
t{@xv{$}yu{$}rs{$}}
xu{$}yv{$}rt{$}

+}[{X^}{R^}+]

2: [>++++[{Y^^^|}{R^}-]<{R^}]


© 2005-16, Powered By Digs (Написать письмо, vk)