Тема: Как закавычить лисповские круглые скобки в дизель-макросе?

Надо поместить внутрь дизель-выражения, назначенного некой кнопке, следующий лисп-код:

(my_func "my_string")

Проблема в том, что дизель "сходит с ума" от круглых скобок, кавычек и пробелов, так как он считает их частью своего выражения, а не "литералом". Как его обмануть ?
Для определённости, дизель выглядит так:

$M=$(if,$(eq,$(substr,$(getvar,cmdnames),1,4),grip),_move,^C^C_move) 

а вот что я пытался сделать:

$M=$(if,$(eq,$(substr,$(getvar,cmdnames),1,4),grip),[b](alert "Good Day") [/b]_move,^C^C_move) 

Re: Как закавычить лисповские круглые скобки в дизель-макросе?

АУ!

Re: Как закавычить лисповские круглые скобки в дизель-макросе?

Со скобками и пробелами я разобрался после чтения http://www.crlf.de/Dokumente/Diesel/Diesel.html
Их можно просто оставлять как есть (а вот запятые, оказывается, надо закавычивать).
Но сами кавычки!!! Итак, вопрос остаётся открытым: как заставить Дизель сказать (alert "Good Day") ???
Кстати, на той странице написано You can download the complete source code from John Walker's site at www.fourmilab.ch/diesel.

Re: Как закавычить лисповские круглые скобки в дизель-макросе?

А нельзя ли все это написать на Лиспе без Дизеля ?

Re: Как закавычить лисповские круглые скобки в дизель-макросе?

Дело в том, что в Акаде нет события "нажатие кнопки на тулбаре". Зато есть возможность напрямую запрограммировать кнопку, написав "макрос". Так вот мне нужно встроить свою программку в КАЖДУЮ кнопку на каждом тулбаре, НЕ ИЗМЕНИВ при этом первоначальную функциональность. Есть кнопки простые, например ^C^C_line, с ними всё ясно. Самые безнадёжные - это прозрачные команды, пока не знаю, как быть с ними. Ну и вот кнопки с "Дизелями" (как приведённая выше) тоже создают проблемы.

Re: Как закавычить лисповские круглые скобки в дизель-макросе?

Тогда может быть попробовать реакторы ?

Re: Как закавычить лисповские круглые скобки в дизель-макросе?

я же говорю в Акаде нет события "нажатие кнопки на тулбаре". Значит, реакторы, бейсик, ARX - на отдыхе.

Re: Как закавычить лисповские круглые скобки в дизель-макросе?

> Maxim
T
Можно попробовать зацепиться за vlr-command-reactor и vlr-lisp-reactor. Ведь задача- встроиться в КАЖДУЮ кнопку. Например, при начале выполнения макроса установить некий флаг в 1, а реакторе типа :vlr-commandEnded этот флаг проверить и что-то сделать. Разумеется, это только идея.

Re: Как закавычить лисповские круглые скобки в дизель-макросе?

$M=$(if,$(eq,$(substr,$(getvar,cmdnames),1,4),grip),(alert "Good Day") _move,^C^C_move)

Maxim T, а какой смысл ты собирался вложить в это выражение?

Re: Как закавычить лисповские круглые скобки в дизель-макросе?

> zhuravsky
Не подходит, потому что реактор на окончание команды реагирует далеко не на всё, что понаписано в макросе.

> Vova
Это пример, мне надо встроить свой код в каждую кнопку каждого тулбара.

Re: Как закавычить лисповские круглые скобки в дизель-макросе?

На уровне идеи: в кнопочном макросе сначала запоминать строку с нужным содержанием в переменной USERSx, а далее вызывать Лисп-функцию, определенную в отдельном, уже загруженном (или загружаемом с этой же кнопки) файле. В Лисп-функции нужно прочитать переменную USERSx и использовать это значение....

Re: Как закавычить лисповские круглые скобки в дизель-макросе?

Я понял так что стоит задача скомбинировать DIESEL и LISP. Пример подобран неудачный, потому что данный макрос работает в зависимости от загрипсованности об-ектов только в некоторых частных случаях, когда можно сделать множественное копирование, схватив, например, отрезок или окружность за центральный грип. И то слово grip надо писать в верхнем регистре. Это правильно заметил Maxim T из соседней темы https://www.caduser.ru/forum/topic13111.html . Но даже в другом, работающем примере примере зачем мешать языки? Если стоит задача получить Allert, в зависимости от того, что выдаст функция "IF" то все это можно сделать на лиспе, а если задача заключается в том, КАК ввести лисп в дизель-выражение, тогда я ответ не знаю.

Re: Как закавычить лисповские круглые скобки в дизель-макросе?

Если нельзя зацепиться за vlr-command-reactor, то может быть поможет vlr-acdb-reactor и vlr-objectModified ? В конце концов действие ведь должно происходить при модификации примитивов.

Re: Как закавычить лисповские круглые скобки в дизель-макросе?

> Vova
Да, именно "как ввести лисп в дизель-выражение", и странно, что вы этого не знаете.
>all
Таки выкрутился.

(defun c:myalert ( / myparameter)
  (setq myparameter (getstring)) ;-- получаем строковый параметр из комстроки
  ;--
  ;-- дальше делаем что нам надо
  ;--
  (princ) ;-- это обязательно пишем в конце, чтобы наша команда myalert ничего не возвращала в комстроку
)

Теперь в макросе пишем:

$M=$(if,$(eq,$(substr,$(getvar,cmdnames),1,4),GRIP),[b]'myalert;Good_Day;[/b]_move,^C^C_move)

Как видим, новоиспечённая команда myalert вызывается в прозрачном режиме (с апострофом) перед "основной" командой. Единственная проблемка - строковый параметр не должен содержать пробел(ы), но для моей проги это и не страшно, а если будет страшно, можно закодировать символ пробела какой-нибудь абракадаброй вроде <space>.
Макросы, содержащие прозрачные команды, тоже успешно "лечатся" таким способом.
COOL!!!
как следует из написанного здесь https://www.caduser.ru/forum/topic13111.html, в данном макросе надо писать GRIP, а не grip, иначе первая ветка if'а никогда не сработает.

Re: Как закавычить лисповские круглые скобки в дизель-макросе?

И все-таки я не понял, что должно происходить. Разложи, пож, по-полочкам.

Re: Как закавычить лисповские круглые скобки в дизель-макросе?

> Vova
По полочкам. Мне надо регистрировать каждое нажатие каждой кнопки каждого тулбара, при этом знать, какая именно кнопка и на каком тулбаре была нажата. В акаде НЕТ события "нажатие кнопки на тулбаре". Зато есть возможность редактировать макросы, назначенные кнопкам. Дальше всё ясно. Я определяю на Лиспе команду (см. примечание 1), допустим, по имени MYALERT, которая требует ввести с консоли строку (см. листинг). Другой программой (можно на Лиспе, можно на Бейсике) я один раз за сеанс (см. примечание 2) обхожу ВСЕ тулбары и, залезая в каждую кнопку, модифицирую её макрос так, чтобы вставить вызов моей команды MYALERT и не испортить при этом исходную функциональность кнопки (в этом и состоял вопрос). Кроме того, команде MYALERT передаётся строковый параметр (которого она так жаждет:), который представляет собой не что иное, как уникальную сигнатуру, соответствующую данной кнопке на данном тулбаре. Можно просто склеить имя тулбара и имя кнопки, уникальность сигнатуры будет обеспечена.
Таким образом, когда юзер нажимает любую кнопку (даже не обязательно фирменную!), моя основная программа узнаёт об этом факте (а также уникальную сигнатуру кнопки, кои сигнатуры ВСЕ хранятся у неё в ассоциативном словаре) от команды MYALERT, вызов которой (с параметром-сигнатурой) торчит в каждой кнопке.
Примечания.
1. Если возникли траблы с "прозрачностью" лисповской команды, попробуйте определить её не через (defun C:...), а через (vla-add-cmd).
2. После команды MENULOAD надо заново проверять и, если надо, модифицировать все макросы, потому что состав тулбаров мог поменяться.

Re: Как закавычить лисповские круглые скобки в дизель-макросе?

Не совсем понятно, зачем оно надо. Ну раз уж надо - то можно допиывать к каждой кнопке вызов Лисп-функции с аргументом. Только аргумент должен быть числом. Его можно где то запоминать при первоначальном обходе кнопок.

Re: Как закавычить лисповские круглые скобки в дизель-макросе?

> VK
Непонятно, почему "аргумент должен быть числом". А моим способом можно и строки, с любыми символами (по типу <space>, <#032> и т.п.). И вообще, "вызов Лисп-функции с аргументом", как вы предлагаете, выглядит так:

(myalert "my_string")

и Дизелем не переваривается (см. начало ветки).
А вот если командой, к чему я и пришёл в конце концов, то это будет так:

'myalert;my_string;

И дизель будет доволен (т.к. нет ни пробелов, ни кавычек), и Акад обманут (из-за апострофа в начале).

Re: Как закавычить лисповские круглые скобки в дизель-макросе?

> Maxim T
В общем то да. За исключением, что апостроф тут немножко ни при чем. Он нужен как раз именно в этой ситуации, когда примитивы "загрипсованы", а во многих случаях можно и без него (когда макрос начинается с ^C^C) По своей натуре Дизель тупо передает символы из выражения как будто бы в командную строку. Соответственно, передав последовательность 'myalert; (не важно, с апострофом или без него) запускается Лисп, который выдает запрос на ввод строки. А дальше как раз идет строка.
Кстати, строку можно передать и с пробелами. Чуть поправленый Ваш код:

(defun c:myalert ( / myparameter)
  (setq myparameter (getstring [b]t[/b])) ;-- получаем строковый параметр из комстроки
  (alert myparameter)
  (princ) ;-- это обязательно пишем в конце, чтобы наша команда myalert ничего не возвращала в комстроку
)

Точка с запятой так и играют роль Enter'а