2015-01-19 3 views
8

Учитывая, что вы можете ограничить параметры функций конкретными типами данных, разумно, что вы можете определить свой собственный тип данных, но я не вижу ничего в документах Rebol, которые предполагают это как особенность языка (если только я не не выглядел очень хорошо).Как вы определяете свой собственный тип данных в Rebol?

Что я ожидаю это способность делать что-то вроде следующего:

mytype!: make datatype! ... ; some spec here 

Возможно ли это? Следующие не заполнит меня большие надежды:

http://www.rebol.it/giesse/custom-types.r

Из ссылке:

Назначение: { Позволяет программисту определять собственные Rebol; типы данных }

It является довольно длинным фрагментом кода. Не то, на что я надеялся.

ответ

4

Часто предлагается, на сегодня не применяется available only as an experimental patch by Giulio.

Любые полезные предложения пользовательских типов данных, как правило, приходят с желанием зацепить их, чтобы они могли эффективно «перегрузки» вещи, как + или добавить. Существует внутренний слой абстракции, называемый ДЕЙСТВИЕ!, что в теории обеспечивает место, чтобы положить эти крючки:

>> type? :append 
== action! 

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

Для Rebol 3 пользовательские типы данных предлагаются под названием «utype» - посмотрите на "What's known about UTYPE! in Rebol?" для получения дополнительной информации.

В objects announcement for Red, однако, я заметил некоторые мелкий шрифт в конце:

Для того, чтобы помочь Красной компилятор производит более короткий и быстрый код, новая директива #alias компиляция будет введена. Эта директива позволит пользователям превратить определение объекта в «виртуальный» тип, который можно использовать в блоках spec типа. Например:

#alias book!: object [ 
    title: author: year: none 
    banner: does [form reduce [author "wrote" title "in" year]] 
] 

display: func [b [book!]][ 
    print b/banner 
] 

Это дополнение не только позволит более мелкозернистой тип проверки аргументов, но и помогают пользователю лучше документировать свой код.

5

Пытались реализацию utypes в https://github.com/giuliolunati/rebol/tree/utype

В качестве примера, я реализовал complex! utype

В основном, utypes реализуются как объекты со специальными методами в виде пунктирной: Таким образом, .add реализует + оп и т.п.

На данный момент вы можете перегружать все действия (но делать), а некоторые туземцы (математические функции, сравнение, форма, форма, печать, зонд)