- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
;;;; -*- Mode: lisp; indent-tabs-mode: nil -*-
;;; Copyright (C) 2011, Dmitry Ignatiev <[email protected]>
;;; Permission is hereby granted, free of charge, to any person
;;; obtaining a copy of this software and associated documentation
;;; files (the "Software"), to deal in the Software without
;;; restriction, including without limitation the rights to use, copy,
;;; modify, merge, publish, distribute, sublicense, and/or sell copies
;;; of the Software, and to permit persons to whom the Software is
;;; furnished to do so, subject to the following conditions:
;;; The above copyright notice and this permission notice shall be
;;; included in all copies or substantial portions of the Software.
;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
;;; DEALINGS IN THE SOFTWARE
(in-package #:neural-flow)
;; Stolen from `trivial-garbage'
#+openmcl
(defvar *weak-pointers* (cl:make-hash-table :test 'eq :weak :value))
#+(or allegro openmcl lispworks)
(defstruct (weak-pointer (:constructor %make-weak-pointer))
#-openmcl pointer)
(declaim (inline make-weak-pointer))
(defun make-weak-pointer (object)
#+sbcl (sb-ext:make-weak-pointer object)
#+(or cmu scl) (ext:make-weak-pointer object)
#+clisp (ext:make-weak-pointer object)
#+ecl (ext:make-weak-pointer object)
#+allegro
(let ((wv (excl:weak-vector 1)))
(setf (svref wv 0) object)
(%make-weak-pointer :pointer wv))
#+openmcl
(let ((wp (%make-weak-pointer)))
(setf (gethash wp *weak-pointers*) object)
wp)
#+corman (ccl:make-weak-pointer object)
#+lispworks
(let ((array (make-array 1)))
(hcl:set-array-weak array t)
(setf (svref array 0) object)
(%make-weak-pointer :pointer array)))
(declaim (inline weak-pointer-value))
(defun weak-pointer-value (weak-pointer)
"If WEAK-POINTER is valid, returns its value. Otherwise, returns NIL."
#+sbcl (values (sb-ext:weak-pointer-value weak-pointer))
#+(or cmu scl) (values (ext:weak-pointer-value weak-pointer))
#+clisp (values (ext:weak-pointer-value weak-pointer))
#+ecl (values (ext:weak-pointer-value weak-pointer))
#+allegro (svref (weak-pointer-pointer weak-pointer) 0)
#+openmcl (values (gethash weak-pointer *weak-pointers*))
#+corman (ccl:weak-pointer-obj weak-pointer)
#+lispworks (svref (weak-pointer-pointer weak-pointer) 0))
;;Red-black tree
(declaim (inline %node %nleft %nright %nparent %nred %ndata %ncode
(setf %nleft) (setf %nright) (setf %nparent)
(setf %nred) (setf %ndata) (setf %ncode)))
(defstruct (%node (:constructor %node (data code parent red))
(:conc-name %n))
(left nil :type (or null %node))
(right nil :type (or null %node))
(parent nil :type (or null %node))
(red nil)
data
(code 0 :type (integer 0 #.most-positive-fixnum)))
(declaim (inline %tree %tree-root (setf %tree-root)))
(defstruct (%tree (:constructor %tree ())
(:copier %copy-tree))
(root nil :type (or null %node)))
(declaim (inline rotate-left))
(defun %rotate-left (tree node)
(declare (type %tree tree) (type %node node)
(optimize (speed 3) (safety 0)))
(let ((right (%nright node)))
(when (setf (%nright node) (%nleft right))
(setf (%nparent (%nleft right)) node))
(if (setf (%nparent right) (%nparent node))
(if (eq node (%nleft (%nparent node)))
(setf (%nleft (%nparent node)) right)
(setf (%nright (%nparent node)) right))
(setf (%tree-root tree) right))
Lure Of Chaos 10.02.2011 20:57 # +6
lovesan 10.02.2011 21:02 # +4
А вот ебанату, сюда это кинувшему, похоже вообще программировать нельзя.
За подробностями сюда, вот: http://www.linux.org.ru/forum/development/5882910/page1#comment-5891470
vertexua 10.02.2011 21:40 # +1
vertexua 10.02.2011 21:41 # 0
istem 10.02.2011 21:45 # +2
vertexua 10.02.2011 21:47 # +4
lovesan 10.02.2011 22:15 # −3
istem 11.02.2011 00:10 # +1
lovesan 10.02.2011 21:43 # −11
Скобочек, главное, заискивающих побольше, да.
bugmenot 10.02.2011 22:06 # +2
lovesan 10.02.2011 22:14 # +1
Вот тут можно весь код посмотреть, кстати:
https://github.com/Lovesan/neural-flow
Я еще раз повторяю - то, как он выглядит, это совершенно не просто так, а ради скорости. Я выше еще ссылку дал, я там подробно рассказываю, зачем и почему оно так.
bugmenot 10.02.2011 22:22 # −2
там, где скобкота же
lovesan 10.02.2011 22:32 # −4
Спасибо, но я такие вещества не употребляю.
TheHamstertamer 18.03.2011 15:38 # −1
lovesan 10.02.2011 22:37 # 0
C_Plus_Plus_Govno 10.02.2011 22:43 # +3
lovesan 10.02.2011 22:48 # −1
Меня это просто выбешивает - я три дня из профайлера не вылезал, чтобы хоть сколько-нибудь приемлимую производительность той библиотеке придать, опустился до ручного закатывания солнца и на низком уровне оптимизированных rb-деревьев, и тут этот вот дебил, который запостил сюда мой код - кривляется как макака и несет какую-то pointless хуйню, совершенно никакими рациональными аргументами не обоснованную, типа "лисп-гавно, гыгы".
Анонимус 11.02.2011 14:39 # 0
в даже есть реализация RB деревьев в TreeMap/HashMap, и вполне приличный код например
lovesan 11.02.2011 17:06 # 0
Анонимус 11.02.2011 17:31 # −1
lovesan 11.02.2011 17:40 # 0
https://github.com/Lovesan/neural-flow/blob/master/src/tree.lisp
TarasB 11.02.2011 18:00 # −4
Анонимус 11.02.2011 18:14 # +4
фейспалм))))
guest 11.02.2011 19:21 # 0
TarasB 11.02.2011 19:21 # 0
Анонимус 11.02.2011 18:14 # −2
makc3d 13.02.2011 05:37 # 0
vertexua 10.02.2011 23:10 # −2
Анонимус 11.02.2011 14:33 # 0
Анонимус 11.02.2011 14:33 # +2
батхард детектед
ололо
Dummy00001 10.02.2011 23:16 # +5
есть еще в мире лисп который емаксом не проет насквозь?
lovesan 10.02.2011 23:30 # 0
www.sbcl.org
Для винды лучше брать версию отсюда:
http://www.siftsoft.com/inprogress/forknews.html
она пропатченная там специальным образом, stdcall-коллбэки добавлены, foreign-thread коллбэки, многопоточность нормально реализована, и прочее, ну там расписано.
Dummy00001 10.02.2011 23:56 # +3
туториал наковырял, поковыряю на досуге.
C_Plus_Plus_Govno 10.02.2011 21:37 # −2
lovesan 10.02.2011 21:47 # 0
На вполне себе пишут коммерческие приложения.
Вот, например:
http://www.itasoftware.com/products/shopping-pricing/qpx.html
Или вот, человек пишет софт для бирж:
http://13-49-ru.blogspot.com/search/label/lisp
Проблема есть, если говорить о промышленном применении. Но она в том, что инфраструктуры мало(библиотек, и так далее), и программеров на нем, соответственно.
Вообще, если заинтересует, у меня в жж можно посмотреть по тегу "lisp":
http://love5an.livejournal.com/tag/lisp
Он не такой уж страшный и особенно отличный от мейнстримных языков.
vertexua 10.02.2011 21:49 # +2
lovesan 10.02.2011 22:12 # −9
Анонимус 11.02.2011 14:40 # −1
lovesan 11.02.2011 17:07 # +3
Анонимус 11.02.2011 17:31 # −1
lovesan 11.02.2011 17:34 # −1
Lure Of Chaos 11.02.2011 19:06 # +2
C_Plus_Plus_Govno 10.02.2011 21:57 # +1
Ключевое слово "человек". Понять свой метакод ещё можно (сам написал потому что). Понять метакод, написанный другим человеком, невозможно.
lovesan 10.02.2011 22:01 # 0
DSL-и надо создавать для специфических целей, естественно, и согласовывать их использование, но тем не менее, тут ситуация не очень сильно отличается от "обычных языков", с использованием, к примеру, ANTLR.
vertexua 10.02.2011 22:07 # +1
lovesan 10.02.2011 22:12 # −7
istem 11.02.2011 00:01 # +3
(давайте лучше про коммерческое использование лиспа ещё)
lovesan 11.02.2011 17:07 # +1
degeron 11.02.2011 21:21 # 0
guest 10.02.2011 22:28 # 0
nil 26.02.2011 18:07 # 0
koodeer 10.02.2011 22:50 # −3
Я щетаю, что юзать Лисп и Схему вполне можно. Однако, сейчас есть современные более мощные функциональные (а точнее, мультипарадигменные) языки с метапрограммированием. Маленькая подсказочка - это Nemerle ;)
lovesan 10.02.2011 22:55 # +1
Она же совершенно к продакшн не готова - чисто исследовательский проект. Для CL того же как минимум 3 коммерческих вендора компиляторы поставляют. Плюс, все же там макросы не настолько удобно использовать, как в лиспах(типизированное AST это излишнее усложнение, на самом деле - Nemerle не первая попытка, которая провалилась). ОО-система, опять же, до CLOS не дотягивает, сигнального протокола нет.
Лучше уж Clojure.
guest 10.02.2011 23:11 # +3
da4ever 10.02.2011 23:29 # +7
Язык как язык. Скобочки, отступы, хеловорлды, все дела.
А то что поругаться сюда пришли - это вы конечно молодцы.
Dummy00001 11.02.2011 00:02 # +3
vertexua 11.02.2011 00:35 # −2
p5ych0 11.02.2011 03:02 # −2
Анонимус 11.02.2011 14:35 # +3
геленджик -- это же родина гипертекстового интернета!!!!
lovesan 11.02.2011 17:08 # 0
Lure Of Chaos 11.02.2011 16:07 # +3
bugmenot 11.02.2011 16:18 # 0
Lure Of Chaos 11.02.2011 16:20 # +2
eth0 11.02.2011 19:51 # +2
TheHamstertamer 13.05.2011 16:16 # −1
wvxvw 11.02.2011 18:16 # +5
Анонимус 11.02.2011 19:36 # −2
nil 26.02.2011 18:10 # 0