<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress/2.3.3" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>
<channel>
	<title>Comments on: просыпаясь</title>
	<link>http://blogs.kakpryg.net/cmm/2007/09/17/%d0%bf%d1%80%d0%be%d1%81%d1%8b%d0%bf%d0%b0%d1%8f%d1%81%d1%8c/</link>
	<description>a live journal in tax exile</description>
	<pubDate>Thu, 08 Jan 2009 20:40:58 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.3.3</generator>
		<item>
		<title>By: cmm</title>
		<link>http://blogs.kakpryg.net/cmm/2007/09/17/%d0%bf%d1%80%d0%be%d1%81%d1%8b%d0%bf%d0%b0%d1%8f%d1%81%d1%8c/#comment-11599</link>
		<dc:creator>cmm</dc:creator>
		<pubDate>Mon, 19 Nov 2007 19:04:47 +0000</pubDate>
		<guid>http://blogs.kakpryg.net/cmm/2007/09/17/%d0%bf%d1%80%d0%be%d1%81%d1%8b%d0%bf%d0%b0%d1%8f%d1%81%d1%8c/#comment-11599</guid>
		<description>... либо передавать имя слота и использовать slot-value (и евойный, соответственно, setf-метод).
... либо передавать маленький такой псевдо-пойнтер в виде closure, который либо возвращает значение слота, либо меняет его на новое, в зависимости от количества параметров.

но ваще какой-то дизайн у тебя неортодоксальный :)

&lt;a href="http://livejournal.com/users/cmm" rel="nofollow"&gt;(http://livejournal.com/users/cmm)&lt;/a&gt;</description>
		<content:encoded><![CDATA[<p>&#8230; либо передавать имя слота и использовать slot-value (и евойный, соответственно, setf-метод).<br />
&#8230; либо передавать маленький такой псевдо-пойнтер в виде closure, который либо возвращает значение слота, либо меняет его на новое, в зависимости от количества параметров.</p>
<p>но ваще какой-то дизайн у тебя неортодоксальный :)</p>
<p><a href="http://livejournal.com/users/cmm" rel="nofollow">(http://livejournal.com/users/cmm)</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: cmm</title>
		<link>http://blogs.kakpryg.net/cmm/2007/09/17/%d0%bf%d1%80%d0%be%d1%81%d1%8b%d0%bf%d0%b0%d1%8f%d1%81%d1%8c/#comment-11598</link>
		<dc:creator>cmm</dc:creator>
		<pubDate>Mon, 19 Nov 2007 18:51:51 +0000</pubDate>
		<guid>http://blogs.kakpryg.net/cmm/2007/09/17/%d0%bf%d1%80%d0%be%d1%81%d1%8b%d0%bf%d0%b0%d1%8f%d1%81%d1%8c/#comment-11598</guid>
		<description>&lt;q&gt;Это реально, вообще, потому что я как-то запутался.&lt;/q&gt;

не-а, нереально.
но ты можешь точно также передать #&apos;(setf access-slot).

&lt;a href="http://livejournal.com/users/cmm" rel="nofollow"&gt;(http://livejournal.com/users/cmm)&lt;/a&gt;</description>
		<content:encoded><![CDATA[<p><q>Это реально, вообще, потому что я как-то запутался.</q></p>
<p>не-а, нереально.<br />
но ты можешь точно также передать #&apos;(setf access-slot).</p>
<p><a href="http://livejournal.com/users/cmm" rel="nofollow">(http://livejournal.com/users/cmm)</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: gianthare</title>
		<link>http://blogs.kakpryg.net/cmm/2007/09/17/%d0%bf%d1%80%d0%be%d1%81%d1%8b%d0%bf%d0%b0%d1%8f%d1%81%d1%8c/#comment-11597</link>
		<dc:creator>gianthare</dc:creator>
		<pubDate>Mon, 19 Nov 2007 18:24:12 +0000</pubDate>
		<guid>http://blogs.kakpryg.net/cmm/2007/09/17/%d0%bf%d1%80%d0%be%d1%81%d1%8b%d0%bf%d0%b0%d1%8f%d1%81%d1%8c/#comment-11597</guid>
		<description>А вот у меня к тебе еще вопрос - я в функцию передал accessor, который defclass определил, типа 
#&apos;access-slot
а теперь хочу этот slot изменить внутри функции, т.е. вызвать как бы (setf (access-slot obj) val), но используя, естественно не имя accessor&apos;а, а этот переданный параметр. Это реально, вообще, потому что я как-то запутался. Пытался через get-setf-что-то там, но только хуже стало

&lt;a href="http://livejournal.com/users/gianthare" rel="nofollow"&gt;(http://livejournal.com/users/gianthare)&lt;/a&gt;</description>
		<content:encoded><![CDATA[<p>А вот у меня к тебе еще вопрос - я в функцию передал accessor, который defclass определил, типа<br />
#&apos;access-slot<br />
а теперь хочу этот slot изменить внутри функции, т.е. вызвать как бы (setf (access-slot obj) val), но используя, естественно не имя accessor&apos;а, а этот переданный параметр. Это реально, вообще, потому что я как-то запутался. Пытался через get-setf-что-то там, но только хуже стало</p>
<p><a href="http://livejournal.com/users/gianthare" rel="nofollow">(http://livejournal.com/users/gianthare)</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: cmm</title>
		<link>http://blogs.kakpryg.net/cmm/2007/09/17/%d0%bf%d1%80%d0%be%d1%81%d1%8b%d0%bf%d0%b0%d1%8f%d1%81%d1%8c/#comment-11596</link>
		<dc:creator>cmm</dc:creator>
		<pubDate>Mon, 08 Oct 2007 06:23:41 +0000</pubDate>
		<guid>http://blogs.kakpryg.net/cmm/2007/09/17/%d0%bf%d1%80%d0%be%d1%81%d1%8b%d0%bf%d0%b0%d1%8f%d1%81%d1%8c/#comment-11596</guid>
		<description>&lt;q&gt;чем хорош deftype, кроме того, что потом можно typep делать?&lt;/q&gt;

декларативностью.
но это дело вкуса, в общем.

&lt;a href="http://livejournal.com/users/cmm" rel="nofollow"&gt;(http://livejournal.com/users/cmm)&lt;/a&gt;</description>
		<content:encoded><![CDATA[<p><q>чем хорош deftype, кроме того, что потом можно typep делать?</q></p>
<p>декларативностью.<br />
но это дело вкуса, в общем.</p>
<p><a href="http://livejournal.com/users/cmm" rel="nofollow">(http://livejournal.com/users/cmm)</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: gianthare</title>
		<link>http://blogs.kakpryg.net/cmm/2007/09/17/%d0%bf%d1%80%d0%be%d1%81%d1%8b%d0%bf%d0%b0%d1%8f%d1%81%d1%8c/#comment-11595</link>
		<dc:creator>gianthare</dc:creator>
		<pubDate>Mon, 08 Oct 2007 05:23:35 +0000</pubDate>
		<guid>http://blogs.kakpryg.net/cmm/2007/09/17/%d0%bf%d1%80%d0%be%d1%81%d1%8b%d0%bf%d0%b0%d1%8f%d1%81%d1%8c/#comment-11595</guid>
		<description>Да, симпатично, особенно coerce хорош, а то я уже обыскался нормальной функции, которая из списка стринг сделает.
А чем хорош deftype, кроме того, что потом можно typep делать?

&lt;a href="http://livejournal.com/users/gianthare" rel="nofollow"&gt;(http://livejournal.com/users/gianthare)&lt;/a&gt;</description>
		<content:encoded><![CDATA[<p>Да, симпатично, особенно coerce хорош, а то я уже обыскался нормальной функции, которая из списка стринг сделает.<br />
А чем хорош deftype, кроме того, что потом можно typep делать?</p>
<p><a href="http://livejournal.com/users/gianthare" rel="nofollow">(http://livejournal.com/users/gianthare)</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: cmm</title>
		<link>http://blogs.kakpryg.net/cmm/2007/09/17/%d0%bf%d1%80%d0%be%d1%81%d1%8b%d0%bf%d0%b0%d1%8f%d1%81%d1%8c/#comment-11594</link>
		<dc:creator>cmm</dc:creator>
		<pubDate>Sun, 07 Oct 2007 15:49:11 +0000</pubDate>
		<guid>http://blogs.kakpryg.net/cmm/2007/09/17/%d0%bf%d1%80%d0%be%d1%81%d1%8b%d0%bf%d0%b0%d1%8f%d1%81%d1%8c/#comment-11594</guid>
		<description>или так (не сильно короче, зато типа идиоматичнее): &lt;pre&gt;
(deftype white-space () &apos;(member #\Space #\Newline #\Tab))
(deftype paren       () &apos;(member #\) #\())
(deftype terminator  () &apos;(or white-space paren (eql eof)))

(defun get-char (stream)
  (read-char stream nil &apos;eof))
(defun unget-char (char stream)
  (unless (eq char &apos;eof)
    (unread-char char stream)))

(defun read-token (stream)
  ;; skip whitespace
  (loop for char = (get-char stream)
        while (typep char &apos;white-space)
        finally (unget-char char stream))
  ;; read the token
  (let ((char (get-char stream)))
    (typecase char
      (paren char)
      (t     (unget-char char stream)
             (loop for char = (get-char stream)
                   until (typep char &apos;terminator)
                   collecting char into chars
                   finally (progn
                             (unget-char char stream)
                             (return (if chars (intern (coerce chars &apos;string))
                                         (error "unexpected EOF")))))))))

(defun read-sexp (&#038;optional stream in-list-p)
  (let ((token (read-token stream)))
    (case token
      (#\) (if in-list-p token
               (error "unexpected close parenthesis")))
      (#\( (loop for sexp = (read-sexp stream t)
                 until (member sexp &apos;(#\) eof))
                 collecting sexp
                 finally (unless (eq sexp #\))
                           (error "unexpected EOF (unterminated list)"))))
      (t   token))))
&lt;/pre&gt;

&lt;a href="http://livejournal.com/users/cmm" rel="nofollow"&gt;(http://livejournal.com/users/cmm)&lt;/a&gt;</description>
		<content:encoded><![CDATA[<p>или так (не сильно короче, зато типа идиоматичнее):
<pre>
(deftype white-space () &apos;(member #\Space #\Newline #\Tab))
(deftype paren       () &apos;(member #\) #\())
(deftype terminator  () &apos;(or white-space paren (eql eof)))

(defun get-char (stream)
  (read-char stream nil &apos;eof))
(defun unget-char (char stream)
  (unless (eq char &apos;eof)
    (unread-char char stream)))

(defun read-token (stream)
  ;; skip whitespace
  (loop for char = (get-char stream)
        while (typep char &apos;white-space)
        finally (unget-char char stream))
  ;; read the token
  (let ((char (get-char stream)))
    (typecase char
      (paren char)
      (t     (unget-char char stream)
             (loop for char = (get-char stream)
                   until (typep char &apos;terminator)
                   collecting char into chars
                   finally (progn
                             (unget-char char stream)
                             (return (if chars (intern (coerce chars &apos;string))
                                         (error "unexpected EOF")))))))))

(defun read-sexp (&#038;optional stream in-list-p)
  (let ((token (read-token stream)))
    (case token
      (#\) (if in-list-p token
               (error "unexpected close parenthesis")))
      (#\( (loop for sexp = (read-sexp stream t)
                 until (member sexp &apos;(#\) eof))
                 collecting sexp
                 finally (unless (eq sexp #\))
                           (error "unexpected EOF (unterminated list)"))))
      (t   token))))
</pre>
<p><a href="http://livejournal.com/users/cmm" rel="nofollow">(http://livejournal.com/users/cmm)</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: gianthare</title>
		<link>http://blogs.kakpryg.net/cmm/2007/09/17/%d0%bf%d1%80%d0%be%d1%81%d1%8b%d0%bf%d0%b0%d1%8f%d1%81%d1%8c/#comment-11601</link>
		<dc:creator>gianthare</dc:creator>
		<pubDate>Sun, 07 Oct 2007 13:57:39 +0000</pubDate>
		<guid>http://blogs.kakpryg.net/cmm/2007/09/17/%d0%bf%d1%80%d0%be%d1%81%d1%8b%d0%bf%d0%b0%d1%8f%d1%81%d1%8c/#comment-11601</guid>
		<description>Наврал. Нормально работает. 73,000 предложений засосал прямо у меня на глазах, где-то за минуту-другую.

&lt;a href="http://livejournal.com/users/gianthare" rel="nofollow"&gt;(http://livejournal.com/users/gianthare)&lt;/a&gt;</description>
		<content:encoded><![CDATA[<p>Наврал. Нормально работает. 73,000 предложений засосал прямо у меня на глазах, где-то за минуту-другую.</p>
<p><a href="http://livejournal.com/users/gianthare" rel="nofollow">(http://livejournal.com/users/gianthare)</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: gianthare</title>
		<link>http://blogs.kakpryg.net/cmm/2007/09/17/%d0%bf%d1%80%d0%be%d1%81%d1%8b%d0%bf%d0%b0%d1%8f%d1%81%d1%8c/#comment-11600</link>
		<dc:creator>gianthare</dc:creator>
		<pubDate>Sun, 07 Oct 2007 13:34:37 +0000</pubDate>
		<guid>http://blogs.kakpryg.net/cmm/2007/09/17/%d0%bf%d1%80%d0%be%d1%81%d1%8b%d0%bf%d0%b0%d1%8f%d1%81%d1%8c/#comment-11600</guid>
		<description>Только он, сука, медленный - 47М уже полчаса парсит, при том, что он себе целое CPU заграбастал.

&lt;a href="http://livejournal.com/users/gianthare" rel="nofollow"&gt;(http://livejournal.com/users/gianthare)&lt;/a&gt;</description>
		<content:encoded><![CDATA[<p>Только он, сука, медленный - 47М уже полчаса парсит, при том, что он себе целое CPU заграбастал.</p>
<p><a href="http://livejournal.com/users/gianthare" rel="nofollow">(http://livejournal.com/users/gianthare)</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: gianthare</title>
		<link>http://blogs.kakpryg.net/cmm/2007/09/17/%d0%bf%d1%80%d0%be%d1%81%d1%8b%d0%bf%d0%b0%d1%8f%d1%81%d1%8c/#comment-11593</link>
		<dc:creator>gianthare</dc:creator>
		<pubDate>Sun, 07 Oct 2007 13:27:07 +0000</pubDate>
		<guid>http://blogs.kakpryg.net/cmm/2007/09/17/%d0%bf%d1%80%d0%be%d1%81%d1%8b%d0%bf%d0%b0%d1%8f%d1%81%d1%8c/#comment-11593</guid>
		<description>Я отчаялся и написал сам мини-парсер. Полстраницы. Давно надо было это сделать.
&lt;pre&gt;
(defconstant *RB* (intern ")"))
(defconstant *LB* (intern "("))

(defun whitespace (ch)
  (or (eq ch #\ ) (eq ch #\
)))

(defmacro list2string (l)
  `(make-array (length ,l) :element-type &apos;character :initial-contents ,l))

(defun read-token (stream)
  (let ((buffer ()))
    (loop for ch = (read-char stream nil nil) do
	  (cond 
	    ((null ch) (if (null buffer) (return-from  read-token nil) (return)))
	    ((whitespace ch) (unless (null buffer) (return)))
	    ((or (eq ch #\() (eq ch #\))) (if (null buffer) (push ch buffer) (unread-char ch stream)) (return))
	    (t (push ch buffer))))
    (intern (nreverse (list2string buffer)))))
	    
(defun read-sexp (&#038;optional (stream nil) (in-list nil))
  (let ((token (read-token stream)))
    (cond 
      ((eq token *LB*) (read-list stream))
      ((eq token *RB*) (if in-list token (error "an object cannot start with #\)")))
      (t token))))

(defun read-list (stream)
  (loop for sexp = (read-sexp stream t) with ll = () do
	(cond 
	  ((null sexp) (error "Unexpected end of stream inside list"))
	  ((eq sexp *RB*) (return (nreverse ll)))
	  (t (push sexp ll)))))
&lt;/pre&gt;
Думаю можно сократить еще вдвое

&lt;a href="http://livejournal.com/users/gianthare" rel="nofollow"&gt;(http://livejournal.com/users/gianthare)&lt;/a&gt;</description>
		<content:encoded><![CDATA[<p>Я отчаялся и написал сам мини-парсер. Полстраницы. Давно надо было это сделать.</p>
<pre>
(defconstant *RB* (intern ")"))
(defconstant *LB* (intern "("))

(defun whitespace (ch)
  (or (eq ch #\ ) (eq ch #\
)))

(defmacro list2string (l)
  `(make-array (length ,l) :element-type &apos;character :initial-contents ,l))

(defun read-token (stream)
  (let ((buffer ()))
    (loop for ch = (read-char stream nil nil) do
	  (cond
	    ((null ch) (if (null buffer) (return-from  read-token nil) (return)))
	    ((whitespace ch) (unless (null buffer) (return)))
	    ((or (eq ch #\() (eq ch #\))) (if (null buffer) (push ch buffer) (unread-char ch stream)) (return))
	    (t (push ch buffer))))
    (intern (nreverse (list2string buffer)))))

(defun read-sexp (&#038;optional (stream nil) (in-list nil))
  (let ((token (read-token stream)))
    (cond
      ((eq token *LB*) (read-list stream))
      ((eq token *RB*) (if in-list token (error "an object cannot start with #\)")))
      (t token))))

(defun read-list (stream)
  (loop for sexp = (read-sexp stream t) with ll = () do
	(cond
	  ((null sexp) (error "Unexpected end of stream inside list"))
	  ((eq sexp *RB*) (return (nreverse ll)))
	  (t (push sexp ll)))))
</pre>
<p>Думаю можно сократить еще вдвое</p>
<p><a href="http://livejournal.com/users/gianthare" rel="nofollow">(http://livejournal.com/users/gianthare)</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: cmm</title>
		<link>http://blogs.kakpryg.net/cmm/2007/09/17/%d0%bf%d1%80%d0%be%d1%81%d1%8b%d0%bf%d0%b0%d1%8f%d1%81%d1%8c/#comment-11592</link>
		<dc:creator>cmm</dc:creator>
		<pubDate>Sun, 07 Oct 2007 10:34:42 +0000</pubDate>
		<guid>http://blogs.kakpryg.net/cmm/2007/09/17/%d0%bf%d1%80%d0%be%d1%81%d1%8b%d0%bf%d0%b0%d1%8f%d1%81%d1%8c/#comment-11592</guid>
		<description>&lt;q&gt;смешно, конечно, что насколько лиспообразный формат надо на Якке парсить&lt;/q&gt;

необязательно, конечно :)
ручной recursive-descent парсер можно ручками написать, больше пары страниц без вытребенек занять не должно, даже на C.

есть даже готовые библиотечки, типа вот:
http://sourceforge.net/projects/sexpr

&lt;a href="http://livejournal.com/users/cmm" rel="nofollow"&gt;(http://livejournal.com/users/cmm)&lt;/a&gt;</description>
		<content:encoded><![CDATA[<p><q>смешно, конечно, что насколько лиспообразный формат надо на Якке парсить</q></p>
<p>необязательно, конечно :)<br />
ручной recursive-descent парсер можно ручками написать, больше пары страниц без вытребенек занять не должно, даже на C.</p>
<p>есть даже готовые библиотечки, типа вот:<br />
<a href="http://sourceforge.net/projects/sexpr" rel="nofollow">http://sourceforge.net/projects/sexpr</a></p>
<p><a href="http://livejournal.com/users/cmm" rel="nofollow">(http://livejournal.com/users/cmm)</a></p>
]]></content:encoded>
	</item>
</channel>
</rss>
