> 1 <

Автор Сообщение

skelter

Members


Статус

56 сообщений

Где: ---
Род занятий:
Возраст:

#6937   2013-03-03 18:14 GMT+3 часа(ов)      
Здравствуйте. У меня следующий нубский вопрос.

Предположим, я хочу создать пакет foolib, в котором определяется функция
 
(defun foo (x)
x)
 

Код пакета будет в файле foolib.lisp, который где-то лежит. И я хочу написать программу bar.lisp, которая делала бы следующее:
 
(print (foo 0))
 

Я не могу толком нагуглить следующее: какой дополнительный код должен содержаться в файлах foolib.lisp и bar.lisp, чтобы второй из них нашёл первый. Или, точнее говоря, чтобы при компиляции второй файл нашёл скомпилированный первый. Для простоты можно предположить, что оба файла в одной папке.

Буду благодарен за пояснения, ссылки или по крайней мере за ключевые слова.

asvil

Members


Статус

4 сообщений

Где: Belarus
Род занятий:
Возраст:

#6938   2013-03-04 15:04 GMT+3 часа(ов)      
Писал пару месяцев назад пост об этом, а сейчас оформил небольшой туториал.

http://filonenko-mikhail.blogspot.ru/2013/03/common-lisp.html

skelter

Members


Статус

56 сообщений

Где: ---
Род занятий:
Возраст:

#6939   2013-03-04 23:58 GMT+3 часа(ов)      
Спасибо, asvil.

Я пробую разобраться. Создаю папку, в ней создаю файлы utils.lisp и utils.asd, в которые копипащу код из туториала.

В принципе, этими результатами труда я могу пользоваться (надеюсь) и без github-а. Однако что я должен делать? Например, я попробовал в той же папке создать test.lisp с содержанием
 
(asdf:load-system "utils")
(use-package :utils)
(format t (greetings))
 

Не имею представления, насколько релевантны две первые строчки, но надо же было что-то написать. Файл всё равно не компилируется, а REPL выдаёт ошибку на первую строку: "Component utils not found". Заменил её (строку) на (asdf:operate 'asdf:load-op 'utils), как в Getting started with ASDF,&񗝅 лучше не стало.

asvil

Members


Статус

4 сообщений

Где: Belarus
Род занятий:
Возраст:

#6940   2013-03-05 13:06 GMT+3 часа(ов)      
asdf должна знать где искать библиотеку, самый быстрый путь объяснить это ей так:

(setf asdf:*central-registry* "/path/to/library/")


А потом да, можно делать use-package.

skelter

Members


Статус

56 сообщений

Где: ---
Род занятий:
Возраст:

#6941   2013-03-05 20:56 GMT+3 часа(ов)      
Заработало даже в таком "продвинутом" виде:
 
(asdf:initialize-source-registry
'(:source-registry
:ignore-inherited-configuration
(:directory :here)))
;(push "/path/to/myutils/" asdf:*central-registry*) ; obsolete
(asdf:operate 'asdf:load-op 'utils)
(defpackage test
(:use cl utils))
(in-package test)
(format t (greetings))
 

Хотя не без глюка: SBCL выдаёт
 
debugger invoked on a SB-KERNEL:CASE-FAILURE in thread
#<THREAD "initial thread" RUNNING {AAF28B1}>:
NIL fell through ETYPECASE expression. Wanted one of (STRING SIMPLE-STRING).
 
Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.
 

Впрочем, это, по-видимому, к загрузке пакетов не имеет отношения, потом буду разбираться.

С самодельными пакетами вроде более-менее ясно. Теперь надо будет разобраться с системами, которые грузит quicklisp (куда он их сохраняет?..), ну а в первую очередь - читать мануал ASDF, раз всё делается через неё. Просто по сравнению с тем же Python-ом не очень-то интуитивно. Ну ладно, мы не ищем лёгких путей.

Большое спасибо!

asvil

Members


Статус

4 сообщений

Где: Belarus
Род занятий:
Возраст:

#6942   2013-03-05 22:30 GMT+3 часа(ов)      
Системы quicklisp грузит в папку ~/quicklisp/dists
quicklisp ставит хук в asdf, и если asdf не нашла систему, ищет в своём репозитории.
quicklisp также умеет находить/загружать пользовательские asdf системы, надо только их поместить в ~/quicklisp/local-projects.

skelter

Members


Статус

56 сообщений

Где: ---
Род занятий:
Возраст:

#6943   2013-03-05 23:17 GMT+3 часа(ов)      
Ага, то есть quicklisp на порядок сокращает необоходимость непосредственной работы с ASDF. Вот это достаточно культурно выглядит?
 
(ql:quickload "LTK")
 
(defpackage :hwltk
(:use :cl :ltk))
 
(in-package :hwltk)
 
(with-ltk ()
(let* ((mainframe (make-instance 'frame))
(lbl (make-instance 'label
:master mainframe
:text "Hello, world.")))
(grid mainframe 0 0)
(grid lbl 0 0)))
 

Наблюдается эффект: компилируется, только если сначала загрузить. Если не загружать, SBCL пишет "The name "LTK" does not designate any package", CLISP - тоже нечто подобное. Если в терминале писать clisp hwltk.lisp или clisp hwltk.fas, CLISP "не видит" и quicklisp. В целом кривовато (жалко, что в один приём не компилируется), но жить можно.

Зато: скомпилированный SBCL-м код запускается, а если к нему присовокупить скрипт
 
#!/bin/bash
sbcl --noinform --load hwltk.fasl --quit --end-toplevel-options "$@" > /dev/null
 

(идея отсюда), получается настоящее standalone-приложение, даже по двойному клику - окошко без консоли.
SBCL выходит вперёд в моём личном рейтинге.

asvil, ещё раз спасибо.
> 1 <


Онлайн :

0 пользователь(ей), 37 гость(ей) :




Реклама на сайте: