LISP: функция strcat игнорирует управляющие символы?
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP: функция strcat игнорирует управляющие символы?

LISP: функция strcat игнорирует управляющие символы?

Ответ
Поиск в этой теме
Непрочитано 20.02.2014, 23:23 #1
LISP: функция strcat игнорирует управляющие символы?
WhiteShark
 
Регистрация: 30.03.2012
Сообщений: 101

Вопрос в названии темы.

Пример: надо получить кавычку внутри текста, но
(strcat " " "\"" " ") игнорит бэкслэш и в результате получаем " \" ". Как быть?

Ну и так же у меня не получается прописать символ с его кодом nnn через конструкцию \nnn.
Просмотров: 4880
 
Непрочитано 20.02.2014, 23:42
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411


Выполни в ком.строке
Код:
[Выделить все]
(princ (strcat " " "\"" " ") )
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.02.2014, 00:00
#3
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от WhiteShark Посмотреть сообщение
(strcat " " "\"" " ") игнорит бэкслэш и в результате получаем " \" ". Как быть?
Так и должно быть, ничего не "игнорит", вполне нормальное поведение. А что ожидалось?
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Автор темы   Непрочитано 21.02.2014, 00:02
#4
WhiteShark


 
Регистрация: 30.03.2012
Сообщений: 101


Princ то работает, но он мне не подходит. Мне нужно чтоб strcat возвращал как надо. Потому что у меня (apply 'strcat ...)

----- добавлено через ~1 мин. -----
Ожидалась " " " (кавычка в кавычках обрамленная пробелами), то есть без \
WhiteShark вне форума  
 
Непрочитано 21.02.2014, 01:28
#5
nolte

спринклеры, сантехника
 
Регистрация: 26.01.2010
Сообщений: 190
Отправить сообщение для nolte с помощью Skype™


попробуй так
(strcat (chr 34) "text" (chr 34))
__________________
Знание лисп: со справочником Н. Полещука
nolte вне форума  
 
Непрочитано 21.02.2014, 09:23
#6
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411


WhiteShark, почитай про управляющие символы и работу слеша. Тебя вообще не смущает, что перевод строки - это \n, символ табуляции - \t, слеш - \\ и т.д.?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.02.2014, 10:17
#7
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от WhiteShark Посмотреть сообщение
Ожидалась " " " (кавычка в кавычках обрамленная пробелами), то есть без \
Не надо путать внутреннее представление строки и ее вид при выводе на экран.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Автор темы   Непрочитано 21.02.2014, 13:05
#8
WhiteShark


 
Регистрация: 30.03.2012
Сообщений: 101


Do$ ну почему моя строка не может быть такой как я хочу и представлять из себя просто кавычку, а не кавычку со слэшем? Так же не должно быть.
Между прочим, вариант от nolte, даёт желаемый результат!

Вообще задача состоит в том, чтобы команде vl-cmdf передать набор параметров, имеющихся ввиду списка. Для этого надо перевести весь этот список в строку. Например:

(vl-cmdf "-insert" "blockname" "basePt" "Xscale" "Yscale" "Zscale" "Angle" ???что то вокруг списка значений тэгов вида ("TagVal1" "TagVal2")??)
нужно перевести в

(vl-cmdf "-insert" "blockname" "basePt" "Xscale" "Yscale" "Zscale" "Angle" "TagVal1" "TagVal2")

Вот вместо ???что то вокруг .... ??? вроде подходит (apply 'strcat ("TagVal1" "TagVal2")), но кавычки при этом съедаются. Конструкция

(strcat (chr 34) "TagVal1" (chr 34) " " (chr 34) "TagVal2" (chr 34))

возвращает желаемую последовательность "TagVal1" "TagVal2" но vl-cmdf всё равно её не кушает

Понятно, что можно более программно менять значения атрибутов в блоках, но цель была сделать это во время вставки, а не после.
Если, кто-то что-то подскажет, буду рад
WhiteShark вне форума  
 
Непрочитано 21.02.2014, 13:22
#9
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от WhiteShark Посмотреть сообщение
Do$ ну почему моя строка не может быть такой как я хочу и представлять из себя просто кавычку, а не кавычку со слэшем? Так же не должно быть.
Между прочим, вариант от nolte, даёт желаемый результат!
Код:
[Выделить все]
_$ (strcat (chr 34) "text" (chr 34))
"\"text\""
_$
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Автор темы   Непрочитано 21.02.2014, 13:29
#10
WhiteShark


 
Регистрация: 30.03.2012
Сообщений: 101


Do$, это во VLIDE так выглядит. А если вы присвоите это значение какой нить переменной и потом её inspect, то увидите, что там будет
#\"
#\t
#\e
#\x
#\t
#\"
То есть тут каждый символ предваряется слэшем. То есть, считай его нет и перед кавычкой. В общем, как бы это ни казалось визуально тем же, но vl-cmdf такой вариант съедает. Единстенная проблема - не понимает пробел как enter (
WhiteShark вне форума  
 
Непрочитано 21.02.2014, 13:53
#11
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Как Enter vl-cmdf принимает пустую строку:
Код:
[Выделить все]
(vl-cmdf "_.line" "0,0,0" "1,1,1" "")
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Автор темы   Непрочитано 21.02.2014, 14:15
#12
WhiteShark


 
Регистрация: 30.03.2012
Сообщений: 101


Do$, Это понятно, что пустую строку как enter. Я имею ввиду не воспринимает пробел между аргументамии. То есть

хотя вроде и получается после обработки (vl-cmdf "-insert" "blockname" "basePt" "Xscale" "Yscale" "Zscale" "Angle" "TagVal1" "TagVal2")

но по факту передается не пара значений тэгов в конце, а совокупность ' "TagVal1" "TagVal2" ' воспринимается как значение первого тэга, а для значения второго тэга команда ожидает очередного ввода.

Задачу в общем виде можно описать так: как сделать

(vl-cmdf "_.line" "0,0,0" "1,1,1" "")
из vl-cmdf и ("_.line" "0,0,0" "1,1,1" "")?

То есть отбросить скобки вокруг списка параметров (преобразовать список в строку)?
WhiteShark вне форума  
 
Непрочитано 21.02.2014, 15:20
#13
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Код:
[Выделить все]
(apply 'vl-cmdf '("_.line" "0,0,0" "1,1,1" ""))
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 21.02.2014, 15:23
#14
Alan

CAD
 
Регистрация: 28.08.2003
Киев
Сообщений: 1,834
<phrase 1=


Цитата:
Сообщение от WhiteShark Посмотреть сообщение
Задачу в общем виде можно описать так: как сделать

(vl-cmdf "_.line" "0,0,0" "1,1,1" "")
из vl-cmdf и ("_.line" "0,0,0" "1,1,1" "")?

То есть отбросить скобки вокруг списка параметров (преобразовать список в строку)?
Какая мутность и примитивность задачи в теме Лисп...
__________________
По теории майский жук летать не может.
Но он этого не знает. И летает...
Alan вне форума  
 
Автор темы   Непрочитано 21.02.2014, 15:37
#15
WhiteShark


 
Регистрация: 30.03.2012
Сообщений: 101


Do$, большое спасибо! Направили, куда нужно )

В итоге конструкция

(apply 'vl-cmdf (append (list "-insert" "blockname" "basePt" "Xscale" "Yscale" "Zscale" "Angle") '("Val1" "Val2" .. "Valn")) )

делает то, что нужно

Alan может это и мутно, но короче еще одного цикла. А общая задача, которую я решил - восстановление взорванных блоков (без наличия их описаний в словарях). По мне так не самая примитивная задача. По крайней мере я еще не видел нигде её решения.

Последний раз редактировалось WhiteShark, 21.02.2014 в 15:45.
WhiteShark вне форума  
 
Непрочитано 21.02.2014, 15:56
#16
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411


Вообще-то вставку блока можно делать и не командными методами. ИМХО нередко получается надежнее и проще.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 21.02.2014, 16:08
#17
WhiteShark


 
Регистрация: 30.03.2012
Сообщений: 101


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Вообще-то вставку блока можно делать и не командными методами. ИМХО нередко получается надежнее и проще.
Тут как раз тот случай, когда не проще. Ведь нельзя же сделать вставку блока с уже назначенными значениями TextString'ов атрибутов?
vla-insertblock такого не позволяет. А делать блок через entmake намного более громоздко этой строчки, потому что заранее неизвестен набор примитивов, составляющих блок.
WhiteShark вне форума  
 
Непрочитано 21.02.2014, 16:24
#18
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411


Ага, получается, что проще сначала системные переменные ATTREQ (и, возможно, ATTDIA) поставить в 0, потом назначать значения атрибутам, потом возвращать все обратно? Не, я на такое не согласный - мне проще получить указатель на вставленный программно блок, из этого указателя вычислить все атрибуты и по тэгам уже назначать строковые значения. Быстро, просто, надежно.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 21.02.2014, 16:40
#19
WhiteShark


 
Регистрация: 30.03.2012
Сообщений: 101


Во-первых я не трогаю эти переменные (и без них всё как надо)
Во-вторых я уже было дописал ваш второй предлагаемый вариант, как ответил Do$ и вариант в одну строчку мне показался покомпактней чем такой )
Плюс, вы не считаете, что идеологически правильно вставить блок с уже правильными значениями атрибутов, чем вставить с неправильными и потом вторым действием их исправлять?
WhiteShark вне форума  
 
Непрочитано 21.02.2014, 16:41
#20
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411


Не-а, не считаю: последовательность задания атрибутов может быть изменена. Пользователем или нет, это уже неважно. А программа должна работать предсказуемо.
P.S. "Вы" - это кому? Меня один.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.02.2014, 18:23
#21
Alan

CAD
 
Регистрация: 28.08.2003
Киев
Сообщений: 1,834
<phrase 1=


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
последовательность задания атрибутов может быть изменена.
И командные методы здесь не применимы.
Для меня проще вставить блок " с неправильными" атрибутами при (setvar "attreq" 0) "и потом вторым действием их исправлять".
Указателем на это примитив будет (setq rr3 (entlast)) а потом корректировка не раз публиковавшейся мной здесь функцией.
__________________
По теории майский жук летать не может.
Но он этого не знает. И летает...
Alan вне форума  
 
Автор темы   Непрочитано 21.02.2014, 18:48
#22
WhiteShark


 
Регистрация: 30.03.2012
Сообщений: 101


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
последовательность задания атрибутов может быть изменена. Пользователем или нет, это уже неважно.
В моём случае последовательность не может быть изменена. Вернее, правильность передачи значений атрибутов именно нужным тегам отслеживается и так по сценарию.
WhiteShark вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP: функция strcat игнорирует управляющие символы?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программная настройка AutoCAD, как это делается? Krieger Программирование 163 13.07.2015 19:04
AUTOCAD 2010 перестал переключаться в многооконный режим. Проблемы с переменными Андрей Х. AutoCAD 24 27.05.2015 10:17
Расчет геметрических характеристик сечений, черчение елипс инерции - не работает лисп Student LISP 14 17.02.2014 10:27
Acaddoc.lsp вирус или нет? Mikhail.Pavliy AutoCAD 119 04.07.2013 22:16
Lisp. Не вставляет значения в базу access. Zaghim LISP 2 11.07.2012 14:29