.NET, arx и atoms-family
Есть такая функция в лиспе - atoms-family. По идее должна показывать зарезервированные символы AutoLISP / VisualLISP. Но, кроме заявленного функционала, она может показать пользовательские команды и функции, загруженные в текущий документ.
Но, как всегда, есть нюансы:
- Показываются определенные пользователем команды, только если эти команды написнаны на лиспе. Компилирован он или нет - по идее, без разницы (честно говоря, просто не проверял).
- Если написать на .NET или arx команду, то она не показывается в списке, возвращаемом atoms-family.
- В то же время lisp-функции, написанные на arx, гарантированно показываются в списке.
Можно проверить самостоятельно: загружаем, например, небезысвестный ExplodeAllProxy от А.Ривилиса и смотрим на результат выполнения
1 | (vl-sort (vl-remove-if-not '(LAMBDA(x) (WCMATCH (strcase x) "*EXPL*PROXY*")) (ATOMS-FAMILY 1 )) '<) |
В консоль VLIDE выведется строка вида
1 | ("EXPLODEALLPROXYINBLOCK" "EXPLODEPROXYENTITY") |
И никаких C:EXPLODEALLPROXY или C:REMOVEALLPROXY.
А почему она должна показываться - показывет все символы определенные в лиспе, не зависимо от их содержания - в том числе и те в которых функции - а команды-то в лиспе (если они не в нем написанны) не определенны - (list lambda setq princ member) - вернет соответствующий список, а (list line _line c:line c:_line) вернет естественно 4 nil'а - т.к. в лиспе таких имен нет.
Если честно, я просто надеялся на то, что atoms-family покажет все команды, в том числе и содержащиеся в загруженных arx/dll модулях. На 2009 не показало, и я тихо подозреваю, что и на остальных версиях то же самое будет.