LISP. Получение строковых значений при активном динамическом вводе
Представим себе ситуацию - в lisp-программе необходимо получить от пользователя некоторые данные. Не будем сейчас рассматривать экзотические способы вроде написания временных диалогов или обращения к WScript - обойдемся стандартными get*-функциями.
Казалось бы, что может быть странного? Ан нет, получение строк с пробелами может преподнести не очень приятный сюрприз, если задействовать динамический ввод. Используем простейший код:
- (defun test (/ sysvar msg res)
- (setq sysvar (vl-remove nil
- (mapcar (function (lambda (x / tmp)
- (if (setq tmp (getvar (car x)))
- (progn (if (cdr x)
- (setvar (car x) (cdr x))
- ) ;_ end of if
- (cons (car x) tmp)
- ) ;_ end of progn
- ) ;_ end of if
- ) ;_ end of LAMBDA
- ) ;_ end of function
- '(("sysmon" . 0) ("dynmode"))
- ) ;_ end of mapcar
- ) ;_ end of vl-remove
- ) ;_ end of setq
- (foreach item '(-3 -2 -1 0 1 2 3)
- (setq msg (strcat " (dynmode=" (itoa item) ") : "))
- (setvar "dynmode" item)
- (setq res (cons (cons item (getstring (strcat "\nString with space" msg) t)) res))
- ) ;_ end of foreach
- (foreach item sysvar (setvar (car item) (cdr item)))
- (reverse res)
- ) ;_ end of defun
Вводить будем последовательно строки " a b ", " c d ", " e f ", " g h ", " i j ", " k l ", " m n " и посмотрим на результат:
- '((-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