blogs/cmm

September 17, 2007

просыпаясь

Filed under: Imported — cmm @ 1:33 pm

(для памяти, ничего интересного)

Берлин как-то очень близок к моему представлению об идеальном городе.
больше по этому поводу особо сказать и нечего, пожалуй.
из наблюдений:
синяк с трогательно дребезжащим рюкзаком заходит в поезд.  улыбается народу этак ласково.  народ деликатно прихватывает сумки покрепче.
синяк достаёт из рюкзака бутыку с пивом.  народ качает головой друг другу, одна туристка даже цокает языком.
выпив пива, синяк растягивает улыбку до состояния “ну, жизнь вообще уже удалась”, одевает элегантные очки, достаёт из кармана навороченный мобильник и начинает по нему интеллигентно и самозабвенно строчить эсэмэски.
на многих углах стоят большие преведливые медведы, не знаю по какому поводу.
в Сони-центре музей лего, у входа стоит жираф высотой метров семь, красивый.  сделан из лего, интересно с клеем или без.
дикое количество матрасных магазинов, почти как кофеен.
во всех ресторациях и кофейнях можно курить.
вчера пять минут не мог перейти улицу, потому что по ней ехала процессия на роликах, со свистками.
отсутствие фотоаппарата приятно расслабляет.
солнышко светит, воздухом можно дышать.
похоже, правильный для меня срок пребывания не по делу в симпатичном городе — 3-4 дня.  не исключаю, что процесс можно повторять.
не знаю чем именно так радуют большие живые города, принимая во внимание полную мою нерасположенность к эксплуатации традиционных городских развлекалочек (как то “ночной жизни”, музеев и т.д.), а вот поди ж ты.
мимо проехала нехудая дама средних лет на самокате.  ну да, видимо вот этим и радуют.
говорят, распогодилось буквально в последние несколько дней, а так лето в этом году не задалось.

RSS feed | Trackback URI

35 Comments »

Comment by lavinya |Link
2007-09-17 12:13:56

Zdorovo, chto s'ezdil.
S proshedshim DR tebya, a takje s proshedshei godovshinoi svad'by :-))

(http://livejournal.com/users/lavinya)

 
Comment by tercia |Link
2007-09-17 12:19:01

во всех ресторациях и кофейнях можно курить
надо было видеть лица людей за соседним столиком, когда я их в 98 спросила будут ли они майндать, если я закурю :)

но берлин я люблю не только за это.

(http://livejournal.com/users/tercia)

 
Comment by fyysik |Link
2007-09-17 12:27:21

медвед - это тотем и часть герба Берлина:)

(http://livejournal.com/users/fyysik)

 
 
Comment by dishu |Link
2007-09-17 19:54:54

хороший подарок, да!!!

(http://livejournal.com/users/dishu)

 
Comment by dejavit |Link
2007-09-18 00:42:24

Привет тебе, расслабленному! Завидую.

(http://livejournal.com/users/dejavit)

 
Comment by raptor_r |Link
2007-09-18 10:00:08
 
Comment by cmm |Link
2007-09-18 10:04:26

да даже часть названия, чего уж там. :)
но больно их много, и выглядит это как мероприятие.

(http://livejournal.com/users/cmm)

 
Comment by cmm |Link
2007-09-18 10:04:51

да, спасибо за напоминание.

(http://livejournal.com/users/cmm)

 
Comment by cmm |Link
2007-09-18 10:05:14

вернулся уже. :(

(http://livejournal.com/users/cmm)

 
Comment by cmm |Link
2007-09-18 10:07:27

но берлин я люблю не только за это.

угу.
я в основном держался добропорядочной буржуазной части города, потому что без понимания немецкого мне в том же Кройцберге было слегка напряжно.  надо выучить немецкий и съездить ещё.

(http://livejournal.com/users/cmm)

 
Comment by cmm |Link
2007-09-18 10:07:51

ни гавари, слющай!

(http://livejournal.com/users/cmm)

 
Comment by cmm |Link
2007-09-18 10:08:06
 
Comment by cmm |Link
2007-09-18 10:09:15

это ничего, вот теперь зато у меня ломка.

(http://livejournal.com/users/cmm)

 
Comment by aburachil |Link
 
Comment by cmm |Link
2007-09-18 12:40:34

недолго осталось, я понимаю.

(http://livejournal.com/users/cmm)

 
Comment by aburachil |Link
 
Comment by cmm |Link
2007-09-18 13:15:10

ну Европарламент-то, поди, не дремлет.
хотя с берлинцев станется в любом случае наплевать. :)

(http://livejournal.com/users/cmm)

 
Comment by aburachil |Link
2007-09-18 13:32:05

Европарламент мало что решает, к сожалению, и его решения отдельные правительства могут совершенно легально годами игнорировать. Законы принятые европейским парламентом не имеют, к сожалению, прямой силы. А что, европарламент как-то высказался про курение в кабаках?

(http://livejournal.com/users/aburachil)

 
Comment by cmm |Link
2007-09-18 14:00:55

А что, европарламент как-то высказался про курение в кабаках?

скажем так: если бы высказался, у меня бы когнитивного диссонанса не возникло.
а так не знаю.

(http://livejournal.com/users/cmm)

 
Comment by gianthare |Link
2007-09-23 17:00:47

Скажи мне, как фанат Лиспа, есть какой-нибудь вменяемый способ прочитать файл, который состоит как бы из s-exp, но при этом относится к точкам, запятым и прочей лабуде как к обычным буквам, т.е. считать точку как символ, а не конструктор dotted pair и т.п.

(http://livejournal.com/users/gianthare)

 
Comment by cmm |Link
2007-09-23 18:54:56

можно, в определённых пределах.

например, так:

(defvar *my-readtable* (copy-readtable))

(defun read-as-is (stream char)
  (declare (ignore stream))
  char)

(set-macro-character #\. #'read-as-is t *rt*)
(set-macro-character #\: #'read-as-is t *rt*)
(set-macro-character #\# #'read-as-is t *rt*)
(setf (readtable-case *rt*) :preserve)

(defun read-almost-but-not-quite-sexp (stream)
  (let ((*read-eval* nil)
        (*readtable* *rt*))
    (read stream)))

“определённые пределы” заданы прискорбной негибкостью стандартного ридера.  к примеру:

* “характер” значков менять нельзя.  #\1 — это цифра, и никаких гвоздей, #\a — буква, #\. — точка.  из-за этого “a.” прочтётся как задумано, а “.a” нет.

* (менее фатально) невыделенные кавычками символы будут читаться именно как символы — они будут “интернироваться” в текущем “пакете” (тем самым засоряя собой память) и обращать их в строки придётся явным образом (с помощью функций symbol-name или string).

вроде бы в каких-то вариантах Scheme тоже есть программируемые ридеры, возможно они поразумнее.

ещё описанный тобой синтаксис весьма нескложно просто запарсить. :)

(http://livejournal.com/users/cmm)

 
Comment by gianthare |Link
2007-10-07 11:38:52

Спасибо,
почти идеально, основная неувязка с пунктом 1) разрывает n't на два слова и сдвоенные одинарные кавычки.
А чем плохо, то, что все интернируется? То что сборщик мусора их потом не удаляет? Зато каждое слово только один раз в памяти сохраняется. А в строки мне вроде и не надо их обращать.

А парсить ручками, или есть снандартные средства?

(http://livejournal.com/users/gianthare)

 
Comment by cmm |Link
2007-10-07 12:56:41

разрывает n't на два слова

угу, на #\' тоже надо read-as-is повесить.

А парсить ручками, или есть снандартные средства?

есть всякие генераторы парсеров, усё как у людёв.
я ими никакими не пользовался, правда, так что ничего умного сказать не могу.
cl-yacc должен выглядеть достаточно привычно, наверно.

(http://livejournal.com/users/cmm)

 
Comment by gianthare |Link
2007-10-07 13:06:37

> угу, на #\' тоже надо read-as-is повесить.
да, понятно, я так и сделал, мне просто запомнилось, что это не помогло, а сейчас я проверил и нормально

> cl-yacc должен выглядеть достаточно привычно, наверно.
посмотрю, спасибо
смешно, конечно, что насколько лиспообразный формат надо на Якке парсить

(http://livejournal.com/users/gianthare)

 
Comment by cmm |Link
2007-10-07 13:34:42

смешно, конечно, что насколько лиспообразный формат надо на Якке парсить

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

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

(http://livejournal.com/users/cmm)

 
Comment by gianthare |Link
2007-10-07 16:27:07

Я отчаялся и написал сам мини-парсер. Полстраницы. Давно надо было это сделать.

(defconstant *RB* (intern ")"))
(defconstant *LB* (intern "("))

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

(defmacro list2string (l)
  `(make-array (length ,l) :element-type '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 (&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)))))

Думаю можно сократить еще вдвое

(http://livejournal.com/users/gianthare)

 
Comment by gianthare |Link
2007-10-07 16:34:37

Только он, сука, медленный - 47М уже полчаса парсит, при том, что он себе целое CPU заграбастал.

(http://livejournal.com/users/gianthare)

 
Comment by gianthare |Link
2007-10-07 16:57:39

Наврал. Нормально работает. 73,000 предложений засосал прямо у меня на глазах, где-то за минуту-другую.

(http://livejournal.com/users/gianthare)

 
Comment by cmm |Link
2007-10-07 18:49:11

или так (не сильно короче, зато типа идиоматичнее):

(deftype white-space () '(member #\Space #\Newline #\Tab))
(deftype paren       () '(member #\) #\())
(deftype terminator  () '(or white-space paren (eql eof)))

(defun get-char (stream)
  (read-char stream nil 'eof))
(defun unget-char (char stream)
  (unless (eq char 'eof)
    (unread-char char stream)))

(defun read-token (stream)
  ;; skip whitespace
  (loop for char = (get-char stream)
        while (typep char '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 'terminator)
                   collecting char into chars
                   finally (progn
                             (unget-char char stream)
                             (return (if chars (intern (coerce chars 'string))
                                         (error "unexpected EOF")))))))))

(defun read-sexp (&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 '(#\) eof))
                 collecting sexp
                 finally (unless (eq sexp #\))
                           (error "unexpected EOF (unterminated list)"))))
      (t   token))))

(http://livejournal.com/users/cmm)

 
Comment by gianthare |Link
2007-10-08 08:23:35

Да, симпатично, особенно coerce хорош, а то я уже обыскался нормальной функции, которая из списка стринг сделает.
А чем хорош deftype, кроме того, что потом можно typep делать?

(http://livejournal.com/users/gianthare)

 
Comment by cmm |Link
2007-10-08 09:23:41

чем хорош deftype, кроме того, что потом можно typep делать?

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

(http://livejournal.com/users/cmm)

 
Comment by gianthare |Link
2007-11-19 21:24:12

А вот у меня к тебе еще вопрос - я в функцию передал accessor, который defclass определил, типа
#'access-slot
а теперь хочу этот slot изменить внутри функции, т.е. вызвать как бы (setf (access-slot obj) val), но используя, естественно не имя accessor'а, а этот переданный параметр. Это реально, вообще, потому что я как-то запутался. Пытался через get-setf-что-то там, но только хуже стало

(http://livejournal.com/users/gianthare)

 
Comment by cmm |Link
2007-11-19 21:51:51

Это реально, вообще, потому что я как-то запутался.

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

(http://livejournal.com/users/cmm)

 
Comment by cmm |Link
2007-11-19 22:04:47

… либо передавать имя слота и использовать slot-value (и евойный, соответственно, setf-метод).
… либо передавать маленький такой псевдо-пойнтер в виде closure, который либо возвращает значение слота, либо меняет его на новое, в зависимости от количества параметров.

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

(http://livejournal.com/users/cmm)

 

You must be logged in to post a comment.

Or use your OpenID:

Trackback responses to this post

Powered by WordPress