LINUX.ORG.RU

Как узнать имя файла исходника

 


0

1

Есть проблема: если файл загружается через load, у нас есть *load-truename* . Если скомпилирован, то *compile-truename*? А если мы его загружаем через EMACS с помощью eval buffer? Есть ли где-то функция, которая в любом случае вернёт правильный результат, т.е. имя исходника?

★★★★★

Последнее исправление: den73 (всего исправлений: 1)

А если мы его загружаем через EMACS с помощью eval buffer?

Также как и при загрузке через (eval '(defun ...)). Никакого имени файла не будет.

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

А что является именем исходника для буфера емакса? Имя буфера?

monk ★★★★★
()
Ответ на: комментарий от monk

Буфер емакса бывает связан с буфером. Но достаточно хотя бы ошибки в этом случае, чтобы знать, что мы пошли неверной дорогой.

den73 ★★★★★
() автор топика

Мне кажется, что никак. Я уточню: имеется в виду функция slime-eval-buffer? Если она, то она в свою очередь вызывает slime-eval-region, которая работает уже над областью, а не буфером. slime-eval-region в cвою очередь из этой области (region) делает тупую обезличенную строчку и передает ее в swank. Таким образом, CL просто не знает, откуда эта строчка прибежала. Не задуман как-то тут обратный reference на буфер Emacs.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 2)
Ответ на: комментарий от Zubok

Мммм. Печально. Ладно, у меня в clcon всё равно нет команды eval-buffer, а работа только с файлами.

Помнится, когда-то в лиспворксе я смотрел на поток и в зависимости от его класса соображал, где нахожусь. Может быть, и здесь такое возможно.

Ну если это вынести за скобки, то хватит ли

#.(or *compile-file-truename* *load-truename*)
?

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

Ну, я как бы не совсем осведомлен, зачем это понадобилось. Раз Emacs что-то из открытого файла отправляет на eval в CL, то он-то сам знает название файла, из которого регион отправляются функции. А тебе надо, чтобы об этом узнал CL, так? А раз так, то в хуках slime-transcript-start-hook/slime-transcript-stop-hook в slime в какую-нибудь (свою) переменную через swank записать в CL название файла, из которого идет eval.

Или же изменить поведение slime-eval-buffer, что тоже вариант.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 3)
Ответ на: комментарий от Zubok

Дело тут вовсе не в EMACS. Просто я хочу, чтобы мою программулю можно было кинуть в любое место и дальше она сама поняла, где находится, и действовала соответственно. Такая задача многократно возникает, как для большой программы, так и для её отдельных частей.

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

Это не обязательно может быть Емакс, может быть и другая IDE, скажем, лиспворкс или аллегро. У каждой из них (наверное) есть подобная «обманная» команда.

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

Ну, если честно, я совсем не понял задачи.

Это не обязательно может быть Емакс, может быть и другая IDE, скажем, лиспворкс или аллегро.

У каждой IDE свой интерфейс к CL. Emacs использует swank со стороны CL. Значит, если ты из своей IDE передаешь строчку, то через swank ты можешь сообщить, откуда эта строчка идет. Универсального способа нет.

Когда же CL сам своими средствами загружает и компилирует файлы, то он об этом знает, что это за файлы, так как сам это делает.

А через IDE же передается все что угодно: отдельные формы, кусочки файлов, целые файлы. И это уже твое дело, как ты сообщишь CL, откуда ты это передаешь. В случае slime механизм есть - это swank. Передаешь кусок на eval и какую-нибудь свою переменную типа *eval-truename* выставляешь в название файла, откуда IDE передаваемый кусочек вытащил. Как eval закончился, сбрасываешь в nil.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 2)
Ответ на: комментарий от Zubok

Вообще-то можно на это забить :) Думаю, мой последний вариант похож на правду. Если не похож - это всплывёт со временем. Так что отвечаю только из уважения к собеседнику.

Задачу ты с какого места не понял? Само желание знать, где находится текущий файл исходника, вопросов больше не вызывает?

Вопрос про IDE состоит в не том, что я хочу сделать вариант, который всегда работает. Я хочу всего лишь отличить работающее от неработающего. Например, если я в однопоточном лиспе компилировал файл, упал в отладчик, сделал внутри, скажем, macroexpand в новый буфер емакса и вызвал команду eval-buffer, то *compile-file-truename* может оказаться связан в тот файл, который я компилировал. В этом случае мой кусочек кода обманет. Но это угроза, которой, в общем-то можно пренебречь.

den73 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.