dwg.ru forum rss xml
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Библиотека функций > DwgRuLispLib: Преобразование значения в строку

DwgRuLispLib: Преобразование значения в строку

Версия для печати
 
Ответ
Опции темы Поиск в этой теме
Непрочитано 28.11.2007, 22:50 #1
DwgRuLispLib: Преобразование значения в строку
Кулик Алексей aka kpblc
Moderator
 
LISP, C# (ACAD 200[9,12,13,14])
 
С.-Петербург
Регистрация: 25.08.2003
Сообщений: 34,567

Кулик Алексей aka kpblc вне форума Вставить имя

Код:
[Выделить все]
(defun _dwgru-conv-value-to-string (value)
                                   ;|
*    Преобразование значения в строку. Для nil возвращает пустую строку.
*    Примеры вызова:
(_dwgru-conv-value-to-string 123)	; "123"
(_dwgru-conv-value-to-string 123.50)	; "123.5"
(_dwgru-conv-value-to-string "qwer")	; "qwer"
|;
  (cond
    ((not value) "")
    ((= (type value) 'str) value)
    (t (vl-princ-to-string value))
    ) ;_ end of cond
  ) ;_ end of defun
P.S. Код сформирован благодаря Александру Ривилису.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 29.11.2007 в 00:27.
Просмотров: 9067
 
Непрочитано 29.11.2007, 06:11
#2
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 9,745


Строка
Код:
[Выделить все]
 
((= (type value) 'str) value)
лишняя. vl-princ-to-string и так вернёт строку без изменения.
ShaggyDoc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 29.11.2007, 08:07
#3
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 773


В строке
Код:
[Выделить все]
(t (vl-princ-to-string value))
лишняя t, а value я бы обернул в eval, както так:
Код:
[Выделить все]
((vl-princ-to-string (eval value)))
иначе:
Код:
[Выделить все]
(setq a 'b
      b 1
)
(_dwgru-conv-value-to-string a) -> "B"
(_dwgru-conv-value-to-string b) -> "1"
Alaspher вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 29.11.2007, 09:05
#4
Кулик Алексей aka kpblc
Moderator

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


Теоретически вариант с проверкой на 'str должен работать быстрее, но практически прирост скорости минимален: с проверкой на str выдает 1610 миллисекунд на выполнение, без проверки - 1656 миллисекунд. Код поменяю. Единственное "но" - к вечеру поближе.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 29.11.2007, 09:46
#5
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,499
Отправить сообщение для VVA с помощью ICQ Отправить сообщение для VVA с помощью Skype™


Еще есть предложения для типа real возвращать максимальное количество знаков. Я руководствуюсь тем, что результат _dwgru-conv-value-to-string в строковом виде должен максимально соответствовать оригиналу.
Код:
[Выделить все]
 
(_dwgru-conv-value-to-string pi) ;_ Результат  "3.14159" 
(rtos pi 2 12)                            ;_ Результат  "3.14159265359"
Добавить в cond что-то
Код:
[Выделить все]
 
((= (type value) 'real)(rtos value 2 12))
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 29.11.2007, 10:01
#6
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 773


Цитата:
Сообщение от VVA Посмотреть сообщение
результат _dwgru-conv-value-to-string в строковом виде должен максимально соответствовать оригиналу
Тогда так надо:
Код:
[Выделить все]
(vl-string-right-trim "0." (rtos value 2 15))
Alaspher вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 29.11.2007, 10:04
#7
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
_$ (rtos pi 2 15)
"3.141592653589793"
До какого знака выполнять? И это (пока по крайней мере) на Windows XP Pro (32 bit), ACAD 2005. Вот мне интересно, на 64-битных системах на каком количестве знаков исчезнет разница?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 29.11.2007, 10:10
#8
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 773


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Вот мне интересно, на 64-битных системах на каком количестве знаков исчезнет разница?
Проверить не на чем, но думаю на том же - интерпретатор ЛИСП, врядли переделают уж очень радикально. Но, в принципе, никто не запрещает сделать и (rtos value 2 64) - оно не сломается
Alaspher вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 29.11.2007, 11:16
#9
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,499
Отправить сообщение для VVA с помощью ICQ Отправить сообщение для VVA с помощью Skype™


По поводу 12, 15, 64 или что-то еще. Наверное, это должно быть максимальное значение, ограниченное здравым смыслом
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 29.11.2007, 13:17
#10
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 773


Цитата:
Сообщение от VVA Посмотреть сообщение
По поводу 12, 15, 64 или что-то еще. Наверное, это должно быть максимальное значение, ограниченное здравым смыслом
Здравый смысл, во всех отношения замечательная штука, кроме одного "НО" - он контекстнозависим... Поскольку функция претендует на унивесальность, то ориентироваться надо бы только на технические возможности, так считаю.
Alaspher вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 29.11.2007, 14:25
#11
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,499
Отправить сообщение для VVA с помощью ICQ Отправить сообщение для VVA с помощью Skype™


Кстати, насчет здравого смысла и технических возможностей примерчик
Код:
[Выделить все]
  (setq a 1.123456789012345678901234567890)
  (rtos a 2 14) ;_ "1.12345678901235" 
  (rtos a 2 15) ;_ "1.123456789012346" 
  (rtos a 2 16) ;_ "1.123456789012345" 
  (rtos a 2 17) ;_ "1.123456789012345"
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 29.11.2007, 14:38
#12
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 9,745


Мне кажется, функцию конвертирования надо оставлять "как есть". Что vl-princ-to-string для числа вернет, то и вернет функция.

А форматирование "строковых" чисел делать отдельной функцией. Там тоже может быть много вариантов (лидирующие и завершающие нули, символ десятичной точки). Не надо стремиться всё в одно место загнать. Мне даже rtos пришлось заменять.
ShaggyDoc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 29.11.2007, 15:30
#13
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 773


Цитата:
Сообщение от VVA Посмотреть сообщение
Кстати, насчет здравого смысла и технических возможностей примерчик
Код:
[Выделить все]
  (setq a 1.123456789012345678901234567890)
  (rtos a 2 14) ;_ "1.12345678901235" 
  (rtos a 2 15) ;_ "1.123456789012346" 
  (rtos a 2 16) ;_ "1.123456789012345" 
  (rtos a 2 17) ;_ "1.123456789012345"
Интересное наблюдение - получается, что преобразование rtos производит с бОльшей точностью, чем отображает.

Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Мне кажется, функцию конвертирования надо оставлять "как есть". Что vl-princ-to-string для числа вернет, то и вернет функция.
Но, если единственным отличием библиотечной функции от встроенной будет возврат пустой сторки, при отсутствии содержательного значения, то не проще будет прямо в тексте программы набрать: (if value (vl-princ-to-string value) ""), чем искать библиотечную? Потребность именно в такой трактовке nil не выглядит высокой.
Alaspher вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 29.11.2007, 17:03
#14
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,499
Отправить сообщение для VVA с помощью ICQ Отправить сообщение для VVA с помощью Skype™


>Alaspher
+1
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 29.11.2007, 17:08
#15
Кулик Алексей aka kpblc
Moderator

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


То есть, я так понимаю, такая "функция" нафиг не требуется. Зер гуд
P.S. А вот вариант "замены rtos" посмотреть было бы любопытно...
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 29.11.2007, 18:04
#16
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,499
Отправить сообщение для VVA с помощью ICQ Отправить сообщение для VVA с помощью Skype™


Не правильно понимаете. Такая функция "нафиг" требуется. Речь просто о том, данные на входе и выходе должны совпадать. Только на выходе - строка.
Вызывая функцию (_DWGRU-CONV-VALUE-TO-STRING 'ABCD) я вправе ожидать на выходе "ABCD", а не "ABC"
Это же справедливо и для
(_DWGRU-CONV-VALUE-TO-STRING 1.111222333444555).
На выходе должно быть не "1.11122" как сейчас, а "1.111222333444555".
Понятно, что в представлении и обработке вещественных чисел есть нюансы. Но это нюансы надо максимально приблизить к оригиналу c учетом ограничений Автокада. Поэтому и предлагаю для real внести строчку
((= (type value) 'real)(rtos value 2 15))
Назначение такой ф-ции вижу как "Гарантированно возвращать строку, максимально похожую на оригинал"
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 29.11.2007, 21:48
#17
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 9,745


Цитата:
Но, если единственным отличием библиотечной функции от встроенной будет возврат пустой сторки, при отсутствии содержательного значения, то не проще будет прямо в тексте программы набрать: (if value (vl-princ-to-string value) ""), чем искать библиотечную? Потребность именно в такой трактовке nil не выглядит высокой.
У меня есть подобная функция. После множества экспериментов оказалось, что она действительно не нужна. В нескольких тысячах LSP она использована всего 2 раза. А была она в разных вариантах, в том числе с возвратом "". Не пригодилось - в результате она стала простой оберткой vl-princ-to-string, что бессмысленно.

Но подобная функция могла бы быть полезной, если добавить в аргументы значение по умолчанию если value NIL. Для этого варианта умолчанием мог бы быть и NIL, и пустая строка, и что-то еще в зависимости от контекста вызова.

Насчет разрядности возврата значений для real всё-таки предлагаю это в отдельную функцию. Почему, например, именно 15 знаков? А если надо не 1.11122 и не 1.111222333444555, а 1.11122300000? Или 0001.11000
ShaggyDoc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 30.11.2007, 07:58
#18
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 773


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Насчет разрядности возврата значений для real всё-таки предлагаю это в отдельную функцию. Почему, например, именно 15 знаков? А если надо не 1.11122 и не 1.111222333444555, а 1.11122300000? Или 0001.11000
Так вот она и есть, эта отдельная функция. А если и делать копию rtos, то только ради того, чтобы иметь легкоуправляемый возврат хвостовых нулей. Других задач я не вижу.
Alaspher вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 30.11.2007, 08:52
#19
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 9,745


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
P.S. А вот вариант "замены rtos" посмотреть было бы любопытно...
Да ничего там любопытного. Просто сейчас, не могу вспомнить почему сделал. Зачем - помню. Вдруг в какой-то версии AutoCAD (вроде в 2005 или 2006) штатная (rtos number 2 3) стала вдруг выдавать неправильный формат, а это было недопустимо. Ранее тоже не наблюдалось. rtos, естественно, всегда вызываю с полным набором аргументов.

Но сейчас, в AutoCAD 2008, rtos возвращает правильный результат. Чувствую себя идиотом
ShaggyDoc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 30.11.2007, 09:07
#20
Кулик Алексей aka kpblc
Moderator

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


Могу обрадовать - на 2008 сидят далеко не все
(в сторону): Интересно, а кем мне тогда себя чувствовать, когда в 2002 при попытке записать ldata на блок *Model_space* вываливалась ошибка, а в 2005 это нормально работало?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Библиотека функций > DwgRuLispLib: Преобразование значения в строку

Конкурс для проектировщиков
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DwgRuLispLib: Преобразование указателя на примитив в vla Кулик Алексей aka kpblc Библиотека функций 5 27.12.2007 13:47
DwgRuLispLib: Преобразование указателя на примитив в ename Кулик Алексей aka kpblc Библиотека функций 1 27.12.2007 13:30
DwgRuLispLib: Преобразование variant или safearray в список Кулик Алексей aka kpblc Библиотека функций 24 30.11.2007 18:53
задание атрибуту значения имени файла Паша Горбунов AutoCAD 5 21.10.2005 19:06

|| Главная || Каталог САПР || Тендеры || Публикации || Объявления || Биржа труда || Download || Галерея ||
|| Библиотека || Кунсткамера || Каталог предприятий || Контакты || Файлообменник || Блоги ||


Размещение рекламы