|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
Поиск в этой теме |
22.05.2013, 22:18 | #1 | |
LISP. Записать список глобальных переменных в текстовый файл.
студент
Москва
Регистрация: 03.03.2012
Сообщений: 50
|
||
Просмотров: 11782
|
|
||||
записать не сложно, посмотри примеры функций
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,844
|
Ну вообще-то сама идея загружать 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,844
|
"Откат" на какое-то состояние лично я реализовываю совсем другими методами
Получение списка глобальных (точнее, введенных) переменных можно получить и так: Код:
__________________
Моя библиотека 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,844
|
У меня на такое мозгов не хватает Особенно сейчас, когда во мне булькает уже два литра пива...
__________________
Моя библиотека 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
|
Цитата:
|
|||
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,840
|
А сколько "страниц кода" займет работа с ini на автолиспе?
Offtop: что ini это как-бы прошлый век+найти готовую функцию я думаю труда не составит... и самое главное зачем оно в задаче автора
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,844
|
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
студент Регистрация: 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
|
Цитата:
Конечно, в конкретной задаче хранить данные можно множеством способов. И специфичных для LISP (записать список в файл "со скобками"), и универсальных - например просто список строк. Но при этом каждый раз писать код, разбирающий файл и знающий, в какой строке что записано. Но всегда удобно иметь функции записи и чтения пар переменная-значение. Их можно применять тысячи раз, имея такие функции в резидентной библиотеке. При этом возможно работать и с данными, записанными другими программами, это важнее. Если сегодня это и не надо, завтра понадобится. Можно и xml использовать. У меня есть функции (ru-xml-storage-read-string xml_name relative_path attrib_name default) и (ru-xml-storage-write-string xml_name relative_path attrib_name value). Тоже очень удобно, даже к БД в формате XML можно запрос делать. |
|||
|
||||
возможно кто-то и следует "моде", но есть и такие, кто способен анализировать информацию и принимать решение в пользу XML на основе вполне аргументированных причин (и таких людей не мало), понимая преимущества xml над ini (и умея ими пользоваться). Правда для этого нужно разбираться в XML немного больше, чем просто уметь писать тэги.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: |
||||
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381
|
Цитата:
|
|||
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,840
|
В моем представлении ini может удобней ну пожалуй когда пишешь ядро загрузки - чтоб из ассемблера парсинг написать (формат проще), чтоб он какой-нибудь конфигурационный файл посмторел, - когда библиотек нет, да коду будет поменьше. А в остальном это как-то врядли - по меньшей мере так-же - может быть обратный случай - когда с применением соотвествующий библиотек (или odbc драйверов) к xml на sql'е обратиться удобней иль как Вы сами указали из него dataset настроить. А для "тупого" получения списка пар ключ-значение - с использованием библиотек - по моему абсолютно по барабану.
з.ы. ну если только под словом "удобней" имееться в виду - уже через ini сделанно - и чего его менять - работает же.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
|
||||
Как правило, объёмы данных, хранимых мною в XML не превышают нескольких тысяч записей. Тормозов в работе не наблюдаю (и в MSXML в т.ч.). Для очень больших объёмов лучше использовать СУБД, и не важно, используется ли MSXML, XmlLite или др. Религия тут не при чём, тут нужно просто голову включать и смотреть, в какой ситуации что целесообразней использовать (при этом не забывая заглядывать на пару шагов вперёд).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: Последний раз редактировалось hwd, 27.05.2013 в 14:03. |
||||
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381
|
Цитата:
Тест 1. Файл размером 10 МБ. MSXML: 756% Xerces XML: 600% ADOM XML: 549% NativeXML: 193% JanXML: 100% Тест 2. Файл размером 5 Кб. MSXML: 2000 % ECXML: 300 % Native XML: 200 % MVRB XML: 200 % JANXML: 100 % Тест 3. Файл размером 1,75 МБ. MSXML: 820 % Native XML: 515 % MVRB XML: 285 % JAN XML: 100 % Про всякие глюки (46 официальных версий MSXML) уже и не говорю. |
|||
|
||||
@ShaggyDoc,
В минутах\секундах оно было бы более понятно. Проценты в данном случае - это некоторый аналог сферического коня в вакууме: вроде какие-то цифры показаны, а как это проецируется по времени (разброс) - не понятно. Кроме того, под разные технологии ваш код может быть написан по разному: например хорошо написан под Delphi, но не очень хорошо под .NET. Это нужно смотреть конкретные данные и конкретный код. UPD Если реально есть желание, то можно выложить в общий доступ некоторые XML файлы данных, подлежащих обработке и оговорить набор операций, которые необходимо выполнить. Затем, написав разные варианты решения, выложить их исходный и машинный код, дабы каждый мог ознакомиться с исходниками и запустив их на своей машинке, сравнить скорость обработки. Например, на том же .NET работу с XML можно выполнять с использованием такой старой технологии как DOM, либо использовать LINQ to XML. Кроме того, можно воспользоваться распараллеливанием вычислений (PLINQ), что даст прирост скорости на многопроцессорных машинках. Т.о., на данный момент времени, трактовать ваши результаты, не видя ваших данных и исходников - весьма сомнительное (в плане непредвзятости) занятие.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: Последний раз редактировалось hwd, 27.05.2013 в 18:58. |
||||
|
||||
А я вообще не понимаю всех этих городушек. Объявляешь в лиспе список нужных переменных и печатаешь их себе из лиспа когда хочешь и куда хочешь.
|
||||
|
||||
Регистрация: 26.12.2013
Сообщений: 284
|
Спортивный интерес просто.
Я получил нужный результат так: 1. сохранил список (atoms-family 1) до программы 2. отработал программу 3. сохранил список (atoms-family 1) после программы 4. (member)- ом сравнивал/печатал на экран отличия ИТОГО: пользовательские переменные есть, тип и содержимое (кроме функций) получить нет проблем. И тут я подумал: а можно ли содержимое функций получить? думаю, что нет. |
|||
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как записать данные в файл, находящийся на удалённом компьютере? | 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 |