Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пт апр 19, 2024 06:12

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Хочу получить символ закавычивания в строке
СообщениеДобавлено: Ср июн 20, 2007 09:29 
Не в сети

Зарегистрирован: Чт июн 07, 2007 02:14
Сообщения: 40
Откуда: }{абаровск
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
В Форте есть слова которые работают со строками
например: S" или .(

вопрос: как мне быть если я хочу получить в строке наличие " ) или каких либо управляющих символов ?
понятно дело что вот так писать я не могу: S" обычная строка -"строка в кавычках" "


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср июн 20, 2007 10:35 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1261
Благодарил (а): 3 раз.
Поблагодарили: 19 раз.
Например так:
Цитата:
CREATE QUOT 1 C, CHAR " C, 0 C, \ "
: QUOTE QUOT COUNT ;
S" обычная строка -" QUOTE S+ строка в кавычках" QUOTE S+

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср июн 20, 2007 11:40 
Не в сети

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
begemot писал(а):
вопрос: как мне быть если я хочу получить в строке наличие " ) или каких либо управляющих символов ?
понятно дело что вот так писать я не могу: S" обычная строка -"строка в кавычках" "


Смотри исходные тексты СПФ.

S" в src\compiler\spf_immed_lit.f определена как:

Код:

: S"   \ 94+FILE
\ Интерпретация: ( "ccc<quote>" -- c-addr u )
\ Выделить ccc, ограниченные " (двойными кавычками). Записать полученную
\ строку c-addr u во временный буфер. Максимальная длина временного
\ буфера зависит от реализации, но не может быть меньше 80 символов.
\ Следующее использование S" может переписать временный буфер.
\ Обеспечивается как минимум один такой буфер.
\ Компиляция: ( "ccc<quote>" -- )
\ Выделить ccc, ограниченные " (двойными кавычками). Добавить семантику
\ времени выполнения, описанную ниже, к текущему определению.
\ Время выполнения: ( -- c-addr u )
\ Вернуть c-addr и u, которые описывают строку, состоящую из символов ccc.
  [CHAR] " PARSE [COMPILE] SLITERAL
; IMMEDIATE


Стало быть в одинарных кавычках будет:

Код:

: S'
  [CHAR] ' PARSE [COMPILE] SLITERAL
; IMMEDIATE

: TEST S' обычная строка -"строка в кавычках" ' TYPE ; TEST



Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср июн 20, 2007 12:01 
Не в сети
Аватара пользователя

Зарегистрирован: Пт май 05, 2006 06:19
Сообщения: 192
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
если уж речь идет о статичных строках, то можно делать строку с чем угодно хоть с пробелами
Код:
: str001 ( -- adr u )
S" test text " ;
: t1 ( adr u -- )
0 ?DO DUP I + C@ 32 = IF 34 OVER I + C! THEN LOOP DROP ;
str001 t1
str001 CR TYPE
веть строка вкомпилетса, а потом раствить в ней ковычки на местах пробелов ( или любых других символах )
в более сложных случаях и с управляющими кодами можно посмотреть SPF\devel\~ac\lib\str5.f

_________________
SPF


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср июн 20, 2007 12:27 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Mihail писал(а):
Стало быть в одинарных кавычках будет:

Код:


: S'
[CHAR] ' PARSE [COMPILE] SLITERAL
; IMMEDIATE

: TEST S' обычная строка -"строка в кавычках" ' TYPE ; TEST

Это не полное решение проблемы - внутри строки может быть на этот вариант и одинарная кавычка.
Делать вместо S" Sn" , где n - счетчик символов " тоже неудобно - вручную считать символы придется, но похоже это единственно полное решение.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср июн 20, 2007 12:56 
chess писал(а):
Делать вместо S" Sn" , где n - счетчик символов " тоже неудобно - вручную считать символы придется, но похоже это единственно полное решение.

Почему "единственное полное"? Тебе-же сказали - библиотека str5.f . Она решает все твои вопросы...


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср июн 20, 2007 13:34 
Не в сети

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Динамические строки - ~ac/lib/str5.f - с помощью вычисляемых подстановок.
Для джедаев - ~moleg/lib/strings/string.f - статические строки с квотированием символов.

_________________
http://forth.org.ru/~ygrek


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср июн 20, 2007 13:57 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
ArtemKAD писал(а):
Почему "единственное полное"? Тебе-же сказали - библиотека str5.f . Она решает все твои вопросы...


ygrek писал(а):
Динамические строки - ~ac/lib/str5.f - с помощью вычисляемых подстановок.
Для джедаев - ~moleg/lib/strings/string.f - статические строки с квотированием символов.


Я ведь про такое говорю:
Word1(Начало строки) строка, в которой есть и несколько Word2(Конец строки) Word2(Конец строки).
Строка задана в явном виде, а не в каком-либо другом.

Квотирование тоже не проходит - может быть и такая последовательность символов(символы с символами квотирования).

S3" vfhgfkjgh" hghgk" \ / `'' hfghf" - решает задачу
или 3 Sn" vfhgfkjgh" hghgk" \ / `'' hfghf"
другого сказать не хотел, если я ошибаюсь - приведите примеры.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср июн 20, 2007 15:28 
Не в сети

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
chess писал(а):
Это не полное решение проблемы - внутри строки может быть на этот вариант и одинарная кавычка.


Можно до конца строки
Код:

: S\
0 PARSE [COMPILE] SLITERAL
; IMMEDIATE

: TEST S\ S' обычная строка -"строка в кавычках" ' TYPE ; TEST
  TYPE ; TEST



Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср июн 20, 2007 16:23 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Mihail писал(а):
Можно до конца строки
Код:


: S\
0 PARSE [COMPILE] SLITERAL
; IMMEDIATE

: TEST S\ S' обычная строка -"строка в кавычках" ' TYPE ; TEST
TYPE ; TEST

Использование 0 в качестве кода окончания строки - красиво, но делать перевод строки в тексте программы после строки - не очень.

Нужно определить новый SkipUpTo(из парсера), например, так:

Код:
: nSkipUpTo ( n char -- ) \ пропустить до n-го символа char
  SWAP >R
  BEGIN
    DUP GetChar >R <> R> AND 0= IF R> DUP IF 1- >R THEN THEN
  WHILE
    >IN 1+!
  REPEAT DROP
;


Дальше определить Sn".

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср июн 20, 2007 17:06 
---


Последний раз редактировалось profiT Сб мар 01, 2008 01:04, всего редактировалось 1 раз.

Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср июн 20, 2007 17:19 
Не в сети

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
chess писал(а):
Квотирование тоже не проходит - может быть и такая последовательность символов(символы с символами квотирования).

Символы квотирования тоже квотируются.

_________________
http://forth.org.ru/~ygrek


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср июн 20, 2007 18:56 
Не в сети

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
chess писал(а):
Использование 0 в качестве кода окончания строки - красиво, но делать перевод строки в тексте программы после строки - не очень.


Дело до 0 не доходит . Результат PARSE лимитирован длинной строки с помощью EndOfChunk .
Можно использовать любой код, которого не будет в тексте после S\ до конца строки
на пример:
Код:
: S\ 0xFF PARSE POSTPONE SLITERAL ; IMMEDIATE
работает аналогично.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср июн 20, 2007 21:40 
Не в сети

Зарегистрирован: Сб янв 27, 2007 22:00
Сообщения: 106
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Код:
REQUIRE " ~yz/lib/common.f

" \'Hello\'" ASCIIZ> TYPE

"Hello"


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июн 21, 2007 12:29 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Вот травопольная реализация. В нормальной нужно убрать глобальную переменную.

Код:
0 VALUE N-CH
: COUNT" IF 1 ELSE N-CH IF N-CH 1- TO N-CH 1 ELSE 0 THEN THEN ;
: nSkipUpTo
  BEGIN
    DUP GetChar >R <> COUNT" R> AND
  WHILE
    >IN 1+!
  REPEAT DROP
;
: nPARSE \ n char --
  CharAddr >IN @
  ROT nSkipUpTo
  >IN @ - NEGATE
  >IN 1+!
;
: nS" TO N-CH [CHAR] " nPARSE [COMPILE] SLITERAL ; IMMEDIATE

4 nS" "1234" "5670""   TYPE


Можно также число не класть в стек а помещать его в имя, например так S4" или так 4S".

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 28


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB