LINUX.ORG.RU

OpenSource проект на Лиспе


0

0

Есть на ЛОРе лисперы, которые хотят поучаствовать в несложном GPL-проекте? Любая помощь приветствуется, даже небольшая. (Заодно потренируете свои навыки). Мастерское владение LISP не требуется, но опыт программирования как такового желательно иметь.

★★

Какой Лисп имеется ввиду? CL или Scheme? И что за проект по подробнее хотелось бы.

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

На данный момент - SBCL. Планируется портировать на Allegro, LispWorks и OpenMCL, но руки пока не дошли.

Проект - труъ rogue-like игра, с MMORPG интерфейсом и очень умными ботами, умеющими разговаривать по-человечески. Сюжет - полурандомный, т.е. зависит от действий всех игроков.

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

Крурто. А в свободный доступ выкладывать будете или это только для закрытой тусовки?

wieker ★★
()

Вдохновил, конечно, ADOM (ну и Столлман, естес-но). На данный момент - 3 разработчика, из них над Лисповой частью работает один (догадайтесь кто), и двое - над ИИ. Уже сделан базовый фреймворк, т.е. сеть и процессы. Клиент написан на Си, можно ходить по карте и атаковать.

Сервер доступен через CVS. Клиент версии 0.0.1 уже зарелизился. Кода пока мало, так что разобраться будет просто. К тому же он хорошо структуризирован. Фреймворк - game.lisp, логика - objects.lisp.

У нас есть сервер, с сайтом. И проект на sourceforge. Но пока что сервер не круглосуточно работает (что будет исправлено в будущем). Наиболее простой способ тестить игру - запускать на localhost.

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

Мыло и Jabber: kuteynikov [собака] gmail.com

Preview (ИИ туда пока не выложен): http://sourceforge.net/projects/tenebrosus

http://tenebrosus.cvs.sourceforge.net/tenebrosus/

P.S. Еще раз говорю: сервер у нас не запущен. Замените в game.lisp строчку "invyl.ath.cx" на "localhost" или ваш IP-адрес.

gcc -o tenebrosus tenebrosus.c -lncurses -pthread

sbcl --load game.lisp (поддержка процессов должна быть включена при сбоке sbcl - если нет, то пересоберите его (бывает на FreeBSD))

./tenebrosus localhost 51719

(см. (connect-to-port 51719) - можно поменять порт).

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

>из них над Лисповой частью работает один (догадайтесь кто)

неужели VSL? :)

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

а на langband смотрели? может быть будет проще оттуда часть выдрать?

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

чуть посмотрел код - зачем постоянно напрямую обращаться к bsd-socket? надо написать обертку, типа send-message. и уж точно использовать usocket/acl-compat для переносимости. и может быть стоит посмотреть на defclass-star?

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

> и уж точно использовать usocket

usocket - это который в clocc?

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

Что могу сказать:

Для проектов на лиспе мне видится предпочтительней использовать common-lisp.net

Желательно использовать ASDF. И как уже сказали выше, вместо sb-bsd-sockets использовать usocket.

И код, мягко сказать, ужасен.

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

>код

Ну, во первых, это еще нароботки, а во-вторых - что конкретно не так?

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

Ну с Вашем Лисповым стажем любой код покажется отстойным. Вместо того, чтобы клеймить тех, у кого меньше опыта (хотя опыт у меня очень большой, это на Лиспе я не слишком давно программирую), лучше дайте советы, или пару строк "не ужасного" кода.

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

> И код, мягко сказать, ужасен.

Покажи свой :)

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

Могу конкретно покритиковать.

Что-то очень много кода прямо в top-level. Последний loop в game.lisp поверг меня наповал.

Имена специальных переменных смешаны, где-то правильно с **, а где-то без.

Форматирование ужасно, например вот это:

(defmacro delete-player (thread) `(sb-thread:with-mutex (*db-lock*) (delete-if #'(lambda (object) ;FIXME: PERFORMANCE
										   (if (typep object 'player)
										       (eq (slot-value object 'thread) ,thread) nil)) *db*)))

Доступ к слотам через slot-value считается не очень хорошим тоном.

(defmacro send-updates ()
  `(sb-thread:release-mutex *update-mutex*)
  `(sb-thread:get-mutex *update-mutex*))

Это, во-первых, не делает того, что ты хочешь. В результат макрос развернется в последнюю форму. Надо было делать progn. Да и вообще, это нет смысла реализовывать в виде макроса, максимум --- функция + inline.

Ну и так далее и тому подобное.

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

> Доступ к слотам через slot-value считается не очень хорошим тоном.

а кроме того раза в 1.5 медленней прямых акцессоров

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

(defclass a ()
  ((val :type int :initform 1 :accessor val)))

(setq b (make-instance 'a))

(defun c ()
  (val b))

(defun d ()
  (slot-value b 'val))

(disassemble 'c)

; 03966AD4:       488B05A5FFFFFF   MOV RAX, [RIP-91]          ; 'B
                                                              ; no-arg-parsing entry point
;      ADB:       488B50F9         MOV RDX, [RAX-7]
;      ADF:       4883FA52         CMP RDX, 82
;      AE3:       7420             JEQ L0
;      AE5:       488B059CFFFFFF   MOV RAX, [RIP-100]         ; #<FDEFINITION object for VAL>
;      AEC:       B908000000       MOV ECX, 8
;      AF1:       FF75F0           PUSH QWORD PTR [RBP-16]
;      AF4:       FF6009           JMP QWORD PTR [RAX+9]
;      AF7:       90               NOP
;      AF8:       90               NOP
;      AF9:       90               NOP
;      AFA:       90               NOP
;      AFB:       90               NOP
;      AFC:       90               NOP
;      AFD:       90               NOP
;      AFE:       90               NOP
;      AFF:       90               NOP
;      B00:       CC0A             BREAK 10                   ; error trap
;      B02:       02               BYTE #X02
;      B03:       18               BYTE #X18                  ; INVALID-ARG-COUNT-ERROR
;      B04:       4E               BYTE #X4E                  ; RCX
;      B05: L0:   CC0A             BREAK 10                   ; error trap
;      B07:       02               BYTE #X02
;      B08:       1A               BYTE #X1A                  ; UNBOUND-SYMBOL-ERROR
;      B09:       0F               BYTE #X0F                  ; RAX
; 

(disassemble 'd)

; 024D0694:       488B05A5FFFFFF   MOV RAX, [RIP-91]          ; 'B
                                                              ; no-arg-parsing entry point
;       9B:       488B50F9         MOV RDX, [RAX-7]
;       9F:       4883FA52         CMP RDX, 82
;       A3:       7420             JEQ L0
;       A5:       488B059CFFFFFF   MOV RAX, [RIP-100]         ; #<FDEFINITION object for #>
;       AC:       B908000000       MOV ECX, 8
;       B1:       FF75F0           PUSH QWORD PTR [RBP-16]
;       B4:       FF6009           JMP QWORD PTR [RAX+9]
;       B7:       90               NOP
;       B8:       90               NOP
;       B9:       90               NOP
;       BA:       90               NOP
;       BB:       90               NOP
;       BC:       90               NOP
;       BD:       90               NOP
;       BE:       90               NOP
;       BF:       90               NOP
;       C0:       CC0A             BREAK 10                   ; error trap
;       C2:       02               BYTE #X02
;       C3:       18               BYTE #X18                  ; INVALID-ARG-COUNT-ERROR
;       C4:       4E               BYTE #X4E                  ; RCX
;       C5: L0:   CC0A             BREAK 10                   ; error trap
;       C7:       02               BYTE #X02
;       C8:       1A               BYTE #X1A                  ; UNBOUND-SYMBOL-ERROR
;       C9:       0F               BYTE #X0F                  ; RAX
; 

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

Это был SBCL. А вот CLISP:

[5]> (disassemble 'c)
WARNING in C :
B не объявлена и не связана,
будет трактоваться как объявленная SPECIAL.

Disassembly of function C
(CONST 0) = B
(CONST 1) = VAL
0 обязательных аргументов
0 необязательныx аргументов
Нет параметра rest
Нет ключевых параметров
reads special variable: B
3 инструкций байт-кода:
0     (GETVALUE&PUSH 0)                   ; B
2     (CALL1 1)                           ; VAL
4     (SKIP&RET 1)
NIL
[6]> (disassemble 'd)
WARNING in D :
B не объявлена и не связана,
будет трактоваться как объявленная SPECIAL.

Disassembly of function D
(CONST 0) = B
(CONST 1) = VAL
0 обязательных аргументов
0 необязательныx аргументов
Нет параметра rest
Нет ключевых параметров
reads special variable: B
4 инструкций байт-кода:
0     (GETVALUE&PUSH 0)                   ; B
2     (CONST&PUSH 1)                      ; VAL
3     (CALLS2 62)                         ; SLOT-VALUE
5     (SKIP&RET 1)
NIL

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

Ну вот, я так и думал. Причина в том, что ТАМ ОСТАЛСЯ КОД СТАРЫХ ВЕРСИЙ. Например send-updates я уже не использую, вместо него sb-thread:condition-broadcast, а этот код я _забыл удалить_. Во-вторых slot-value напрямую я тоже нигде не использую, а в этом месте опять-таки забыл удалить. У меня есть макрос define-fields, смотри его. А форматирование я уже давно исправил, но пока не выкладывал в инет.

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

Ну так что, кто-нибудь надумал помочь? Пишите сначала на мыло, в Jabber я не всегда бываю.

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

Хм, :accessor? Виноват. Я читал один документ, там использовался :accessor-prefix, но у меня он отказался работать и мне пришлось использовать slot-value. Сейчас попробую :accessor поставить.

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

Поменяй в коде местами имя и фамилию. Сначала имя, потом фамилия.

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