|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
Поиск в этой теме |
22.05.2013, 22:18 | #1 | |
LISP. Записать список глобальных переменных в текстовый файл.
студент
Москва
Регистрация: 03.03.2012
Сообщений: 50
|
||
Просмотров: 11808
|
|
||||
записать не сложно, посмотри примеры функций
open, princ, close Для записи небольших переменных, можно воспользоваться и реестром, это еще проще. Посмотри функции: getenv, setenv
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
|
||||
студент Регистрация: 03.03.2012
Москва
Сообщений: 50
|
Цитата:
Переменные могут быть и достаточно большими (я так понял, что под размером здесь понимается количество элементов списка). //------------------------------------------------------------------- Собственно, представляю ниже моё решение поставленного вопроса (уверен есть нормальное решение, а не тот ужас, что получился у меня). Шаг 1: (Создайте в папке с активным документом папку "дерево". Программы обращаются к ней.) Необходимо выделить из LISP-файла имена переменных и сохранить их в файл. Реализация выполнена с помощью языка Delphi. Среда Embarcadero RAD Studio XE2. Код:
Здесь приведена вырезка из общего тела программы, что бы не запутаться. Сама программа доступна по ссылке ниже (поиск имён переменных только часть её). Файл залит на сервер ВКонтакте, поэтому пришлось сменить расширение rar на png. Вам потребуется сделать обратное действие, что бы распаковать. http://vk.com/doc11540956_186104324?...89d233f2cddc31 ШАГ 2 Необходимо считать имена переменных, получить их значения и записать пары (имя + значение) в файл. Реализация понятное дело на VisualLISP (иначе зачем мы вытаскивали имена переменных). Код представлен ниже. Код:
Впринципе всё. Запись в файл была сделана временно. В дальнейшем запись будет вестить в свойства чертежа (_dwgprops -> Прочие). Комментарии приветсвуются. Последний раз редактировалось Golem-iq, 26.05.2013 в 00:14. Причина: Вопрос решён. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,848
|
Ну вообще-то сама идея загружать Lisp из-под Delphi как-то лично мне не очень.
Во-вторых, совсем необязательно существуют глобальные переменные: необходимые данные можно запросто передавать параметрами. В-третьих, для получения именно глобальных переменных есть такая функция в лиспе, как atoms-family. В 99% случаев ее достаточно.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
студент Регистрация: 03.03.2012
Москва
Сообщений: 50
|
Цитата:
1. LISP грузится как текстовый файл и используется только для выделения имён переменных используемых в этом LISP'е. Как локальных, так и глобальных. (Для меня конечно желательно выделять только глобальные, но пока что это не реализовано. Оставим на свободное время в будущем) 2. Если честно не совсем понял. Если суть вопроса "Почему я записываю значения только переменных", то ответ "Необходимо дать возможность пользователю делать откат к некоторой точке построения алгоритма. И для возврата мне необходимо помнить значения переменных на данный момент". Каждая такая точка это отдельный файл *.dwg. 3. Жаль раньше о ней не узнал... Возникает вопрос. Вот такая конструкция: (atoms-family 1) возвращает очень много всего. Как из этого всего выделить имена переменных, которые были заданы в определённом LISP'е ? Мне кажется это на уровне шаманства Просто мне нужны имена и значения переменных именно из LISP'а записывать. Нет смысла записывать сотню других. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,848
|
"Откат" на какое-то состояние лично я реализовываю совсем другими методами
Получение списка глобальных (точнее, введенных) переменных можно получить и так: Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
студент Регистрация: 03.03.2012
Москва
Сообщений: 50
|
Цитата:
Потестил этот код, чуть изменив его для примера. Добавил задание переменных. Код:
Выявилась одна интересная особенность. Если у переменной на момент срабатывания метода значение было не nil, то она не добавится в список get-all-global-vars:end. К примеру при первом запуске функции получим ("I5" "I4" "I3" "I2" "I1"). А при втором и последующих nil. По моему это довольно странно. Можно ли как-то изменить, что бы и при последующих запусках "непустые" переменные тоже добавлялись? |
|||
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,840
|
Или Вам двойка по лиспу, или несоответствие Вашего преподователя. Во первых этот вариант сосвсем не в 100% случаев будет работать (т.к. состояние vla объектов Вы в файл не запишите), во вторых просто изучите базовые понятие лиспа, а то Ваш подход это лечение зубов через ж**у.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,848
|
У меня на такое мозгов не хватает Особенно сейчас, когда во мне булькает уже два литра пива...
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
студент Регистрация: 03.03.2012
Москва
Сообщений: 50
|
Цитата:
для Димы_: Я вроде написал, что каждая точка в построении алгоритма это отдельный файл *.dwg. Лично я себе представляю, что данный файл и хранит сведения об объектах. LISP я изучаю по книгам и форумам. К сожалению моя кафедра не располагает человеком со знаниями по LISP'у. Но нужен результат. Поэтому "крутись, как хочешь". Зачем столько негатива? Не проще было бы объяснить в чём косяки? Или Вы никогда не учились, а уже родились со всем объёмом ваших знаний? |
|||
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,840
|
Перед тем как что-то делать ну, видимо, совсем не в знакомой Вам области я бы или посмотрел как подобное делают другие, или бы спросил. Скажите Вы видели где-нибудь, хоть что-ли бы подобное Ваше реализации? Или Вы считаете, что функция отката, это настолько что-то то уникальное? Я, наспор, буду приводить Вам подряд 100 алгоритмов об которые, каждый Ваш следующий "парсер" (искатель переменных) будет "обламываться" - повертье просто на слово - не отловите Вы НИКАКИМ образом оброзованные программой "переменные", без физического запуска алгоритма (причем с заходом во все его ветки, которых в случае самогенерирующегося кода может быть бесконечное множество). Про vla объекты это не только состовляющие dwg файла, это например открытое приложение excel в котором табличка с данными, или html страница...
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
|
||||
студент Регистрация: 03.03.2012
Москва
Сообщений: 50
|
Цитата:
Пользователь работает с AutoCAD и имеет две вкладки. В первой вкладке подряд расположены кнопки шагов алгоритма. Каждая кнопка просит пользователя ввести какие-либо данные и на основе этих данных делает расчёты и возможно что-то "чертит". На второй вкладке 3 кнопки: "создать новую ветку", "создать новую точку", "перейти к точке №". По нажатию на кнопку "создать новую точку" текущий документ сохраняется в специальную папку, располагающуюся в папке с этим документом. Дополнительно в свойства этого документа записываются имена переменных и их значений. Данное действие происходит между шагами алгоритма из вкладки 1. То есть в данный момент не может быть открыт Excel, html не используется. По кнопке "создать новую ветку" так же создаётся точка, но в новой ветке относительно текущей точки. Таким образом формируется дерево. И что значит "не отловите Вы НИКАКИМ образом образованные программой "переменные", без физического запуска алгоритма". Переменные уже "висят" в памяти после выполнения шага алгоритма. У некоторых после очередного шага алгоритма из вкладки 1 уже есть некоторое значение не nil. И зная имена переменных, можно получить их значения. Вы говорите, что мой код мягко говоря ужасен (есть другое слово). В этом я не спорю. Без хорошего опыта разработки, он таким и останется. Если у Вас есть дельные предложения относительно его улучшения или же примеры данной тематики, ну так поделитесь ими. По моему мнению одними лишь словами "у тебя всё ужасно" и "работать не будет" не обойтись. |
|||
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,840
|
Если программы с ленты 1 - Ваши, то просто не используйте глобальные переменные для передачи данных между (а, например, сразу свойства файлов). Если они чужие - то бросьте эту идею и сохраняйте просто состояние файла (что там сохранит, и не перезатрет ли эти данные другой лисп - это совсем не факт). В "состоянии" программы есть еще куча чего, что может изменить лисп программа - системные настройки, реестр, реакторы... Заверните кнопки в стандартные метки отмены (vla-startundomark ... vla-endundomark), если они еще не завернуты и сохраняйте файлы - все остальное, если программы не Ваши - неработающая чушь для не непонимающей в этом деле коммисии .
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
|
||||
студент Регистрация: 03.03.2012
Москва
Сообщений: 50
|
Цитата:
|
|||
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381
|
То, что в исходном вопросе "записать список глобальных в файл" решено в Autocad в файле acadinfo.lsp. Команда acadinfo. Выгружает все глобальные "символы" и их значения в текстовый файл. Очень любопытная картина получается. Посмотреть support\acadinfo.lsp полезно, чтобы узнать, как это делается. Заодно подумать, и решить "буду делать хорошо, и не буду плохо".
А "плохо" - это даже сама мысль об использовании глобальных для сохранения неких "алгоритмов". Нормальная программа должна быть изолирована в памяти от других. Данные, необходимые для работы в разных сеансах, должна хранить в правильном месте. В зависимости от характера и объема данных это может быть и реестр, и текстовый файл, и даже база данных. Но в правильных ветках реестра и в правильных каталогах ОС. |
|||
|
||||
студент Регистрация: 03.03.2012
Москва
Сообщений: 50
|
Цитата:
Ещё прочитал, что это вроде как то к Express Tools относится. Можете дать ссылки на файлы или сказать где найти? Судя по описанию http://www.afralisp.net/archive/lisp/acet-utils.htm это то что нужно. |
|||
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381
|
Цитата:
Можно и на Lisp функции написать (да просто найти, для работы именно с INI). Кстати, именно в LISP можно в файл сохранить именно выражение ("программу") в виде текста, а потом прочитать и сразу присвоить значения или что угодно сделать. |
|||
|
||||
студент Регистрация: 03.03.2012
Москва
Сообщений: 50
|
Цитата:
А вот найти альтернативы двум посоветованным командам чего-то я не подумал. Сейчас начну искать. Думаю статья Алексея http://autolisp.ru/2011/02/25/data-set-and-get-031/ мне поможет разобраться, что к чему и куда копать Благодарю за стоящий совет! |
|||
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381
|
Цитата:
|
|||
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как записать данные в файл, находящийся на удалённом компьютере? | Makswell | Программирование | 10 | 09.07.2015 09:05 |
Как выдать список переменных (setvar) в текстовый файл | Кларисса | AutoCAD | 6 | 03.06.2013 13:20 |
вывод координат из автокада в текстовый файл | antonio_k | AutoCAD | 7 | 20.03.2009 14:02 |
вставка строки в существующий текстовый файл | Victorovich | Программирование | 10 | 20.06.2008 16:42 |
Помощь по Лире | Серега М | Лира / Лира-САПР | 52 | 28.05.2007 02:47 |