freenode/#lisp - IRC Chatlog
Search
17:39:24
jackdaniel
Devon: advices are supported only by CCL I think (I don't count commercial implementations because I don't use them so don't know)
17:40:16
jackdaniel
s/commercial/locked down/ - corrected myself because foss implementation may be commercial, why not
17:49:35
Devon
Any CL lacking DEFADVICE is an outlier, it may not be in the spec but it's in the culture.
17:50:46
jackdaniel
(probably because sbcl doesn't have it though, most libraries are developed with sbcl ;)
17:52:52
pjb
Adding an advice would require recompiling all the files that use the adviced function.
17:53:02
jackdaniel
actually more like: practice makes culture -thinking otherwise is called social engineering ;-)
17:53:53
jasom
pjb: adding an advice would have exactly the same limits as redefining a function; and people do that with C-c C-c all the time
17:55:14
phoe
"There are three kinds of advice that may be defined: before, after and around advice."
17:56:25
Shinmera
On SBCL you can emulate advice by using (trace foo :report NIL :condition/-after/-all stuff)
17:57:04
makomo
could you use something like ensure-generic-function combined with standard method combination?
17:57:52
pjb
OR, you can not use cl:defun, instead define your own defun macro, implement the conforming tricks so that any library compiled will use your:defun and then you can conformingly have a defadvice that would work even with inlined function calls.
18:06:24
makomo
what's the best way to have something like an enumeration, i.e. a mapping from symbols to values?
18:07:45
makomo
i want it to hold globally, i don't want to have to wrap everything into a symbol-macrolet
18:11:16
Shinmera
Or just define a function that does an ecase to return the value, and have the function exist at compile-time with eval-when
18:11:54
makomo
i guess that's also an option. i suppose i could write a macro that would automatically give me the other direction as well right?
18:12:20
Shinmera
In that case I'd store the map as an alist in a variable, and define two functions to do the lookup in either direction.
18:12:33
scymtym
emacs' object system has an interesting combination of CLOS and an advice facility: method qualifiers can always be augmented with :extra STRING, basically allowing the "same" method to be defined multiple times, like named pieces of advice
19:14:12
pjb
sjl: I would be careful with mixing conventions. perhaps choosing between (defconstant account-state.active 1) (defconstant account-state.inactive 2) or (defconstant +account-state-active+ 1) (defconstant +account-state-inactive+ 2) would be preferable.
19:15:39
pjb
foo.bar has a conotation of functional abstraction (accessing a slot in a class or structure). So there's very little probability of anybody trying to bind such a symbol.
19:16:04
Colleen
Bike: drmeister said 13 hours, 54 minutes ago: I disabled cl:row-major-aref and cl:row-major-ast temporarily
19:21:08
jmercouris
I'm trying to add hooks into my program, I was thinking about making them exist for every defined-command (user invokable defun)
19:21:51
jmercouris
another thought I had was creating some macro like (define-hook :hook-name) that you can place inline, and any things registered to :hook-name will be invoked after that line of cod
19:23:02
jmercouris
the only issue with (define-hook) is that as it may be within a defun body, it won't be a top level form so (defun register-to-hook (function hook) ...) may not necessarily be able to register against a non-existent hook
19:23:36
jmercouris
though I guess that register-to-hook may make a binding for the hook if it does not exist, and then (define-hook) will just use that hook
19:27:36
phoe
client code can either push to the toplevel value of *something-hooks* for a global effect or rebind that for a dynamically scoped effect
19:28:41
jmercouris
the question was about how will users declare new hooks and register where the hook gets invoked
19:29:00
jmercouris
what if I want to add more logic down the road in what happens during a hook declaration
19:30:10
jmercouris
so that number could grow out of control and I may need to do some magic down the road
19:31:31
phoe
somewhere in code that opens a new tab, (mapc #'funcall (gethash :on-new-tab *hooks*))
19:31:42
dlowe
so, I have a hook mechanism in tcl I did myself. The things you'll want to do: have two identifiers for the hook - the hook trigger and a descriptive id
19:32:47
dlowe
so that (define-hook connected foo ...) will replace the foo proc in the connected hook
19:33:44
phoe
so if your hook is (lambda () (print "haha")) then the print will happen 10 times in a row.
19:34:30
phoe
that's why dlowe introduces a second identifier, so you can identify hooks by *their* identifier and replace them instead of pushing new ones.
19:35:31
dlowe
you can mess about with order inside the hook list, but if you want an abstraction layer that supports redefinition, the numeric priority is the way to go
19:36:56
jmercouris
I don't think i'll worry about priority just yet, that seems to be a more sophisticated problem
19:37:18
jmercouris
and then it could automatically calculate the order in which hooks should be invoked
19:38:20
_death
in my opinion, the function running the hooks should first copy the list and use that copy.. so that actions can change the list without issue
19:39:08
jmercouris
if it makes a copy of that list, why would it matter if actions change the list?
19:39:10
dlowe
in my hook implementation, hook functions can modify the argument list for successive functions or break out of the hook completely
19:41:08
_death
hook is a symbol that names a special variable.. (defvar *my-hook* '()) (add-hook '*my-hook* 'some-function)
19:41:16
jmercouris
dlowe: no way, I mean the trees are far and more complex, I'm just thinking, that either solution right now is not important for a first round implementation
19:41:40
jackdaniel
not sure if it fits your problem, but is a very interesting approach to propagating events
19:42:51
_death
there are more elaborate libraries for hooks, but this implementation suffices for what I need
19:43:20
jmercouris
_death: seems clean, I'll do something similar, but introducing the list that phoe and I spoke about
19:45:22
jmercouris
thank you all for your feedback, I'll have to spend sometime thinking about while not exhausted, and hopefully I'll have an implementation soon, and then my first version of hydra :) (https://github.com/abo-abo/hydra) for next
19:46:13
jmercouris
_death: right, which is why I was saying I wanted a macro originally, so that I can make decisions like that in the future without breaking everyones code like an angry child with legos
20:47:04
Xach
Shinmera: https://gist.github.com/xach/5e623744fa4777159719619c9eabb4d5 shows some behavior that is confusing to me.
22:42:42
Shinmera
If you want to preserve the package that is used during compilation you need to, well, capture it.
22:45:55
pjb
Shinmera: this doesn't work: the current package is not necessarily available at load or run-time.
22:46:35
pjb
Shinmera: better use something like (load-time-value (or (find-package "FOO") (error "No package FOO")))
22:47:00
pjb
Shinmera: or if you insist, (load-time-value (or (find-package #.(package-name *package*")) (error "No package FOO")))
22:47:10
Shinmera
pjb: I assume this is placed in a file with (in-package ..) at the top. In that case it's just fine.
22:54:36
pjb
Well, what bothers me most, is that you have there a literal package that needs to be serialized in the fasl file, while in another fasl file, there's a defpackage for that will be creating a new package with the same name (assumedly before loading the fasl with the serialized package).
22:56:21
Shinmera
pjb: http://www.lispworks.com/documentation/HyperSpec/Body/03_bdbb.htm "Two packages S and C are similar if their names are similar.
22:56:36
Shinmera
Note that although a package object is an externalizable object, the programmer is responsible for ensuring that the corresponding package is already in existence when code referencing it as a literal object is loaded. The loader finds the corresponding package object as if by calling find-package with that name as an argument. An error is signaled by the loader if no package exists at load time.
22:56:56
pjb
Shinmera: ok. Also, it seems that implementations implement that by using find-package at load time.
22:58:13
pjb
Notice that those are special rules. In general be warry of using #. with complex objects. It doesn't always work.
23:02:10
Shinmera
oleo: This is what I explained to you already. The run-time package is not the same as the compilation package. You need to capture the package that is used during compilation and bind it at run-time around READ.
23:04:28
pjb
Well the common idiom is to bind *package* at run-time. Not necessarily the same as the source package. Usually you prepare a run-time package…
23:28:49
aeth
borei: single-float 4x4 naive (from the definition, but without a loop) matrix multiplication, with the matrix as a flat 16-length specialized array
23:30:00
aeth
Afaik, smarter algorithms only are effective when you go to sizes in the hundreds or thousands.
23:30:43
aeth
borei: The actual implementation is not pretty, but I can cover it up with a macro when I settle on the final implementation. https://gitlab.com/zombie-raptor/zombie-raptor/blob/324c45a11a1ead12c368e1fb8aee1216f2720555/math/matrix.lisp#L160-185
23:31:35
aeth
I had to make matref a macro rather than an inline function because there simply is so much of it. Loading the matrices into variables and then working on the variables seems to be slower for the 16-length version, though.
23:31:57
aeth
Loading *some* into variables and accessing the array for some seems to be faster, but that... that would get complicated quickly.
23:33:53
aeth
Even with a 2D array (I played around with various implementations, just not uploaded) a matref (in that case, just (1- i) (1- j)) is essentially necessary because it's just too easy to make off-by-one mistakes unless I use a 1-based matref
23:37:45
aeth
Oh, and in case it's unclear, all of my matrix operations modify a destination matrix, either a native-CL one or a C one that can be fed into CFFI for graphics.
23:39:19
aeth
If I want to use it in the REPL, I can just feed the result into a matrix created by (zero-matrix)
23:48:16
borei
i just did timing for nested loops for 4x4 - best i was getting ~2700 cycles, in most cases it's in 4-5k range
0:40:09
drmeister
ACTION is a daily 5+year slime/emacs user who switched 5 years ago after 20 years as a vi/vim user.
0:40:56
drmeister
I'm giving a talk next week to non-lisp people many of whom use vi and I want to check out slimv
2:08:01
shrdlu68
How widely used are non-free implementations, and what is attractive about them over free implementations?
2:13:21
aeth
shrdlu68: Probably hard to tell because this is Freenode, and that gives us a skewed view.
2:15:02
aeth
shrdlu68: The advantages of proprietary CLs are, afaik: (0) IDEs that aren't emacs, (1) graphics toolkits, (2) standalone binaries with tree shaking.
2:17:14
aeth
shrdlu68: The advantages of proprietary CLs are, afaik: (0) IDEs that aren't emacs, (1) graphics toolkits, (2) standalone binaries with tree shaking.
2:18:36
aeth
Not too surprising that the idea came from Lisp. You're probably not going to use the majority of the large language in any application.
2:19:57
Pixel_Outlaw
Seems like with functions being first class data types that would be difficult since they could be bound and executed at runtime.
2:20:54
Pixel_Outlaw
You may have a slot in a CLOS instance a user is allowed to assign but may not.
2:21:12
shrdlu68
Tree-shaking sounds like a rather attractive feature. Is is particularly difficult to implement?
2:24:17
aeth
Oh, I forgot. There are some other value-added things that a proprietary CL might have. They might embed a database or a Prolog, etc.
2:26:28
sjl
drmeister: a few of us have switched to VLIME from SLIMV, so that's something to check out as well
2:29:16
aeth
shrdlu68: If no one can answer your question, you could try asking in the implementations' IRC channels about what it would take in a particular implementation.
3:17:47
pierpa
shrdlu68: commercial implementations all have free limited versions to try, so just try them
3:36:26
rme
Somehow, the LispWorks people are able to make a living selling a CL implementation. I think that's amazing (and admirable).
3:36:39
pjb
shrdlu68: tree shaking is not more complicated than the garbage collector. eg. ccl has a :purge option to save lisp image. The only difference is that with tree shaking you will start from a smaller root set, assuming that you won't have to further reference any interned symbol.
3:39:20
rme
And Clozure's business has never been selling a CL implementation (namely Clozure CL) as a product.
3:40:00
pjb
Indded, they cheated with consulting. (But Franz does consulting too AFAIK, and probably Lispworks also).
3:49:57
aeth
pjb: There are a surprising number of commerical Lisps. At least Allegro, LispWorks, Scieneer, and mocl. Genera might also still count, since I think it's still being sold.
3:59:35
rme
If you can get $3000/yr/copy for 200 or 300 copies, you'd be doing OK. You won't be earning big money, but that would be enough for a sustainable little business.
4:01:26
pjb
rme: that said if the business sells free-software implementation, it remains in the charter AFAIK.