Оператор пути REBOL против неоднозначности деления

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

x: 4
y: 2
result: x/y

В моем примере это должно быть деление, но похоже, что оно могло бы быть так же легко оператором пути, если бы x было уточнением объекта или функции. Как REBOL справляется с двусмысленностью? Это просто вопрос перегруженного оператора и системы типов, поэтому он не знает до времени выполнения? Или мне чего-то не хватает в грамматике и действительно есть разница?

ОБНОВЛЕНИЕ Нашел хороший пример кода:

sp: to-integer (100 * 2 * length? buf) / d/3 / 1024 / 1024

Похоже, что арифметическое деление требует пробелов, в то время как оператор пути не требует пробелов. Это оно?


person Russell Leggett    schedule 07.03.2011    source источник
comment
Мне очень нравится видеть новые идеи и даже просто альтернативные синтаксисы. REBOL определенно полон этого. - Здесь говорят правду. :-) Не стесняйтесь присоединиться к нам в комнате чата StackOverflow Rebol, если вас все еще интересует эта тема, это выпущен с открытым исходным кодом!   -  person HostileFork says dont trust SE    schedule 25.01.2013


Ответы (4)


В руководстве по коду говорится:

Пробелы обычно используются для разграничения (для разделения символов).

Это особенно важно, потому что слова могут содержать такие символы, как + и -.

http://www.rebol.com/r3/docs/guide/code-syntax.html

Один из приобретенных навыков REBOler - это умение вставлять пробелы в выражения, которые обычно не требуются в других языках :)

person Sunanda    schedule 08.03.2011
comment
Ах, спасибо. Я не видел этого в обучающих материалах, которые просматривал, но да, это явно то, что происходит. - person Russell Leggett; 08.03.2011
comment
Из любопытства вы находите это раздражающим или неважным? - person Russell Leggett; 08.03.2011
comment
Я не совсем уверен, что упрощенные правила именования слов - хороший компромисс для обязательных дополнительных пробелов в выражениях ... Но это довольно легко запомнить. - person Sunanda; 08.03.2011

Этот вопрос заслуживает ответа с синтаксической точки зрения. В Rebol фактически нет "оператора пути". x/y - это синтаксический элемент, называемый путем. В отличие от этого автономный / (разделенный пробелами) - это не путь, это слово (которое обычно интерпретируется как оператор деления). В Rebol вы можете исследовать синтаксические элементы следующим образом:

length? code: [x/y x / y] ; == 4
type? first code ; == path!
type? second code

, и т.д.

person Ladislav    schedule 25.01.2013

В Rebol обычно требуются пробелы, но есть исключения кое-где для "специальных" символов, таких как ограничивающие серии. Например:

  • [a b c] совпадает с [ a b c ]
  • (a b c) совпадает с ( a b c )
  • [a b c]def совпадает с [a b c] def

Некоторыми довольно мощными инструментами для самоанализа синтаксических элементов являются type?, quote и probe. Оператор кавычек не позволяет интерпретатору определять поведение вещей. Итак, если вы попробовали что-то вроде:

>> data: [x [y 10]]
>> type? data/x/y
>> probe data/x/y

«Живая» природа кода проделает путь и даст вам integer! значение 10. Но если вы используете цитату:

>> data: [x [y 10]]
>> type? quote data/x/y
>> probe quote data/x/y

Затем вы получаете path!, значение которого просто data/x/y, оно никогда не оценивается.

Во внутреннем представлении PATH! в достаточной степени похож на BLOCK! или ПАРЕН !. Просто у него есть особый отличительный лексический тип, который позволяет трактовать его по-разному. Хотя вы заметили, что он может вести себя как «точка», выбирая элементы из объекта или серии, это только то, как он используется диалектом DO. Вы можете придумывать свои собственные идеи, скажем, вы набираете команду «russell»:

russell [
    x: 10
    y: 20
    z: 30
    x/y/z
    (
        print x
        print y
        print z
    )
]

Представьте, что в моем фантастическом примере это выводит 30, 10, _19 _..., потому что функция Рассела оценивает свой блок таким образом, что путь рассматривается как инструкция для сдвига значений. Итак, x/y/z означает x => y, y => z и z => x. Тогда любой код в скобках запускается на диалекте DO. Задания обрабатываются нормально.

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

Но, говоря о «всех этих разных типах», есть еще одна странная ситуация с косой чертой, которая может создать другой тип:

>> type? quote /foo

Это называется refinement! и происходит, когда вы начинаете лексический элемент с косой черты. Вы увидите, что он используется в диалекте DO для вызова необязательных наборов параметров функции. Но опять же, это просто еще один символический LEGO в коробке с деталями. Вы можете приписать ему смысл на своих диалектах, который совершенно иной ...

person HostileFork says dont trust SE    schedule 25.01.2013

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

x*y

Действительный идентификатор

x * y

Выполняет умножение. Похоже, оператор пути - еще один случай этого.

person Russell Leggett    schedule 07.03.2011