LINUX.ORG.RU

lisp: запуск прог. из bash


0

0

Собственно так:

#! /bin/sh
/usr/bin/sbcl --noinform --core my.core --eval "(progn
(lala) (quit))"

Всё нормально, но, выводится ненужная инфа (варнинги ...)  и
запускаетс только из терминала.

Следующий вариант из manual sbcl:
; Файл test.lisp
#!/usr/local/bin/sbcl --noinform
 (write-line "Hello, World!")
Этот пример работает. Но вот уже с:
#!/usr/local/bin/sbcl --noinform --core my.lisp
Всё. Не работает.

В общем подскажите какие варианты как lisp-проги запускать, чтоб как
обычная (например, C'ишная) из shell'a.
anonymous

apt говорит, что есть следующая штука:

max@triton:~/ > apt-cache show cl-launch
Package: cl-launch
Priority: optional
Section: devel
Installed-Size: 200
Maintainer: Francois-Rene Rideau <fare@tunes.org>
Architecture: all
Version: 1.91-1
Depends: common-lisp-controller (>= 6.6)
Filename: pool/main/c/cl-launch/cl-launch_1.91-1_all.deb
Size: 46578
MD5sum: e6bb87bf879e0215d231d269524d3f79
Description: uniform frontend to running Common Lisp code from the shell
 CL-Launch will allow you to invoke Common Lisp source code from the shell
 command line or from a shell script. It will also allow you to turn your
 Common Lisp source programs into executable shell scripts.
 CL-Launch will automatically detect a supported Common Lisp implementation
 and use adequate invocation options. It can also be configured to fit exactly
 the programmer's desires. Supported implementations are:
     SBCL, CMUCL, GNU CLISP, ECL, OpenMCL, Allegro, GCL.
 (no support for dumping images with systems on ecl or at all on gcl;
 asdf works on gcl 2.7 from package gclcvs, not on gcl 2.6 from package gcl.)
 .
 CL-Launch also offers Common Lisp programs a simple uniform interface to
 invocation parameters (command-line arguments and environment variables) and
 installs a per-user cache for lisp fasl binaries in ~/.cache/lisp-fasl/
 (that is superseded by the common-lisp-controller cache for debian-installed
 implementations and can otherwise be moved or disabled through environment
 variables). CL-Launch may save memory images for fast startup. It can also
 be used as a quick way to evaluate and print simple Lisp forms from the
 command-line without invoking a full-flegded REPL.
 .
  Homepage: http://www.cliki.net/cl-launch

Begemoth ★★★★★
()

Если твоя прога ничего полезного на stderr не пишет, то можно так:

max@triton:~/ > cat foo.sh
#! /bin/sh
/usr/bin/sbcl --noinform --eval "(progn (setq a '(:hello :world)) (princ a) (princ #\Newline) (quit))"
max@triton:~/ > ./foo.sh 2> /dev/null
(HELLO WORLD)

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

max@triton:~/ > ipython
Python 2.4.4 (#2, Apr  5 2007, 19:01:44)
Type "copyright", "credits" or "license" for more information.

IPython 0.7.2 -- An enhanced Interactive Python.
?       -> Introduction to IPython's features.
%magic  -> Information about IPython's 'magic' % functions.
help    -> Python's own help system.
object? -> Details about 'object'. ?object also works, ?? prints more.

In [1]: import os

In [2]: os.system('./foo.sh 2> /dev/null')
(HELLO WORLD)
Out[2]: 0

In [3]:

А как ты из С-шной проги вызывал?

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

> А как ты из С-шной проги вызывал?

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

anonymous
()

Испльзуй опцию --noinfom

Я сам же делаю обычно Makefile:

После чего запускаю программу как
make run

Извини, неохота сейчас переделывать под шелл. Ты сам вычленишь всю инфу!

# lisp program and pre-evaluation options
LISP = sbcl
OPTS = --noinform

# program name
PROGRAM = program

# extensions
LISP_SFX = lisp
BIN_SFX = fasl

# compilator optimization options
OPTIM_SPEED = 3
OPTIM_COMP_SPEED = 0
OPTIM_SAFETY = 1
OPTIM_DEBUG = 0

OPTS_OPTIM = --eval "(declaim (optimize (speed $(OPTIM_SPEED)) (compilation-speed $(OPTIM_COMP_SPEED)) (safety $(OPTIM_SAFETY)) (debug $(OPTIM_DEBUG))))"


all: $(PROGRAM).$(BIN_SFX)

$(PROGRAM).$(BIN_SFX): $(PROGRAM).$(LISP_SFX)
	$(LISP) $(OPTS) $(OPTS_OPTIM) --eval '(compile-file "$(PROGRAM).$(LISP_SFX)")' --eval "(quit)"

run: $(PROGRAM).$(BIN_SFX)
	@$(LISP) $(OPTS) --load "$(PROGRAM).$(BIN_SFX)" --eval "(quit)" --disable-debugger


.PHONY: clean

clean:
	rm -f *.$(BIN_SFX)

atoku ★★★
()

Извини, не заметил что ты уже пользуешь noinform. Тогда, видимо, дело в команде --load. Удачи!

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

Блин, заспамил уже весь топик, извините.

Видимо --disable-debugger должен помочь + использование @ перед командой выполнения, чтобы строка не дублировалась.

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

Ну так я так и делаю. По этому мануалу (см. первый пост).
Но уже при добавлении своей корки core my.lisp
#!/usr/bin/sbcl --noinform --core my.lisp
только грузится  sbcl и аут :(

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

,-(~/tmp)-(Птн Июн 22 03:56:32)---------------------------------------------------------(bugmaker@bugg
y1)-
`-> tail -n 20 ~/.sbclrc
(let ((script (and (second *posix-argv*)
    (probe-file (second *posix-argv*)))))
    (when script
    ;; Handle shebang-line
        (set-dispatch-macro-character #\# #\!
            (lambda (stream char arg)
                (declare (ignore char arg))
                (read-line stream)))
            ;; Disable debugger
        (setf *invoke-debugger-hook*
            (lambda (condition hook)
            (declare (ignore hook))
            ;; Uncomment to get backtraces on errors
            ;; (sb-debug:backtrace 20)
            (format *error-output* "Error: ~A~%" condition)
            (quit)))
        (load script)
        (quit)))


,-(~/tmp)-(Птн Июн 22 03:57:20)---------------------------------------------------------(bugmaker@bugg
y1)-
`-> ls -l st.lisp
-rwxr-xr-x 1 bugmaker users 64 2007-06-22 03:56 st.lisp*                                        
,-(~/tmp)-(Птн Июн 22 03:57:31)---------------------------------------------------------(bugmaker@bugg
y1)-
`-> ./st.lisp
Hello, World!
,-(~/tmp)-(Птн Июн 22 03:57:43)---------------------------------------------------------(bugmaker@bugg
y1)-
`-> cat st.lisp 
#!/usr/local/bin/sbcl --noinform 

(write-line "Hello, World!")
,-(~/tmp)-(Птн Июн 22 04:01:39)---------------------------------------------------------(bugmaker@bugg
y1)-
`-> 

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

Так этот пример у меня тож работает. А ты попробуй ему свою корку подсунуть. У меня не получилось - грузится чистый sbcl.

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

Дык оно и не должно вроде бы? man bash вот чё говорит:

The arguments to the interpreter consist of a _single_ (marked by me -- bugmaker) optional argument following the interpreter name on the first line of the program, followed by the name of the program, followed by the command arguments, if any.

т.е. баш передаёт только _адын_ аргумент. Как еда для размышлений, помести в ~/.sbclrc строку такого вида:

(dolist (a *posix-argv*) (format t "\"~A\"~%" a))

и сравни ево вывод для заданых с командной строки

/usr/local/bin/sbcl --noinform --no-sysinit ./st.lisp

/usr/local/bin/sbcl "--noinform --no-sysinit" ./st.lisp

и скрипта ./st.lisp, в заглавие которого

#!/usr/local/bin/sbcl --noinform

и потом поменяй на

#!/usr/local/bin/sbcl --noinform --no-sysinit

Добавочный ключ --no-sysinit дан просто для примера того, как баш скатывает несколько опций в одну, на работу он в данном примере не влияет.

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

Понятно. Так а чего делать ? Как максимально приблизить запуск lisp-проги к запуску обычной (натив-скомпилированной) ?

anonymous
()
Ответ на: комментарий от atoku

> 1) --no-debug не помог?

Неа. Тож самое.

> 2) Как сделать свою коре, я бы поэкспериментировал. Интересно же.

Так я и сделал. Если из командной строки запускать (sbcl --core...) всё раблтает.

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

Слушай, просто ради эксперимента, не трудно же, попробуй из скрипта запустить тож самое, но

`echo 'то что надо запустить'`

Еще бы я прикололся в стиле: $param1=--no-inform $param2=--core ... sbcl $param1 $param2 ...

Интересно, а мой Makefile не устраивает. В нем все будет работать. make run и все. Кстати, make run можно из bash скрипта сделать.

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

> Интересно, а мой Makefile не устраивает.

Так я тож самое делаю (так же запускаю), только из командной строки или bash-скрипта. Всё работает, только выводится в терминал инфа и из конка не запускается. Вот в чём проблема.

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

Еще одна мысль появилась. Конечно, это полное безобразие, но как временная мера может помочь. Вывод отладки ведь идет на stderr. Что если перенаправить вывод stderr в /dev/null. stdout при этом оставить, конечно.

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

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

Вот здесь ещё глянь, мож подойдёт: http://www.cons.org/cmucl/doc/executable.html , там общие идеи и подойдут для всех имплементаций.

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

А причём тут -no-debug? bugs are funny. Проблема в том, что из заголовка баш скрипта передайтся только _один_ параметр, как если бы ты запускал из командной строки

executable "-a -b -c"

вместо

executable -a -b -c

Сотворить ядро нехитро. Запускаеш лисп, загружаеш нужные функции, потом даёш команду (save-lisp-and-die "corename.core") и фсио. Команда эта для sbcl, вообще она в разных имплементациях разная или может вообще не быть.

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

Я только сейчас сообразил, что он пыатется вызвать sbcl из заголовка #! а не просто строкой.

Кстати, тогда уж лучше писать #! /usr/bin/env sbcl ....

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