просыпаясь
(для памяти, ничего интересного)
Берлин как-то очень близок к моему представлению об идеальном городе.
больше по этому поводу особо сказать и нечего, пожалуй.
из наблюдений:
синяк с трогательно дребезжащим рюкзаком заходит в поезд. улыбается народу этак ласково. народ деликатно прихватывает сумки покрепче.
синяк достаёт из рюкзака бутыку с пивом. народ качает головой друг другу, одна туристка даже цокает языком.
выпив пива, синяк растягивает улыбку до состояния “ну, жизнь вообще уже удалась”, одевает элегантные очки, достаёт из кармана навороченный мобильник и начинает по нему интеллигентно и самозабвенно строчить эсэмэски.
на многих углах стоят большие преведливые медведы, не знаю по какому поводу.
в Сони-центре музей лего, у входа стоит жираф высотой метров семь, красивый. сделан из лего, интересно с клеем или без.
дикое количество матрасных магазинов, почти как кофеен.
во всех ресторациях и кофейнях можно курить.
вчера пять минут не мог перейти улицу, потому что по ней ехала процессия на роликах, со свистками.
отсутствие фотоаппарата приятно расслабляет.
солнышко светит, воздухом можно дышать.
похоже, правильный для меня срок пребывания не по делу в симпатичном городе — 3-4 дня. не исключаю, что процесс можно повторять.
не знаю чем именно так радуют большие живые города, принимая во внимание полную мою нерасположенность к эксплуатации традиционных городских развлекалочек (как то “ночной жизни”, музеев и т.д.), а вот поди ж ты.
мимо проехала нехудая дама средних лет на самокате. ну да, видимо вот этим и радуют.
говорят, распогодилось буквально в последние несколько дней, а так лето в этом году не задалось.
Zdorovo, chto s'ezdil.
S proshedshim DR tebya, a takje s proshedshei godovshinoi svad'by :-))
(http://livejournal.com/users/lavinya)
во всех ресторациях и кофейнях можно курить
надо было видеть лица людей за соседним столиком, когда я их в 98 спросила будут ли они майндать, если я закурю :)
но берлин я люблю не только за это.
(http://livejournal.com/users/tercia)
медвед - это тотем и часть герба Берлина:)
(http://livejournal.com/users/fyysik)
http://kunstkamera.livejournal.com/168317.html
(http://livejournal.com/users/saccovanzetti)
хороший подарок, да!!!
(http://livejournal.com/users/dishu)
Привет тебе, расслабленному! Завидую.
(http://livejournal.com/users/dejavit)
Отрываесся?
(http://livejournal.com/users/raptor_r)
да даже часть названия, чего уж там. :)
но больно их много, и выглядит это как мероприятие.
(http://livejournal.com/users/cmm)
да, спасибо за напоминание.
(http://livejournal.com/users/cmm)
вернулся уже. :(
(http://livejournal.com/users/cmm)
угу.
я в основном держался добропорядочной буржуазной части города, потому что без понимания немецкого мне в том же Кройцберге было слегка напряжно. надо выучить немецкий и съездить ещё.
(http://livejournal.com/users/cmm)
ни гавари, слющай!
(http://livejournal.com/users/cmm)
шпасиба :)
(http://livejournal.com/users/cmm)
это ничего, вот теперь зато у меня ломка.
(http://livejournal.com/users/cmm)
увы
(http://livejournal.com/users/aburachil)
недолго осталось, я понимаю.
(http://livejournal.com/users/cmm)
почему?
(http://livejournal.com/users/aburachil)
ну Европарламент-то, поди, не дремлет.
хотя с берлинцев станется в любом случае наплевать. :)
(http://livejournal.com/users/cmm)
Европарламент мало что решает, к сожалению, и его решения отдельные правительства могут совершенно легально годами игнорировать. Законы принятые европейским парламентом не имеют, к сожалению, прямой силы. А что, европарламент как-то высказался про курение в кабаках?
(http://livejournal.com/users/aburachil)
скажем так: если бы высказался, у меня бы когнитивного диссонанса не возникло.
а так не знаю.
(http://livejournal.com/users/cmm)
Скажи мне, как фанат Лиспа, есть какой-нибудь вменяемый способ прочитать файл, который состоит как бы из s-exp, но при этом относится к точкам, запятым и прочей лабуде как к обычным буквам, т.е. считать точку как символ, а не конструктор dotted pair и т.п.
(http://livejournal.com/users/gianthare)
можно, в определённых пределах.
например, так:
(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)
Спасибо,
почти идеально, основная неувязка с пунктом 1) разрывает n't на два слова и сдвоенные одинарные кавычки.
А чем плохо, то, что все интернируется? То что сборщик мусора их потом не удаляет? Зато каждое слово только один раз в памяти сохраняется. А в строки мне вроде и не надо их обращать.
А парсить ручками, или есть снандартные средства?
(http://livejournal.com/users/gianthare)
угу, на #\' тоже надо read-as-is повесить.
есть всякие генераторы парсеров, усё как у людёв.
я ими никакими не пользовался, правда, так что ничего умного сказать не могу.
cl-yacc должен выглядеть достаточно привычно, наверно.
(http://livejournal.com/users/cmm)
> угу, на #\' тоже надо read-as-is повесить.
да, понятно, я так и сделал, мне просто запомнилось, что это не помогло, а сейчас я проверил и нормально
> cl-yacc должен выглядеть достаточно привычно, наверно.
посмотрю, спасибо
смешно, конечно, что насколько лиспообразный формат надо на Якке парсить
(http://livejournal.com/users/gianthare)
необязательно, конечно :)
ручной recursive-descent парсер можно ручками написать, больше пары страниц без вытребенек занять не должно, даже на C.
есть даже готовые библиотечки, типа вот:
http://sourceforge.net/projects/sexpr
(http://livejournal.com/users/cmm)
Я отчаялся и написал сам мини-парсер. Полстраницы. Давно надо было это сделать.
(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)
Только он, сука, медленный - 47М уже полчаса парсит, при том, что он себе целое CPU заграбастал.
(http://livejournal.com/users/gianthare)
Наврал. Нормально работает. 73,000 предложений засосал прямо у меня на глазах, где-то за минуту-другую.
(http://livejournal.com/users/gianthare)
или так (не сильно короче, зато типа идиоматичнее):
(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)
Да, симпатично, особенно coerce хорош, а то я уже обыскался нормальной функции, которая из списка стринг сделает.
А чем хорош deftype, кроме того, что потом можно typep делать?
(http://livejournal.com/users/gianthare)
декларативностью.
но это дело вкуса, в общем.
(http://livejournal.com/users/cmm)
А вот у меня к тебе еще вопрос - я в функцию передал accessor, который defclass определил, типа
#'access-slot
а теперь хочу этот slot изменить внутри функции, т.е. вызвать как бы (setf (access-slot obj) val), но используя, естественно не имя accessor'а, а этот переданный параметр. Это реально, вообще, потому что я как-то запутался. Пытался через get-setf-что-то там, но только хуже стало
(http://livejournal.com/users/gianthare)
не-а, нереально.
но ты можешь точно также передать #'(setf access-slot).
(http://livejournal.com/users/cmm)
… либо передавать имя слота и использовать slot-value (и евойный, соответственно, setf-метод).
… либо передавать маленький такой псевдо-пойнтер в виде closure, который либо возвращает значение слота, либо меняет его на новое, в зависимости от количества параметров.
но ваще какой-то дизайн у тебя неортодоксальный :)
(http://livejournal.com/users/cmm)