ADN Open CIS
Сообщество программистов Autodesk в СНГ

20/07/2016

LISP. Получение строковых значений при активном динамическом вводе

Представим себе ситуацию - в lisp-программе необходимо получить от пользователя некоторые данные. Не будем сейчас рассматривать экзотические способы вроде написания временных диалогов или обращения к WScript - обойдемся стандартными get*-функциями.

Казалось бы, что может быть странного? Ан нет, получение строк с пробелами может преподнести не очень приятный сюрприз, если задействовать динамический ввод. Используем простейший код:

Код - Auto/Visual LISP: [Выделить]
  1. (defun test (/ sysvar msg res)
  2.   (setq sysvar (vl-remove nil
  3.                           (mapcar (function (lambda (x / tmp)
  4.                                               (if (setq tmp (getvar (car x)))
  5.                                                 (progn (if (cdr x)
  6.                                                          (setvar (car x) (cdr x))
  7.                                                          ) ;_ end of if
  8.                                                        (cons (car x) tmp)
  9.                                                        ) ;_ end of progn
  10.                                                 ) ;_ end of if
  11.                                               ) ;_ end of LAMBDA
  12.                                             ) ;_ end of function
  13.                                   '(("sysmon" . 0) ("dynmode"))
  14.                                   ) ;_ end of mapcar
  15.                           ) ;_ end of vl-remove
  16.         ) ;_ end of setq
  17.   (foreach item '(-3 -2 -1 0 1 2 3)
  18.     (setq msg (strcat " (dynmode=" (itoa item) ") : "))
  19.     (setvar "dynmode" item)
  20.     (setq res (cons (cons item (getstring (strcat "\nString with space" msg) t)) res))
  21.     ) ;_ end of foreach
  22.   (foreach item sysvar (setvar (car item) (cdr item)))
  23.   (reverse res)
  24.   ) ;_ end of defun

Вводить будем последовательно строки " a b ", " c d ", " e f ", " g h ", " i j ", " k l ", " m n " и посмотрим на результат:

Код - Auto/Visual LISP: [Выделить]
  1. '((-3 . " a b ") (-2 . " c d ") (-1 . " e f ") (0 . " g h ") (1 . "i j") (2 . " k l ") (3 . "m n"))

Как видно, при DYNMODE равном 1 или 3 начальные и конечные пробелы во введенной строке "отрубаются". Этот момент придется учитывать при написании собственных кодов, если для дальнейшей работы критично наличие начальных и (или) конечных пробелов.


Автор: Алексей Кулик.

Обсуждение: http://adn-cis.org/forum/index.php?topic=

Опубликовано 20.07.2016