?

Log in

Жить не можем без проблем! [entries|archive|friends|userinfo]
Жить не можем без проблем!

[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

SICP по-русски. [Sep. 17th, 2010|08:36 am]
Жить не можем без проблем!
ztarlitz
Сделал перевод третьей лекции SICP, пусть здесь повисит, может кому-нибудь будет интересно.



Предыдущие две лекции искать где-то здесь:
http://ztarlitz.livejournal.com/32317.html
link10 comments|post comment

INPUT-STREAM-P, STREAM-ELEMENT-TYPE... vs. CLOSE [Sep. 16th, 2010|10:13 am]
Жить не можем без проблем!

akovalenko
Обнаружил, что SBCL после закрытия stream'а теряет все возможности интроспекции на нём: INPUT-STREAM-P, OUTPUT-STREAM-P => NIL, остальное ругается на попытку ввода-вывода с закрытым stream'ом (например, STREAM-ELEMENT-TYPE). Это категорически не кажется правильной вещью. Но прежде, чем бросаться репортить и фиксить, хочу посоветоваться с сообществом: правильно ли я понимаю, что вышеописанное не только «нехорошо», но и non-conforming? Я считаю, что это подтверждается тем, что про OPEN-STREAM-P написано Affected by: Close, а про всю интроспекцию -- Affected by: None.

Clozure CL, CLISP, ECL не делают такой бяки. У кого есть под рукой другие реализации -- как с этим делом принято?
link6 comments|post comment

Extended loop: for .. while .. for [Sep. 1st, 2010|05:32 am]
Жить не можем без проблем!

akovalenko
Никак не могу понять одной вещи про extended loop -- прямо мозги вытекают :(

Допускается ли стандартом использование termination test clauses (e.g. while) *между* for? Так, чтобы если условие завершения наступило, stepping от «нижних» for бы не выполнялся (у меня довольно часто многоэтажный loop построен так, что «нижние» for не способны сделать stepping без ошибки, если вовремя не вывалиться).

Если начать исследовать CLHS с того места, где расписан как-бы-BNF extended loop, кажется, что такого делать просто нельзя. Если закопаться внутрь, однако, попадаются (или, возможно, приглючиваются) намёки, что так делать можно. SBCL и CCL такое проглатывают и работают ожидаемым образом, но мне вспоминается печальный опыт с чем-то вроде ECL, который (если я правильно помню) потребовал подвинуть while вниз, а это уже потащило за собой переписывание всего подряд. В общем, совершенно нехарактерная для Common Lisp засада -- когда можно пользоваться нестандартным расширением несколько лет, и внезапно об этом узнать. Такая перспектива мне не нравится. (Взбрык ECL, опять же, совершенно не показатель -- дело было давно, он был моложе и глупее и вполне мог быть non-conforming в этом плане. Проверять заново не тянет: сейчас хочется выяснить, как оно *должно* быть, а тут такие проверки не помогут)

Ну и такой вопрос -- если я сделаю вместо WHILE какой-нибудь FOR () = (WHEN кирдык (LOOP-FINISH)) -- оно-то уж точно предотвратит stepping в последующих FOR? (тогда, с одной стороны, становится непонятно, на фига не разрешили там WHILE (если и вправду нельзя), но зато понятно, на что его менять, чтобы обойтись без революций).
link6 comments|post comment

(no subject) [Jul. 27th, 2010|12:06 pm]
Жить не можем без проблем!

three_sisters_3
Привет!
В общем вот какое дело:
emacs + slime + clisp + windows
пишет каракули при выводе кириллицы
я это лечу,
(set-process-coding-system (get-process "inferior-lisp") 'cp1251 'cp1251)
ну или хоткеем (просто первый вариант длиннее, ну вы понимаете)

А как это куда-нибудь вписать чтобы не приходилось этого делать вообще.
Потому, что если я явно указываю все параметры кодировок в .emacs, то он перестает автоматически распознавать и потом каракули из буфера обмена лезут и вообще.
link18 comments|post comment

проблема с parenscript [Feb. 22nd, 2010|12:47 pm]
Жить не можем без проблем!

polish_my_pole
здравствуйте, уважаемые.
собираюсь я начать работу с parenscript, запускаю clisp, выполняю следующее:

(dolist (x '(:hunchentoot :cl-who :parenscript :cl-fad))
(asdf:oos 'asdf:load-op x))


пакеты грузятся нормально. особое внимание обращаю на parenscript:

; loading system definition from /usr/share/common-lisp/systems/parenscript.asd into #<PACKAGE ASDF0>
;; Loading file /usr/share/common-lisp/systems/parenscript.asd ...
; registering #<SYSTEM :PARENSCRIPT #x20CD1A6E> as PARENSCRIPT
WARNING: Модифицируется родовая функция #<STANDARD-GENERIC-FUNCTION PERFORM>, которая уже была вызвана.
; registering #<SYSTEM :PARENSCRIPT.TEST #x20CD921E> as PARENSCRIPT.TEST
;; Loaded file /usr/share/common-lisp/systems/parenscript.asd
;; Loading file /var/cache/common-lisp-controller/1000/clisp/parenscript/src/package.fas ...
;; Loaded file /var/cache/common-lisp-controller/1000/clisp/parenscript/src/package.fas
;; Loading file /var/cache/common-lisp-controller/1000/clisp/parenscript/src/utils.fas ...
;; Loaded file /var/cache/common-lisp-controller/1000/clisp/parenscript/src/utils.fas
;; Loading file /var/cache/common-lisp-controller/1000/clisp/parenscript/src/defgenerics.fas ...
;; Loaded file /var/cache/common-lisp-controller/1000/clisp/parenscript/src/defgenerics.fas
;; Loading file /var/cache/common-lisp-controller/1000/clisp/parenscript/src/js.fas ...
;; Loaded file /var/cache/common-lisp-controller/1000/clisp/parenscript/src/js.fas
;; Loading file /var/cache/common-lisp-controller/1000/clisp/parenscript/src/js-html.fas ...
;; Loaded file /var/cache/common-lisp-controller/1000/clisp/parenscript/src/js-html.fas
;; Loading file /var/cache/common-lisp-controller/1000/clisp/parenscript/src/css.fas ...
;; Loaded file /var/cache/common-lisp-controller/1000/clisp/parenscript/src/css.fas
;; Loading file /var/cache/common-lisp-controller/1000/clisp/parenscript/src/compile-js.fas ...
;; Loaded file /var/cache/common-lisp-controller/1000/clisp/parenscript/src/compile-js.fas
0 ошибок, 0 предупреждений
0 ошибок, 0 предупреждений
NIL


затем ввожу следующее:
(defpackage "PS-TUTORIAL"
(:use "COMMON-LISP" "HUNCHENTOOT" "CL-WHO" "PARENSCRIPT" "CL-FAD"))


и получаю сообщение об ошибке:
*** - SYSTEM::%FIND-PACKAGE: Нет пакетов с именем "PARENSCRIPT".
Имеются следующие варианты продолжения:
USE-VALUE :R1 Вы можете ввести новое значение для использования.
ABORT :R2 Abort main loop


в sbcl -- то же самое.
как быть?
link8 comments|post comment

Как объявить функцию результат которой может использовать setf ? [Jan. 9th, 2010|10:11 am]
Жить не можем без проблем!

kmmbvnr
Хочется чтоб по аналогии
   (setf (car *x*) 5)

объявить функцию, которую можно было бы использовать вот так:

   (setf (mycar *x*) 5)

Это возможно?
link2 comments|post comment

Синтаксические сладости [Jan. 1st, 2010|03:22 pm]
Жить не можем без проблем!

ander_skirnir
Кросс-пост: http://lisper.ru/forum/thread/134

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

Вот, например, if с bind'ингом и it'ом:
(defun iif-lform-gather (lst)
  (cond
    ((null lst) nil)
    ((listp (car lst))
       (if (and (keywordp (caar lst)) (eq (caar lst) :bind))
           (prog1 (cons (cons (cadar lst) (cddar lst))
                        (iif-lform-gather (cdr lst)))
                  (setf (car lst) (caddar lst)))                  
           (nconc (iif-lform-gather (car lst))
                  (iif-lform-gather (cdr lst)))))
    (t (iif-lform-gather (cdr lst)))))
         
         
(defmacro iif (arg tform nform)
  `(let ((it ,arg) ,@(iif-lform-gather arg))
     (if it ,tform ,nform)))


Примеры использования:
(iif (< (:bind xx (+ 12 x)) 34) (1+ xx) (-1 xx))
(iif some-variable (cons 'a it) '(a))
link16 comments|post comment

(no subject) [Dec. 17th, 2009|08:47 pm]
Жить не можем без проблем!

love5an
А оговаривается ли где-то в стандарте порядок раскрытия макросов?
Репост отсюда вот:
http://lisper.ru/forum/thread/126

Дело в том, что ради интереса попробовал реализовать вот такую штуку
(eval-when (:compile-toplevel :load-toplevel :execute) 
  (defvar *cleaners* '())) 
 
(defmacro with-cleaners ((&rest resources) &body body) 
  "Each resource is of form (name value)" 
  (setf *cleaners* '()) 
  `(let ,resources 
     (macrolet ((add-cleaner (&body cleaner-body) 
                  (push cleaner-body *cleaners*) 
                  nil) 
                (invoke-cleaners () 
                  `(progn ,@(reduce #'nconc *cleaners*) 
                          ,(setf *cleaners* '())))) 
       (unwind-protect 
         (progn ,@body) 
         (invoke-cleaners))))) 

и обнаружил, что оно не везде работает так, как хотелось(должно вычислять все cleaner формы в конце области видимости)(оно полагается на порядок раскрытия слева-направо; соответственно, например, Clozure CL оно работает, а в SBCL, например - нет(и это только в случае с unwind-protect, как я понял. Если вместо него обычная функция, порядок - слева направо))
link3 comments|post comment

Как интернить не только строки ? [Nov. 22nd, 2009|03:20 pm]
Жить не можем без проблем!
zhengxi
Хочется иметь функцию, которая бы работала как string->symbol, но для всех типов данных.
То есть, если x и y equal?-равны (по значению), то (intern x) и (intern y) будут eq?-равны (по ссылке).

Зачем это надо?
Для того же, что и string->symbol: экономить память, если ожидается много одинаковых иммутабельных оьъектов и быстро их сравнивать (eq? вместо equal?)

Написал я такую функцию (PLT Scheme)
(define *internat* (make-weak-hash))

; not thread safe
(define (intern x [internat *internat*])
  (let ([e (hash-ref internat x #f)])
    (if e
        (ephemeron-value e)
        (let ([e (make-ephemeron x x)])
          (hash-set! internat x e)
          (ephemeron-value e)))))

(define (interned? x [internat *internat*])
  (let ([e (hash-ref internat x #f)])
    (if e
        (eq? x (ephemeron-value e))
        #f)))

; набор тестов тут: http://paste.lisp.org/display/90896


Хотя она делает что нужно, она мне очень не нравится.
Даже в таком упрощённом (не thread safe) варианте она сильно медленнее, чем string->symbol.

Как это можно сделать лучше ?
М.б. есть реализации Scheme (или CL), где string->symbol (или intern) уже работает для всех типов ?

UPD: это задача не про подсчёт хеш-суммы, и дальнейшей работой с хеш-суммой вместо объекта.

Это задача про удаление дубликатов иммутабельных объектов:
(define a "AAA")
(intern a) ; возвращает a
(define b "AAA")
(intern b) ; возвращает a

Должно быть true не только
(eq? (intern "AAA") (intern "AAA"))
но и
(equal? (intern "AAA") "AAA")
link14 comments|post comment

композиция [Nov. 22nd, 2009|09:08 am]
Жить не можем без проблем!

tinedel
Доброе утро.
А есть в эхотаге композиция функций?
В варианте, например,

(funcall (composition #'reverse #'car #'1+) '(1 2 3 4)) -> 5

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

АПД: судя по ответам - в стандарт не входит. Реализована как минимум в виде функций metatilities:compose и alexandria:compose.

спасибо
link3 comments|post comment

navigation
[ viewing | 10 entries back ]
[ go | earlier/later ]