Поиск:

Ответ в темуСоздание новой темы Создание опроса
> присвоение переменной информации текстовой строки 
:(
    Опции темы
XaJlepa
Дата 28.9.2010, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 19.9.2010

Репутация: нет
Всего: нет



Здравствуйте.
Подскажите пожалуста можно ли присвоить переменной lisp информацию текстовой строки.
Конкретнее меня интересует следующий вопрос:
Допустим есть текстовые строки с числовыми значениями. Возможно ли сформировать список из этих строк для дальнейших арифмитических действий (сумма, разность и тп.) 
Если алгоритм довольно сложный, намекните какими командами можно воспользоваться для решения данной проблемы
PM MAIL   Вверх
VH_
Дата 28.9.2010, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 182
Регистрация: 31.10.2006

Репутация: 10
Всего: 11



Если содержимое строки - ОДНО число (например, "123.45"), то можно
Код
(apply '+ (mapcar 'distof список_строк))

(apply '+ (mapcar 'distof '("123" "123.45" "12345.67"))) возвращает 12592.1
Если содержимое строки - НЕСКОЛЬКО чисел, разделенных пробелами (например, "123 123.45 12345.67"), то можно
Код
(apply '+ (read (strcat "(" строка ")")))

(apply '+ (read (strcat "(" "123 123.45 12345.67" ")"))) возвращает 12592.1

Это сообщение отредактировал(а) VH_ - 28.9.2010, 21:19
PM MAIL   Вверх
XaJlepa
Дата 1.10.2010, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 19.9.2010

Репутация: нет
Всего: нет



Это не совсем то что мне нужно. Под текстовой строкой я подразумевал примитив AutoCad. Суть проблемы состоит в том что бы изъять данные (само число) из неё, а не в том как просуммировать содержание.
За код спасибо.
PM MAIL   Вверх
VH_
Дата 1.10.2010, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 182
Регистрация: 31.10.2006

Репутация: 10
Всего: 11



Код
(cdr (assoc 1 (entget имя_примитива)))

PM MAIL   Вверх
XaJlepa
Дата 7.10.2010, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 19.9.2010

Репутация: нет
Всего: нет



Склеил всё что мне подсказали, получил:

(defun c:Sum1 ()
  (setq Nab1 (ssget "_w" (getpoint) (getpoint)))
  (setq n (sslength Nab1))
  (setq i 0)
  (repeat n
;вытаскиевает 1 элемент из набора
        (setq ENab (ssname Nab i))
;применяет  entget к элементу
        (setq SpisE (entget (car (ENab))))
;вытаскиевает текст из элемента
        (setq Cifra (cdr (assoc 1 SpisE)))
        (setq i (1+ i))
  )
)


Я так понимаю что цикл должен выдать в конце список цифр, но почему-то функция entget не срабатывает.
Подскажите в чём ошибка.
PM MAIL   Вверх
VH_
Дата 8.10.2010, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 182
Регистрация: 31.10.2006

Репутация: 10
Всего: 11



Функция, возвращающая список содержимого (текстовых строк) объектов TEXT, набор выбора которых передается как аргумент в функцию и связывается с формальным параметром selset:
Код
(defun EXTRACT_TEXTCONTENT (selset)
 ((lambda (ename)
   (if ename
    ((lambda (edata result)
      (if (= (cdr (assoc 0 edata)) "TEXT")
       (cons (cdr (assoc 1 edata)) result)
       result))
     (entget ename)
     (EXTRACT_TEXTCONTENT (ssdel ename selset)))))
  (ssname selset 0)))

Пример вызова функции:
(EXTRACT_TEXTCONTENT (ssget "_W" (getpoint '\nFirst corner: ") (getpoint '\nOpposite corner: ")))
Как-то общепринято в AutoCAD, что команда НЕ возвращает значение (точнее, рекомендуется возвращать "пустую строку", для чего служит вызов функции (prin1) без аргументов). То есть лучше, чтобы команда выполняла все необходимые действия внутри себя.
Код
(defun C:SUM1 ()
 ((lambda (content)
   (if content
    ((lambda (sum)
      ; необходимые действия с суммой, например: (print sum)
     )
     (apply '+ (mapcar 'distof content)))))
  ((lambda (selset)
    (if selset
     (EXTRACT_TEXTCONTENT selset)
     (prompt "\nSelection set is empty.")))
   (ssget "_W" (getpoint "\nFirst corner: ") (getpoint "\nOpposite corner: "))))
 (prin1))


Это сообщение отредактировал(а) VH_ - 8.10.2010, 10:22
PM MAIL   Вверх
XaJlepa
Дата 9.10.2010, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 19.9.2010

Репутация: нет
Всего: нет



До такого  я ещё долго бы не додумался. Спасибо.
Не понятно для чего Вы разбили программу на 2 этапа...
Вторая чать выдаёт ошибку с функцией lambda что-то не в порядке пишет, хз с чем связанную, но это я  "обошёл".

Ещё вопросик, почему тот код что я предлагал не срабатывает?
PM MAIL   Вверх
VH_
Дата 11.10.2010, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 182
Регистрация: 31.10.2006

Репутация: 10
Всего: 11



Во «второй части» (той, что на самом деле является определением "команды" SUM1) следует заменить комментарий
Код
; необходимые действия ...

на вызовы «полезных» функций (пример которой и приведен в комментарии). Если этого не сделать, интерпретатор считает пустое тело лямбда-выражения синтаксической ошибкой.
В LISPе никаких «программ» и «этапов» нет. В данном случае представлены определения двух функций (EXTRACT_TEXTCONTENT) и (C:SUM1), причем в определении второй функции используется вызов первой.
В Вашем определении функции C:SUM1 «не срабатывает» не вызов функции (entget), а попытка интерпретатора вычислить аргумент этого вызова:
Код
(car (ENab))

если с символом ENab связано к моменту вызова имя примитива, что тоже вызывает сомнения, так как для этой связи используется символ Nab, а набор выбора связан с символом Nab1.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума LISP
Void
  • Пожалуйста, создавайте темы с содержательными названиями.
  • Lisp — это целое семейство языков. Всегда указывайте в теме используемый диалект (Common Lisp, Scheme и т.д.).
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | LISP | Следующая тема »


 




[ Время генерации скрипта: 0.0523 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.