Реклама i
Стань нашим партнером - зарабатывай с нами!
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Передача параметров процедуре на LISP

Передача параметров процедуре на LISP

Ответ
Поиск в этой теме
Непрочитано 19.05.2010, 13:04
Передача параметров процедуре на LISP
Player
 
Регистрация: 10.08.2009
Сообщений: 5

Подскажите, существуют старые процедуры написанные на LISP. Суть их в следующем: они принимают параметры, и на основе введенных параметров вычерчиваются определенные соединительные детали трубопроводов (тройники, отводы и т.д.).

Параметры вводятся пользователем с клавиатуры в диалоговом режиме.

Вопрос такой: можно как-то по-другому передать эти параметры в лисповскую процедуру? Можно ли на ЛИСПе разобрать содержимое буфера обмена (например, передать в нём параметры текстом с разделителями)? Может ещё что-то предложите?

Спасибо
Просмотров: 10572
 
Непрочитано 20.05.2010, 07:59
#21
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Ну, началось...
if функция, так как возвращает значение
Код:
[Выделить все]
(setq val (if (zerop y) 0 1))
...
Код:
[Выделить все]
(type (eval 'if))
А так вроде как процедура, подпрограмма
gomer вне форума  
 
Автор темы   Непрочитано 20.05.2010, 08:42
#22
Player


 
Регистрация: 10.08.2009
Сообщений: 5


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Не совсем так. Понадобится переписать СОМ-сервер так, чтобы по завершении диалогового окна он еще не уничтожался и получал некие значения предопределенных свойств.
COM сервер это Автокад.
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Возможен. Но я бы не делал на него ставку (бывают ситуации, когда применение SendCommand недопустимо).
Как реализовать?
И какие это ситуации?
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
ИМХО: зачем использовать файловые операции или работу с реестром, когда можно попытаться обойтись без нее?
Я планировал использовать буфер обмена, если не получится вариант с подсовыванием параметров в работающую LISPовскую процедуру.

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Как я понял, диалог как раз реализован на "нормальном" языке типа C++ / C# / Vb.NET / Delphi etc, и посмотреть его структуру уже шансов маловато...
"Диалог" реализован на C#. Посмотреть и изменить его можно так как это моя прога.

Цитата:
Сообщение от Capiton Посмотреть сообщение
Часто программы написаные на C++ / C# / Vb.NET / Delphi и любых других языках хранят данные в отдельном легко просматриваемом файле (группе файлов), к которому и обращаются. Программисты не запихивают его внутрь, по разным причинам(может, чтобы пользователь мог легко редактировать или еще почему-то) Про такой файл я говорил.
Данные хранятся в БД MS SQL. Напрямую обращаться к ней из процедур на Лиспе не вариант. Прийдется полностью дублировать функционал уже написанной проги.

Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
И никто не сказал, что в LISP нет вообще никаких "процедур" - только функции. Функциям передаются аргументы. А передать аргументы можно множеством способов.
Я с лиспом столкнулся первый раз.
Под ф-цией понимаю процедуру которая возвращает значение, процедура соотв не возвращет ничего.
Player вне форума  
 
Непрочитано 20.05.2010, 10:31
#23
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


Цитата:
Сообщение от Player Посмотреть сообщение
Как реализовать?
Ну я примерный код показал... SendCommand
Цитата:
Сообщение от Player Посмотреть сообщение
И какие это ситуации?
Ну, например, работа с неактивным документом. По-моему, бывают проблемы, если окно AutoCAD невидимо. Или что-то такого типа (не проверял, точно не скажу).
Цитата:
Сообщение от Player Посмотреть сообщение
"Диалог" реализован на C#. Посмотреть и изменить его можно так как это моя прога.
Так, может, из него сделать .NET-сборку, подгружаемую в AutoCAD? Масса вещей станут доступными
Цитата:
Сообщение от Player Посмотреть сообщение
Данные хранятся в БД MS SQL. Напрямую обращаться к ней из процедур на Лиспе не вариант.
Ну, вообще-то вариант, если работать через ADO Но это если рассматривать чисто технические вопросы.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.05.2010, 11:05
#24
Vov.Ka


 
Регистрация: 21.07.2008
Луцьк
Сообщений: 179


Дима_, мой пример написан лишь для частного случая, чтобы продемонстрировать возможность написания функции аналогичной if. Более общий вариант написал Алексей (хотя лямбду можно и убрать).
Я не совсем понимаю причем здесь парсинг и как он влияет на определение функция/не функция.
Vov.Ka вне форума  
 
Непрочитано 20.05.2010, 13:09
#25
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Если ты уберешь лямбду функция не будет работать (будет но с ошибкой) - то есть если используеться специальная форма if то
Код:
[Выделить все]
((lambda (x) (if (zerop x) "так нельзя" (/ 1.0 x))) 0)
являеться вполне рабочим кодом, то есть при указании любого числа он даст его обратную дробь, а при нуле выдаст - так нельзя. Попробуй подставь в это выражение свою функцию xif - вылетит по ошибке (потому что вначале поделит 1 на 0) - функция вначале обработает ВСЕ аргументы, а специальная форма (оператор) нет - он действует по иному - заданному его форматом алгоритму.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 20.05.2010, 13:51
#26
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,405
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Дима_ Посмотреть сообщение
функция вначале обработает ВСЕ аргументы, а специальная форма (оператор) нет - он действует по иному - заданному его форматом алгоритму.
Где написано, что любая функция обрабатывает все аргументы до вызова функции? Честно говоря спор совершенно бессмысленный. Назвать можно как угодно, например, "функция с особенным поведением". Операторы не возвращают значений в отличие от (if) (or) (and) и т.д.
Александр Ривилис вне форума  
 
Непрочитано 20.05.2010, 14:18
#27
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
"функция с особенным поведением"
Я про это и говорю - и штатными средствами автолиспа ее никак не создашь - в отличие от функций.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 20.05.2010, 15:05
#28
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,405
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Дима_ Посмотреть сообщение
штатными средствами автолиспа ее никак не создашь - в отличие от функций
Штатными средствами Autolisp не только такие функции нельзя создать, но и многие другие - например, никакие функции с переменным числом аргументов (на ObjectARX - можно). Так что можно классифицировать функции на "встроенные" и "не встроенные". "Встроенные" могут иметь (и имеют) иную логику поведения.
Александр Ривилис вне форума  
 
Непрочитано 20.05.2010, 15:29
#29
VH_


 
Регистрация: 20.05.2010
Сообщений: 26


Здравствуйте, уважаемые участники форума.
Вы, Дима_, вероятно, лукавите.
Язык LISP (как «родовое» понятие) владеет мощным средством, которое называется МАКРОСЫ (macros). Этот механизм позволяет «на лету» определять новые (или переопределять существующие) конструкции языка - по сути дела, создавать собственные <специализированные> языки.
(В языках с "операторами" этого и в помине нет.)
Особенность макро (в отличие от функции) в том, что его аргументы при вызове не вычисляются. Вторая важная особенность в том, что вызов макро выполняется в два этапа: макрорасширение, затем вычисление.
Так что в «обычном» LISPе определение (if) выглядит <например> так (из книги Хювёнен-Сеппянен "Мир Лиспа" т.1):
Код:
[Выделить все]
(defmacro IF (condition p q)
 (backquote
  (cond
   ((comma condition) (comma p))
   (T (comma q)))))
или короче
Код:
[Выделить все]
(defmacro IF (condition p q)
 `(cond (,condition ,p) (T ,q)))
Диалект AutoLISP как подмножество/надмножество диалекта XLISP не имеет этого средства, но данное обстоятельство вряд ли можно назвать фатальным для успешной работы в AutoCAD.
VH_ вне форума  
 
Непрочитано 20.05.2010, 16:56
#30
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Во - макрос, тоже вариант - но никак не функция.
p.s. - раньше я почему-то считал что cond - это "обертка" if - в вашем примере наоборот.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 20.05.2010, 22:59
#31
Vov.Ka


 
Регистрация: 21.07.2008
Луцьк
Сообщений: 179


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Если ты уберешь лямбду функция не будет работать (будет но с ошибкой) - то есть если используеться специальная форма if то
Код:
[Выделить все]
((lambda (x) (if (zerop x) "так нельзя" (/ 1.0 x))) 0)
являеться вполне рабочим кодом, то есть при указании любого числа он даст его обратную дробь, а при нуле выдаст - так нельзя. Попробуй подставь в это выражение свою функцию xif - вылетит по ошибке (потому что вначале поделит 1 на 0) - функция вначале обработает ВСЕ аргументы, а специальная форма (оператор) нет - он действует по иному - заданному его форматом алгоритму.
xif вылетит, потому, что она является простейшим примером который работает только с атомами.

а теперь о lambd-е и премере Алексея Кулика:
Код:
[Выделить все]
(defun xif (testexpr thenexpr elseexpr)
  (eval	(cond (testexpr thenexpr)
	      (t elseexpr)
	)
  )
)
;;;(xif (= 1 2) '(alert "yes") '(alert "no"))
lamdу убираем, но quote оставляем
Vov.Ka вне форума  
 
Непрочитано 26.08.2019, 22:59
#32
Кондратий Тихонович


 
Регистрация: 06.06.2016
Сообщений: 327


Есть функция:
Код:
[Выделить все]
 (defun c:add$ ( / ss i blk blks def AttObj)
    (and
       (setq ss (ssget '((0 . "INSERT"))))
       (setq i (sslength ss))
       (while (> i 0)
          (setq blk (cdr (assoc 2 (entget (ssname ss (setq i (1- i)))))))
          (if (not (vl-position blk blks))(setq blks (cons blk blks)))
       )
    )
    (foreach blk blks
         (setq def (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) blk))
         (setq AttObj
            (vla-addattribute def
              0.07
               acAttributeModeInvisible
              ""
              (vlax-3D-point 72 84)
              "PRICE"
              "338"
            )
         )
         (vlax-put AttObj 'Alignment acAlignmentmiddle) ;; 4
         (command "_.attsync" "_N" blk)
     )
    (princ)
)
(vl-load-com) (princ)
Как передать ей параметры, чтобы она добавляла в выделенные мной блоки не "PRICE=338", а атрибут, с заданными мной именем и значением?

----- добавлено через ~2 мин. -----
Что я должен написать в командной строке, чтобы добавить "My_atribut=100500"?
Код:
[Выделить все]
 (add$ My_atribut 100500)
?
Кондратий Тихонович вне форума  
 
Непрочитано 27.08.2019, 07:43
| 1 #33
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


Кондратий Тихонович, опять двадцать пять... Функция и команда - далеко не одно и то же. Снова: разница между определениями блока и вхождениями блока все еще покрыта завесой страшной тайны?
Из конца в конец, ты же заявлял, что программируешь больше 30 лет - ну так разберись в коде, это же для тебя несложно.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.08.2019, 18:50
#34
Кондратий Тихонович


 
Регистрация: 06.06.2016
Сообщений: 327


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
разница между определениями блока и вхождениями блока все еще покрыта завесой страшной тайны?
Вы сами это выдумали и сами в это поверили.
Я никогда не говорил, что не понимаю разницы между определением блока и его вхождениями на чертеже.


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Из конца в конец, ты же заявлял, что программируешь больше 30 лет - ну так разберись в коде, это же для тебя несложно.
А вот троллить тут не надо.
Если по теме сказать нечего - лучше промолчите

----- добавлено через 58 сек. -----
Лучше б рассказали, как передавать в команду (или функцию) параметры.
А именно, имя атрибута и значения этого атрибута
Кондратий Тихонович вне форума  
 
Непрочитано 27.08.2019, 20:43
#35
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


Цитата:
Сообщение от Кондратий Тихонович Посмотреть сообщение
Лучше б рассказали, как передавать в команду (или функцию) параметры.
А именно, имя атрибута и значения этого атрибута
что именно вам мешает зайти в инет и почитать про разницу между командой и функцией? Даже русскоязычных сайтов полно. Тогда, может быть, поняли бы - что:
Цитата:
Сообщение от Кондратий Тихонович Посмотреть сообщение
(add$ My_atribut 100500)
будет работать, но если изменить команду на функцию и добавить аргументы. Это первые главы любой книги по лиспу, даже можно сказать - первые страницы, так как относится к основным базовым понятиям лиспа.
Сергей812 вне форума  
 
Непрочитано 28.08.2019, 06:26
#36
Кондратий Тихонович


 
Регистрация: 06.06.2016
Сообщений: 327


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
будет работать, но если изменить команду на функцию и добавить аргументы.
так add$ и есть функция, а My_atribut и 100500 - её аргументы
Кондратий Тихонович вне форума  
 
Непрочитано 28.08.2019, 07:58
#37
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


Кондратий Тихонович, добро пожаловать в тему "Обучите лиспу на примере" и в публикации.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.08.2019, 08:11
#38
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Цитата:
Сообщение от Кондратий Тихонович Посмотреть сообщение
так add$ и есть функция, а My_atribut и 100500 - её аргументы
Ну неужели после 30 лет программирования непонятно, что
"C:add$", объявленная без аргументов и "add$" - совершенно разные вещи?

Префикс "C:" означает, что это особый вид функции - команда. Её можно вызвать с клавиатуры, набрав add$. Но ей нельзя передать аргументы - ни с клавиатуры, ни программно.

Но может быть функция, объявленная как

Код:
[Выделить все]
 (defun add$ (atrib_name atrib_value / ss i blk blks def AttObj)
....
)
Внутри ее и могут быть использованы аргументы atrib_name atrib_value, а при вызове должны быть заданы обязательно, и именно два (возможно nil).

Вот тогда можно вызвать (add$ "Кондратий" "Самый гениальный программист")

Последний раз редактировалось ShaggyDoc, 28.08.2019 в 10:22. Причина: Убрал теги bold из кода
ShaggyDoc вне форума  
 
Непрочитано 29.08.2019, 06:37
#39
Кондратий Тихонович


 
Регистрация: 06.06.2016
Сообщений: 327


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Ну неужели после 30 лет программирования непонятно, что
"C:add$", объявленная без аргументов и "add$" - совершенно разные вещи?
Я не на лиспе программировал
Кондратий Тихонович вне форума  
 
Непрочитано 29.08.2019, 09:39
#40
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Цитата:
Сообщение от Кондратий Тихонович Посмотреть сообщение
Я не на лиспе программировал
А что, в других языках процедуры или функции, отличающиеся "всего одной буковкой в имении" идентичны?

Или их можно вызывать с аргументами, не объявив аргументы в определении?
ShaggyDoc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Передача параметров процедуре на LISP

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
SolidWorks : Обновление таблиц параметров виртуальных деталей MAKSCHUK SolidWorks 10 15.02.2013 13:53
LISP & VBA. Передача данных. Кулик Алексей aka kpblc Готовые программы 8 29.06.2009 22:16
Запуск Lisp команды в новом документе BlackHarp LISP 1 26.03.2009 23:06
загрузка DOS прог через LISP Gaa LISP 15 12.08.2005 19:19