Как я могу включить состояние новой строки слова в Rebol?

Знаю, знаю. «Какое состояние новой строки?», - спросите вы. Что ж, позвольте мне показать вам:

append [] w: first new-line [hello] on
== [
    hello
]

W - это теперь слово, которое при добавлении к блоку создает новую строку.

Вы можете выключить его, например, в Rebol 3 так:

append [] to word! w
== [hello]

Но не нашел хорошего способа включить. Сможете ли вы, гуру Ребола?

Уточнение: я ищу такие, что:

append [] f to word! "hello"

есть новая строка.


person MarkI    schedule 21.01.2015    source источник
comment
Я не могу наблюдать в Ребол2, что вы описываете. добавить [] к слову! w по-прежнему дает тот же блок с включенным маркером новой строки.   -  person sqlab    schedule 22.01.2015
comment
Прости. Обновлено. Вы можете попробовать append [] to word! to string! w в Rebol 2.   -  person MarkI    schedule 22.01.2015


Ответы (2)


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

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

set-new-line: func [
    'word [word!]
    state [logic!]
][
    set/any word first new-line reduce [get/any word] state
]

Мы также можем проверить состояние новой строки данного слова:

has-new-line?: func [
    'word [word!]
][
    new-line? reduce [get/any word]
]

В использовании:

>> x: "Foo"
== "Foo"

>> has-new-line? x
== false

>> reduce [x]
== ["Foo"]

>> set-new-line x on
== "Foo"

>> has-new-line? x   
== true

>> reduce [x]        
== [
    "Foo"
]

>> reduce [set-new-line x on set-new-line x off set-new-line x on]  
== [
    "Foo" "Foo"
    "Foo"
]
  • должен работать в rebol2 и rebol3

  • , похоже, работает в красным v0.6.1 с одной оговоркой: кажется, что new-line? всегда возвращает true

person rgchris    schedule 22.01.2015
comment
это не работает, если x - это блок слов, как в вопросе - person sqlab; 22.01.2015
comment
@sqlab В вопросном случае слово hello не содержит состояния новой строки, это слово x. Вы ничего не можете сделать, чтобы привет изменить состояние. Вы можете сделать для строки!, но тогда привет - это совершенно новое слово без того же контекста. - person rgchris; 22.01.2015
comment
Есть два способа интерпретации вопроса - на мой взгляд, я рассмотрел наиболее вероятный: w: first new-line [hello] on set-new-line w off append [] w Другой был бы более прямым, но на самом деле не отвечает на вопрос: new-line append [] w: first new-line [hello] on off - person rgchris; 22.01.2015
comment
Или действительно: w: 'hello set-new-line w on append [] w - если указанные выше функции не являются ответом, тогда вопрос неверный !!! - person rgchris; 22.01.2015
comment
Рассмотрим: x: Foo y:: x зонд такой же? x y set-new-line x при зондировании уменьшить [has-new-line? x имеет новую строку? y] зонд такой же? x y Грязный! - person rgchris; 22.01.2015
comment
Я не знаю смысла вопроса, но я ожидал бы чего-то вроде append [] the-required-function to word! w в качестве ответа - person sqlab; 22.01.2015
comment
@sqlab потребует небольшого разъяснения от marki - надеюсь, здесь достаточно, чтобы продолжить ... - person rgchris; 22.01.2015
comment
Кстати, @marki, у вас должно быть достаточно очков репутации, чтобы присоединиться к чату Rebol / Red. - person rgchris; 22.01.2015

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

f: func [w][first new-line append copy [] :w on]
person MarkI    schedule 25.08.2017
comment
это плохой тон просить голоса за товарища. если ваш ответ полезен, он получит свои голоса - person TheRealMrCrowley; 25.08.2017