forked from av83/wizard
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdoc.txt
340 lines (279 loc) · 15.2 KB
/
doc.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
+++
sbcl --lose-on-corruption --disable-ldb --dynamic-space-size 1024
(require 'asdf)
(asdf:oos 'asdf:load-op 'swank)
(setf swank::*loopback-interface* "0.0.0.0")
(swank:create-server :coding-system "utf-8-unix" :dont-close t)
(swank:create-server :coding-system "utf-8-unix" :dont-close t :port 8008)
ssh -2 -N -f -L 4005:localhost:4005 [email protected]
(defun clear ()
(loop :for var :being :the :symbols :in :wizard.impl.routes :do (unintern var))
(restas:reconnect-all-routes))
(clear)
(restas:start '#:wizard :port 8081)
(restas:debug-mode-on)
[01:37] rigidus> я бы хотел, чтобы во время доступа (на чтение или
запись) к слоту некоего объекта вызывался метод этого объекта. куда
смотреть?
[06:03] dmitry_vk> rigidus: это можно сделать через MOP. См. методы
slot-value-using-class и (setf slot-value-using-class)
[21:09] rigidus> dmitry_vk: а что означает эта декларация? (declaim (ftype (function (integer &key (:on-error symbol))) f))
[21:09] dmitry_vk> Что f - это функция, которая принимает одно целое и
имеет ключевой параметр :on-error типа symbol
[21:10] dmitry_vk> LinkFly: хм, нет. :on-error - это имя параметра
(имя - это keyword), а symbol - его тип
[21:11] rigidus> а тип возвращаемого значения этой функции указать
можно?
[21:11] dmitry_vk> Да, можно, после списка аргументов:
(ftype (function (arg-1-type .. arg-n-type) result-type))
[21:12] LinkFly> можно даже нескольких через (values result-type ...)
Кто бы там что ни говорил, а программирование под Unix не может не
радовать своей простотой. Когда я писал программы под Windows
взаимодействие с ОСью было куда менее простым и прозрачным. А если
сюда ещё добавить мощь языка Common Lisp, а также хорошую лисп-систему
(например SBCL), то разработка поднимается на принципиально другой
уровень по сравнению с традиционным программированием на Си. Ниже
представлена ф-ия безопасной записи в файл. Безопасной в том смысле,
что если несколько процессов используют её для записи в один и тот же
файл, то возможность коллизии (т.е. порчи записываемых одновременно
данных) абсолютно исключена.
(defparameter *safe-write-sleep* 0.01)
(defun safe-write (pathname string &aux stream)
(setf stream (open pathname :direction :output :if-does-not-exist :create :if-exists :append))
(unwind-protect
(loop
until (block try-lock
(handler-bind ((error (lambda (condition)
(if (= sb-posix:eagain
(sb-posix:syscall-errno condition))
(return-from try-lock)
(error condition)))))
(sb-posix:lockf stream sb-posix:f-tlock 0)
(princ string stream)
(close stream)))
do (sleep *safe-write-sleep*))
(close stream)))
http://linkfly.livejournal.com/2891.html
;; Получение имени пользователя
SB-POSIX> (defun get-username (&aux (pid (getpid))) ;(getenv "USERNAME"))
(passwd-name
(getpwuid
(stat-uid
(stat (format nil "/proc/~A" pid))))))
[16:38] laser1234> (setenv "CL_SOURCE_REGISTRY"
"(:source-registry
(:tree \"/home/user/lisp/libs/\")
(:tree \"/home/user/projects/\")
:inherit-configuration)")
[16:38] laser1234> Кусок init.el
[16:38] laser1234> После этого lisp/libs/ и projects/ сканируются
рекурсивно.
[16:38] laser1234> (setenv "CL_SOURCE_REGISTRY"
"(:source-registry
(:tree \"/home/user/lisp/libs/\")
(:tree \"/home/user/projects/\")
:inherit-configuration)")
[16:38] laser1234> Кусок init.el
[16:38] laser1234> После этого lisp/libs/ и projects/ сканируются
рекурсивно.
[17:37] laser1234> Ну хорошо, тогда по старинке (push #"path/to/libs/"
asdf:*central-registry*)
[17:39] jsv> а чего через окружение, а не в
~/.config/common-lisp/source-registry.conf?
Хочется странного: отметить блок в буфере, нажать на какую-нибудь
кнопку так, чтобы блок подался некоему скрипту на stdin, затем то что
скрипт выдаст в stdout, emacs вставил в буфер вместо выделенного
блока.
Запускать скрипты awk, и прочие.
Есть уже подобная фича?
C-u M-|
http://www.emacswiki.org/emacs/ExecuteExternalCommand
[19:47] edgbla> а как сделать чтобы диред не открывал стопицот буферов
когда шастаешь по каталогам? мене вроде одного достаточно...
[20:01] Ioda> edgbla: dired-single.el
[2011-10-11 02:49] LinkFly> rigidus: с работающими тредами это больно
круто:) но можно попробовать их притормозить, сохранить образ и потом
запустить. Код подготавливающий сохранение образа можно добавить как
хук, в список sb-ext:*save-hooks* (определенные там ф-ии срабатывают
при вызове save-lisp-and-die. Ф-ию с кодом, восстанавливающим
состояние, можно поместить в значение ключа :top-level ф-ии
save-lisp-and-die.
;; Поиск и выполнение произвольных методов объекта
(defclass test-obj ()
((test-method :initarg :test-method :initform nil :accessor a-test-method)))
(defparameter *test-example*
(make-instance 'test-obj :test-method 'a))
(funcall (closer-mop:method-function
(find-method #'a-test-method '() (mapcar #'find-class '(test-obj))))
(list *test-example*) '())
[17:02] dmitry_vk> "Open Implementations and Metaobject Protocols", by
Gregor Kiczales and Andreas Paepcke - ИМХО, более хорошее введение в
суть MOP'а, чем AMOP
[01:02] LinkFly> ещё есть slime-list-threads, hot key - C-c C-x t -
там можно манипулировать потоками
[01:15] LinkFly> rigidus: разобрался с буфером? Тм очень просто: ? -
описание команд. Можно выделить несколько потоков, как обычно
выделяешь текст, нажать k - и они убьются, достаточно удобно.
[22:40] [email protected]> https://github.com/Zeldan,
[email protected] для почты и чата...
http://www.slideshare.net/chaitanyagupta/slime-1180051
10. Evaluation
* C-x C-e M-x slime-eval-last-expression
* C-M-x M-x slime-eval-last-defun
* C-c C-r M-x slime-eval-region
11. Compilation
* C-c C-c M-x slime-compile-defun
* C-c C-k M-x slime-compile-and-load-file
* M-n M-x slime-next-note
* M-p M-x slime-previous-note
12. Completion
* TAB M-x slime-complete-symbol
* M-TAB M-x slime-fuzzy-complete-symbol
13. Documentation
* SPC M-x slime-space
* C-c C-d d M-x slime-describe-symbol
* C-c C-d a M-x slime-apropos
* C-c C-d h M-x slime-hyperspec-lookup
14. Finding Definitions
* M-. M-x slime-edit-definition
* M-, M-* M-x slime-pop-find-definition-stack
* (the “Meta-point” commands)
15. Inspector
* C-c I M-x slime-inspect
* Some Inspector commands
o RET M-x slime-inspector-operate-on-point
o l M-x slime-inspector-pop
o n M-x slime-inspector-next
o M-RET M-x slime-inspector-copy-down
16. Cross-reference
* C-c C-w c M-x slime-who-calls
* C-c C-w w M-x slime-calls-who
* C-c C-w r M-x slime-who-references
* C-c C-w b M-x slime-who-binds
* C-c C-w s M-x slime-who-sets
17. Disassembly
* C-c M-d M-x slime-disassemble-symbol
* C-c C-t M-x slime-toggle-trace-definition
* M-x slime-untrace-all
18. SLDB: the SLIME debugger
* Examining Frames
o t M-x sldb-toggle-details
o v M-x sldb-show-source
o e M-x sldb-eval-in-frame
o i M-x sldb-inspect-in-frame
19. SLDB: the SLIME debugger
* Frame Navigation
o n M-x sldb-down
o p M-x sldb-up
o M-n M-x sldb-details-down
o M-p M-x sldb-details-up
20. SLDB: the SLIME debugger
* Miscellaneous commands
o r M-x sldb-restart-frame
o R M-x sldb-return-from-frame
o C M-x sldb-inspect-condition
o q M-x sldb-quit
21. How CL helps
* eval
* compile, compile-file, load
* describe, documentation
* apropos
* sb-introspect:who-calls, sb-introspect:who-references,
etc.
* disassemble
* trace, step
* inspect
# CL Resources
* Paredit -- http://mumble.net/~campbell/emacs/paredit.el
# CL Resources
* Books
o Practical Common Lisp (by Peter Seibel)
http://www.gigamonkeys.com/book/
o Common Lisp: A Gentle Introduction to Symbolic Computation
http://www-cgi.cs.cmu.edu/afs/cs.cmu.edu/user/dst/www/LispBook/index.html
o On Lisp (by Paul Graham)
http://www.paulgraham.com/onlisp.html
o Paradigms of AI Programming: Case Studies in Common Lisp
(by Peter Norvig) http://norvig.com/paip.html
o Structure and Interpretation of Computer Programs (by
Harold Abelson and Gerald Jay Sussman with Julie Sussman)
http://mitpress.mit.edu/sicp/
# CL Resources
* CL Tutorials
o Casting SPELs in Lisp
http://www.lisperati.com/casting.html
o A Tutorial on Conditions and Restarts
http://chaitanyagupta.com/lisp/restarts.html
o Lisp for the Web
http://www.adampetersen.se/articles/lispweb.htm
http://habrahabr.ru/blogs/algorithm/132128/ - Shift-OR
[01:36] rigidus> Ну строго говоря я хотел бы делать всякие вещи после
того как пришел запрос, но до того как он начал роутиться
[01:36] rigidus> мне для этого использовать декораторы или что?
[01:37] rigidus> archimag: ?
[01:37] archimag> rigidus: да
[01:37] rigidus> archimag: ага, ок
[01:37] archimag> хотя
[01:37] archimag> если до того, как он начал роутиться
[01:37] archimag> то не
[01:37] rigidus> а как быть?
[01:38] archimag> надо на уровне acceptor перегружать
[01:38] rigidus> это как?
[01:38] rigidus> я бы хотел иметь (defmethod restas :around... ^_^
[01:38] archimag> определяешь свой класс acceptor, который наследует
от restas-acceptor
[01:39] archimag> ну что бы сделать свой defmethod надо свой класс
иметь
[01:39] archimag> вот, можно сделать наследника от restas-acceptor
[01:39] rigidus> мне бы пример кода, а то боюсь запутаться и уйти не
туда
[01:39] archimag> и тупо хак, для restas::*acceptors* сделать
change-class
[01:40] archimag> посмотри код restas/src/hunchentoot.lisp
[01:40] archimag> я сейчас тут не могу долго присутствовать
[01:41] archimag> или напиши в форуме, там за несколько дней можно
будет чего-нибудь соорудить
[01:41] rigidus> хорошо, напишу на форуме
[01:45] archimag> rigidus: смотри пример
https://github.com/archimag/restas/blob/master/example/custom-acceptor.lisp
[01:46] archimag> rigidus: тока нужен restas из git
[01:46] archimag> rigidus: таким же образом определяешь свой acceptor
и переопределяешь для него что хочешь, подробности в доке на
Hunchentoot
[01:47] rigidus> ага, ок, а почему нужен restas из git? что-то
обновилось?
[01:48] rigidus> логгинг вижу, а свой функционал добавлять куда - не
понимаю
[01:49] archimag> теперь в restas:start появился ключ :acceptor-class,
там можно указать свой класс акцептора
[01:50] archimag> опеределяешь свой acceptor, определяешь для него что
хочешь
[01:50] archimag> http://weitz.de/hunchentoot/#acceptors
[01:51] archimag> hunchentoot:acceptor-dispatch-request - основной
метод, в котором происходит обработка запроса
[01:52] archimag> делаешь для него around и всё
[01:52] archimag>
http://weitz.de/hunchentoot/#acceptor-dispatch-request
[02:08] rigidus> Большое спасибо!
[2011-11-28 01:49] archimag> теперь в restas:start появился ключ
:acceptor-class, там можно указать свой класс акцептора
[2011-11-28 01:50] archimag> опеределяешь свой acceptor, определяешь
для него что хочешь
[2011-11-28 01:50] archimag> http://weitz.de/hunchentoot/#acceptors
[2011-11-28 01:51] archimag> hunchentoot:acceptor-dispatch-request -
основной метод, в котором происходит обработка запроса
[2011-11-28 01:52] archimag> делаешь для него around и всё
[17:38] Macro> а есть ли способ сказать (format) в CL чтобы он nil не
печатал вообще?
[17:39] Macro> например (format nil "~a" (foo)), если foo вернёт nil -
то будет напечатано "NIL", а мне надо чтобы было ""
[17:39] Macro> а если (foo) вернёт число или строку - то нужно чтобы
была строка или число напечатано
[17:41] jsv> ~@[~a~]
[2011-12-08 01:05] LinkFly> в SBCL переданные параметры можно получить
так: SB-EXT:*POSIX-ARGV*
http://gq.net.ru/2009/12/16/git-history-rewrite/ - Редактирование
истории GIT
emacs:help
C-h r m dired
C-h i d m dired-x