Оператор пути REBOL против неоднозначности деления - PullRequest
0 голосов
/ 07 марта 2011

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

x: 4
y: 2
result: x/y

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

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

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

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

Ответы [ 4 ]

3 голосов
/ 25 января 2013

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

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

и т. Д.

2 голосов
/ 25 января 2013

Пробелы обычно нужны в Rebol, но тут и там есть исключения для «специальных» символов, таких как те, которые разделяют серии.Например:

  • [a b c] совпадает с [ a b c ]
  • (a b c) совпадает с ( a b c )
  • [a b c]def то же самоеas [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 [
    x: 10
    y: 20
    z: 30
    x/y/z
    (
        print x
        print y
        print z
    )
]

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

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

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

>> type? quote /foo

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

2 голосов
/ 08 марта 2011

Руководство по коду гласит:

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

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

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

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

0 голосов
/ 07 марта 2011

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

x*y

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

x * y

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

...