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

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

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

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

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

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

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

Спасибо
Просмотров: 10996
 
Непрочитано 19.05.2010, 13:08
#2
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Да, можно. В том числе с буфером обмена, текстом итд...
Елпанов Евгений вне форума  
 
Непрочитано 19.05.2010, 13:20
#3
Capiton


 
Регистрация: 11.03.2009
Тюмень
Сообщений: 109
<phrase 1=


Не силен в Тройниках и отводах, но если суть проблеммы такова:
есть набор стандартных деталей для каждой из которых существует рряд параметров и Автокад каждый раз запрашивает в коммандной строке все эти параметры по очереди (а их может быть много), то всё решается диалоговым окном "помнящим" пераметры последней или наиболее распостраненной детали каждого типа из набора.
Если задача другая, то и решений может быть несколько в зависимости от типа задачи: забирать данные из Exel или Open Office calc, через временные файлы и проч.
Capiton вне форума  
 
Непрочитано 19.05.2010, 13:51
#4
Дима_

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


По сути параметры можно задать практически любым мыслимым способом - через файл, через COM (а там и ADO - то есть практически любая БД и мс-офис), виндовый реестр, при желании можно и с устройства снять (возможно придеться какой-нибудь COM драйверок написать). Так-же есть пара способов (стандартный и не очень) создания диалоговых окон - вобщем лисп могуч.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 19.05.2010, 15:35
#5
Player


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


Capiton
почти правильно - единственное, но, диалоговое окно уже реализовано - это отдельная программа работающая с базой оборудования. Пользователь выбирает в этой проге интересующее его оборудование которое он хочет добавить на чертеж. Моя задача как-то передать параметры для вычерчивания и запустить процедуру на LISP которая, основываясь на переданных параметрах, начертит соотв. деталь.

Всем спасибо за ответы
Player вне форума  
 
Непрочитано 19.05.2010, 15:49
#6
Дима_

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


Так в чем проблема-то? Процедуру запустить не можешь или нужна программа которая рисовать будет?
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 19.05.2010, 15:51
#7
Кулик Алексей aka kpblc
Moderator

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


Есть три варианта:
  • реализовать это диалоговое окно как СОМ-сервер и работать с ним из-под lisp'а.
  • использовать уже в самом диалоге нечто типа AcadApplication.ActiveDocument.SendCommand
  • использовать из-под диалога обращение к объектной модели AutoCAD'a (то есть уже AutoCAD использовать как СОМ-сервер).
Сугубо ИМХО, как всегда.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 19.05.2010, 16:14
#8
Player


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


Дима_ проблема была в том, что я не знал можно ли передавать параметры в процедуры LISP извне акада. Сейчас все прояснилось.

Кулик Алексей aka kpblc вот-вот, правда недопонял чем отличаются пункты 2 и 3.

Я планирую подключатся через позднее связывание к АвотоКАДу и запускать ЛИСПовскую ф-цию, которая считает переданные параметры из файла/реестра/буфера_обмена и вычертит по ним соотв. деталь.

Второй вариант, я из проги запускаю ЛИСПовскую ф-цию и помере её запросов параметров автоматически подкидываю их (из своей программы).

Второй вариант гораздо предпочтительнее так как не потребует изменений существующих ф-ций вычерчивания на Лиспе. Возможен ли он в принципе?

В случае первого варианта ф-ции на лиспе прийдется переписать, чтоб они брали параметры не от пользователя, а, например, из буфера обмена.
Player вне форума  
 
Непрочитано 19.05.2010, 16:17
#9
Кулик Алексей aka kpblc
Moderator

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


В п.2 фактически запускается лисп0функция. В п.3 никаких лисп-функций не запускается, и вся работа выполняется через соответствующие методы и свойства примитивов (и не только примитивов )

P.S.
Цитата:
В случае первого варианта ф-ции на лиспе прийдется переписать, чтоб они брали параметры не от пользователя, а, например, из буфера обмена.
Не совсем так. Понадобится переписать СОМ-сервер так, чтобы по завершении диалогового окна он еще не уничтожался и получал некие значения предопределенных свойств.
Цитата:
Второй вариант гораздо предпочтительнее так как не потребует изменений существующих ф-ций вычерчивания на Лиспе. Возможен ли он в принципе?
Возможен. Но я бы не делал на него ставку (бывают ситуации, когда применение SendCommand недопустимо).
ИМХО: зачем использовать файловые операции или работу с реестром, когда можно попытаться обойтись без нее?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.05.2010, 16:19
#10
Capiton


 
Регистрация: 11.03.2009
Тюмень
Сообщений: 109
<phrase 1=


Есть еще способ. Он не совсем честный и возможно использовать его не всегда, но зато не надо лезть в СОМ. Данные, которые использует программа с диалогом часто бывают в файле легко и наглядно открываемом блокнотом. Посмотреть структуру - "нарисовать" своё диалоговое окно - написать простой LISP - всё готово. Не собираетесь распостранять получившуюся программу- Вы кристально чисты.
Capiton вне форума  
 
Непрочитано 19.05.2010, 16:21
#11
Кулик Алексей aka kpblc
Moderator

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


Как я понял, диалог как раз реализован на "нормальном" языке типа C++ / C# / Vb.NET / Delphi etc, и посмотреть его структуру уже шансов маловато...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.05.2010, 16:29
#12
Capiton


 
Регистрация: 11.03.2009
Тюмень
Сообщений: 109
<phrase 1=


Часто программы написаные на C++ / C# / Vb.NET / Delphi и любых других языках хранят данные в отдельном легко просматриваемом файле (группе файлов), к которому и обращаются. Программисты не запихивают его внутрь, по разным причинам(может, чтобы пользователь мог легко редактировать или еще почему-то) Про такой файл я говорил.
Capiton вне форума  
 
Непрочитано 19.05.2010, 17:57
#13
ShaggyDoc

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


И никто не сказал, что в LISP нет вообще никаких "процедур" - только функции. Функциям передаются аргументы. А передать аргументы можно множеством способов.

В том числе из файла, реестра, через память. С диалоговым окном или без. Вот буфер обмена - пожалуй наихудший вариант.
ShaggyDoc вне форума  
 
Непрочитано 19.05.2010, 18:20
#14
gomer

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


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
в LISP нет вообще никаких "процедур" - только функции. Функциям передаются аргументы. А передать аргументы можно множеством способов.

В том числе из файла, реестра, через память. С диалоговым окном или без. Вот буфер обмена - пожалуй наихудший вариант
С англицкого routine переводится как процедура часто этот термин употребляется для обозначения комманд (с:ххх) функций...

И вообще: архив в студию, тогда можно о чем-либо говорить...
gomer вне форума  
 
Непрочитано 19.05.2010, 20:37
#15
Дима_

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


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
И никто не сказал, что в LISP нет вообще никаких "процедур" - только функции.
ну допустим не только - например if, or, and - совсем не являются функциями - названиям им куча и специальные формы, и операторы и процедуры кто как переведет да и в зависимости от диалекта лиспа. Но по сути они никак не функции.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 19.05.2010, 22:59
#16
Александр Ривилис

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


Цитата:
Сообщение от Дима_ Посмотреть сообщение
ну допустим не только - например if, or, and - совсем не являются функциями - названиям им куча и специальные формы, и операторы и процедуры кто как переведет да и в зависимости от диалекта лиспа. Но по сути они никак не функции.
Это в других языках они операторы - в LISP'е только функции. Именно в этом принципиальное отличие этого языка от большинства других. Ну а как их переводят переводчики на суть не влияет.
Александр Ривилис вне форума  
 
Непрочитано 19.05.2010, 23:24
#17
Дима_

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


Оп оп оп? А нука - попробуйте написать (на лиспе разумеется), ну например, подобие функции if, причем даже с возможностью использовать внутри стандартную if - назовем например AR-if (Александр Ривлис) - и выложите код - а там посмотри что такое оригинальная if - функция или нет.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 19.05.2010, 23:48
#18
Vov.Ka


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


Код:
[Выделить все]
(defun xif (testexpr thenexpr elseexpr)
  (cond	(testexpr thenexpr)
	(t elseexpr)
  )
)
;;;(xif (= 1 2) "yes" "no")
Vov.Ka вне форума  
 
Непрочитано 19.05.2010, 23:53
#19
Кулик Алексей aka kpblc
Moderator

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


Ну, полностью от if избавиться не удалось, но в качестве "разминки":
Код:
[Выделить все]
(defun ar-if (condition function-yes function-not)
  (cond
    (condition
     (eval function-yes)
     )
    (t (eval function-not))
    ) ;_ end of cond
  ) ;_ end of defun
Пример:
Код:
[Выделить все]
_$ (ar-if (equal 1 1) '((LAMBDA() princ "\nYes")) nil)
"\nYes"
_$ (ar-if (equal 1 2) '((LAMBDA() princ "\nYes")) '((LAMBDA() princ "\nNo")))
"\nNo"
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.05.2010, 07:44
#20
Дима_

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


То vovka вся беда в твоем if что перед тем как дойдет дело до выполнения функции все ТРИ аргумента будут уже вычесленны, как впрочем и у любой функции - вначале вычисляються аргументы. Крыс верно написал - именно так она и реализованна на самом деле, с той лишь разницей что в функцию добален парсинг - что выполнять а что нет - посему это никак не функция. В and и or то же самое - операнды выполняются последавательно (а не вычисленны все до начала функции).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 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
С.-Петербург
Сообщений: 40,406


Цитата:
Сообщение от 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,839


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

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


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

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


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

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью 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,839


Во - макрос, тоже вариант - но никак не функция.
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
С.-Петербург
Сообщений: 40,406


Кондратий Тихонович, опять двадцать пять... Функция и команда - далеко не одно и то же. Снова: разница между определениями блока и вхождениями блока все еще покрыта завесой страшной тайны?
Из конца в конец, ты же заявлял, что программируешь больше 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,499


Цитата:
Сообщение от Кондратий Тихонович Посмотреть сообщение
Лучше б рассказали, как передавать в команду (или функцию) параметры.
А именно, имя атрибута и значения этого атрибута
что именно вам мешает зайти в инет и почитать про разницу между командой и функцией? Даже русскоязычных сайтов полно. Тогда, может быть, поняли бы - что:
Цитата:
Сообщение от Кондратий Тихонович Посмотреть сообщение
(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
С.-Петербург
Сообщений: 40,406


Кондратий Тихонович, добро пожаловать в тему "Обучите лиспу на примере" и в публикации.
__________________
Моя библиотека 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,372


Цитата:
Сообщение от Кондратий Тихонович Посмотреть сообщение
так 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,372


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

Или их можно вызывать с аргументами, не объявив аргументы в определении?
ShaggyDoc вне форума  
 
Непрочитано 02.09.2019, 13:52
#41
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,809


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

Код:
[Выделить все]
 (defun c:prn_scr (string / ) (princ string) (princ))
Код:
[Выделить все]
 (c:prn_scr "Shaggy_Dog isn't right")
koMon вне форума  
 
Непрочитано 02.09.2019, 14:10
#42
Сергей812


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


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Её можно вызвать с клавиатуры, набрав add$. Но ей нельзя передать аргументы - ни с клавиатуры, ни программно.
Попробуйте вызвать свой вариант без скобок:
Цитата:
Сообщение от koMon Посмотреть сообщение
Код:
[Выделить все]
 (c:prn_scr "Shaggy_Dog isn't right")
и увидите, что ваше команда командой не является: без аргумента ругается - "ошибка: слишком мало аргументов". А если указать с аргументом - "Неизвестная команда.."
Сергей812 вне форума  
 
Непрочитано 02.09.2019, 14:40
#43
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,809


я же написал технически и потом зачем мне без скобок запускать? я привёл пример команды и пример её нестандартного запуска с аргументом, разве нет? или определённая выше команда уже и не команда?
koMon вне форума  
 
Непрочитано 02.09.2019, 15:00
#44
Сергей812


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


Цитата:
Сообщение от koMon Посмотреть сообщение
я же написал технически и потом зачем мне без скобок запускать? я привёл пример команды и пример её нестандартного запуска с аргументом, разве нет?
Вы привели пример функции с синтаксисом команды) Что интерпретатор лиспа не ругнулся на это - ну это не сильно удивляет)

Команда должна запускаться без скобок, внутри себя может запрашивать дополнительные сведения, при этом пробелы эквиваленты вводу. Т.е. любой аргумент в комстроке будет считаться следующей командой, если запущенная команда сама не заберет данные из комстроки. А если она забирает данные - то тогда не аргументы, а локальные/глобальные переменные будут при необходимости.
Сергей812 вне форума  
 
Непрочитано 02.09.2019, 15:53
#45
ShaggyDoc

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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Вы привели пример функции с синтаксисом команды)
Правильно. И это даже не синтаксис команды, а просто имя функции, такое же, как могло бы быть у "команды". В Lisp вообще можно всякие интересные имена применять, чем многие и пользуются. Еще и анонимные есть...
ShaggyDoc вне форума  
 
Непрочитано 03.09.2019, 11:56
#46
Александр Ривилис

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


Цитата:
Сообщение от koMon Посмотреть сообщение
вообще-то технически это возможно.
Чтобы это работало и как реальная команда и как функция, её нужно создавать при помощи ObjectARX или AutoCAD .NET API.
Александр Ривилис вне форума  
 
Непрочитано 03.09.2019, 12:10
#47
Сергей812


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


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Чтобы это работало и как реальная команда и как функция, её нужно создавать при помощи ObjectARX или AutoCAD .NET API.
Вроде в .Net тоже разделение: атрибуты CommandMethod и LispFunction для объявления команды и лиспоподобной функции.
Сергей812 вне форума  
 
Непрочитано 03.09.2019, 12:19
#48
Александр Ривилис

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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Вроде в .Net тоже разделение: атрибуты CommandMethod и LispFunction для объявления команды и лиспоподобной функции.
LispFunction может быть и без параметров, но с именем C:XXX
Смысл в том что в lisp нельзя сделать функцию с переменным числом аргументов, а в ObjectARX/AutoCAD .NET API можно.
Александр Ривилис вне форума  
 
Непрочитано 03.09.2019, 12:38
#49
Сергей812


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


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
что в lisp нельзя сделать функцию с переменным числом аргументов
тут форумчане развлекаются с этим)
Сергей812 вне форума  
 
Непрочитано 03.09.2019, 12:49
#50
Александр Ривилис

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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
тут форумчане развлекаются с этим)
Это лишь развлечение. Попробуй создать на lisp функцию C:XXX которую можно было бы использовать и как команду (т.е. с нулевым числом аргументов) и как функцию с числом аргументов > 0.
Александр Ривилис вне форума  
 
Непрочитано 03.09.2019, 13:15
#51
Сергей812


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


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Попробуй создать на lisp функцию C:XXX которую можно было бы использовать и как команду (т.е. с нулевым числом аргументов) и как функцию с числом аргументов > 0.
даже пытаться не буду - хотя бы в силу того, что на .Net пишу - практики на лиспе мало) Да и смысла не вижу - команда и функция - это две разные вещи, каждая под свою область применения. Вызывать из комстроки функцию можно, конечно - но с точки зрения удобства в процессе постоянной работы как то очень сомнительно, имхо.
Сергей812 вне форума  
Ответ
Вернуться   Форум 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