freenode/#lisp - IRC Chatlog
Search
22:59:39
fiddlerwoaroof
it3ration: https://github.com/slburson/fset https://github.com/ndantam/sycamore
22:59:48
oni-on-ion
fiddlerwoaroof: there is a lot of cl-in-scheme -- for eg. guile supports CL style defmacro , remote repl, etc
23:00:12
it3ration
I've been an engine programmer in the game industry for a decade, and wanted to [make the worst choice possible] have some fun and build a little engine in Clojure, but the memory management is just not gonna cut it probably, even with something like LWJGL
23:00:16
aeth
fiddlerwoaroof: eval(foo) in other languages is (eval (read-from-string foo)) in Common Lisp (and probably something similar in Scheme).
23:00:50
aeth
fiddlerwoaroof: It's the read[-from-string] part that you have to trust, especially if *read-eval* is T
23:01:00
it3ration
I've taken a look at some of the things out there, there's one guy doing some fun things in CL
23:01:05
aeth
fiddlerwoaroof: In CL, the main issue with eval is that you probably want a macro instead
23:03:16
it3ration
I've been a hardcore emacs user for about 15 years - using Clojure has been fun, I'm so tired of the imperative shitshow that is C / C++
23:03:18
oni-on-ion
why is GOAL the default mention for lisp and games? isnt that a couple decades ??
23:03:41
oni-on-ion
also lisp was well used in mario64 and nintendo64 stuff, also no one mentions ABUSE by crack dot com, with also their own lisp interpreter (that was my second exposure to it)
23:03:47
fiddlerwoaroof
xelf.me looks pretty cool too, but I've never been able to get it to work on mac
23:04:23
oni-on-ion
jasom: is that like saying steven spielberg used Xyz supercomputers and sets and actors, so whatcha gonna do for your hobby project ?
23:04:45
it3ration
I may be way off base here, but it seems like Clojure has better parallelism / concurrency support on the JVm
23:04:55
oni-on-ion
it3ration: what! actually ? i read the history on it. worked in an apartment etc. (similar to my adventures in vancouver )
23:05:11
aeth
The thing is, that's Lisp as a scripting language. #lispgames is more about Lisp as an engine implementation language, or at least partially as one (lots of C/C++ libraries and in some cases like OpenGL they're unavoidable).
23:05:15
jasom
oni-on-ion: even outside the AAA field, games written completely in any lisp are unusual
23:05:51
it3ration
aeth: yeah, that's the only reason I haven't fully dived in - it'd have to be for fun only, because writing a cross-platform engine in CL is the path to NEVER EVER SHIPPING haha
23:05:59
fiddlerwoaroof
But it's not too hard to implement core.async-like patterns using something like ChanL
23:06:21
fiddlerwoaroof
and then there's also lparallel which provide equivalents of clojure's pmap, as well as more complicated constructs
23:06:26
oni-on-ion
oh ah yep. CL and its images. its like you marry a lady then she got her dog the cat her cousins grandma parents old collections of dolls ahhhh
23:07:02
oni-on-ion
if i were doing real parallel or gpu or numeric work, i would go full-forward face-first into julia hands-down
23:07:09
aeth
it3ration: But it's not never shipping, it's more like full maturity in 10 years from the start point, perhaps with something shippable a few years before it's really mature.
23:07:30
jasom
writing a cross-platform engine has almost always been hard; OpenGL appears to have been a historical anomoly
23:07:47
aeth
it3ration: You don't have to write a backend for Metal. You can just (1) ignore macOS or (2) use Vulkan and moltenvk
23:08:51
it3ration
I mean, i've been an engine programmer for a long time - writing an engine is so orthogonal to shipping a game
23:08:58
oni-on-ion
also the simple/tiny/crossplat "raylib" works in web and mobiles. also i heard SDL does too. lots of solutions....
23:09:10
it3ration
I bet shipping a CL game on mobile would be an absolute nightmare, but I'm not sure
23:09:27
jcowan
fiddlerwoaroof: Unfortunately, there's no portable way to create global environments at runtime. There is the interaction environment (the one the REPL uses, if there is a REPL, which there usually is), and you can create environments from libraries, but they are not reliably mutable
23:09:39
aeth
it3ration: Except certain kinds of games definitely are best made on a custom engine, e.g. Factorio or Minecraft.
23:10:05
aeth
If you're shipping a typical game, a mainstream engine probably is the best fit, but if you stray too far, a custom engine can still make sense given how much you'd have to hack around insomething like Unity to get acceptable performance.
23:10:39
aeth
Of course, you *can* hack around something like Unity to make a game it's not suited for, e.g. Cities: Skylines.
23:11:48
it3ration
They're generating near-optimal code with intrinsics per-platform in Unity these days, they tried to hire me awhile ago
23:12:16
aeth
it3ration: You could non-portably use SBCL's define-vop and then have a fallback in native CL for non-supported implementations and architectures.
23:12:59
aeth
it3ration: What I do is I preallocate everything before the game loop. Essentially the object pool pattern with a twist
23:13:32
aeth
it3ration: Of course if you wanted platform support you'd have to port it to the consoles yourself
23:14:18
fiddlerwoaroof
here's some more code using intrinsics for SSE stuff: https://www.pvk.ca/Blog/2013/06/05/fresh-in-sbcl-1-dot-1-8-sse-intrinsics/
23:14:22
aeth
it3ration: What I'd personally do if I ever was successful enough to think about console ports is make the console ports a commercial feature of my permissively-licensed engine.
23:14:37
aeth
it3ration: i.e. The three PC OSes are free, but you'd pay to have the console renderers
23:16:44
it3ration
I know there's some guy doing CL game stuff on Youtube, I can't remember his name
23:16:48
aeth
The task of game engines definitely plays to SBCL's strengths, although my engine is still geting acceptable FPS in CCL
23:18:14
aeth
it3ration: One good thing about SBCL is that it's mostly public domain with a fallback to BSD (iirc) and with some permissively licensed components from elsewhere. So if porting to consoles is incompatible with the GPL, you can still do it with SBCL.
23:18:42
aeth
CCL is apparently Apache licensed so it should also be compatible with console ports even where the task is GPL-incompatible
23:19:53
aeth
(I don't know if this is an issue or not. If I ever have a problem where I need to port one or more implementations to consoles, I'd have enough money to pay someone to solve that problem.)
23:20:07
didi
TIL SBCL let me (declare (optimize (debug 0.5))). I thought only natural numbers were allowed.
23:20:32
no-defun-allowed
it executes code with (debug 0) half the time and (debug 1) the other half
23:21:09
aeth
didi: I'm not very surprised because it probably uses <, =, >, <=, and >= to make its decisions
23:24:38
sjl_
> SBCL allows any real value for optimization qualities. It may be useful to specify 0.5 to get backtrace argument display without argument documentation.
0:39:36
pillton
anniepoo: The function you are stepping through should be compiled with the following optimize declarations: (optimize (debug 3) (safety 3) (speed (0)))).
0:47:59
pillton
anniepoo: (defun foo (x y) (declare (optimize (debug 3))) (break) (print x) (print y))
0:49:36
pillton
I don't think this functionality is as good as it is in other development environments. Having said that, what is the right thing to do with macros?
0:54:23
aeth
Debugging with FORMAT doesn't seem like the end of the world. Shouldn't be too hard to refactor into logging if you leave it in and target any stream.
1:23:46
dariken
how to make executable binary in SBCL that doesnt take the whole Lisp image with it? something like tree shaking that only takes the necessary parts.
1:28:55
pillton
dariken: That isn't possible. You can pass :compression t to sb-ext:save-lisp-and-die.
1:39:24
fiddlerwoaroof
dariken: in the general case, I think that's equivalent to the halting problem
1:42:10
anniepoo
(fwiw, yes, the one I'm presumably gonna write has to have some limitations - it's known to be impossible in the general case, like apply)
1:46:59
fiddlerwoaroof
anniepoo: if you're having issues with macros, the macrostep expander is really useful
1:51:10
anniepoo
I'm getting the strange behavior that it doesn't step into functions called from the first function
1:51:12
LdBeth
however in general case of applications especially commercial software you won't let user eval arbitraray code
1:55:19
pillton
LdBeth: Some CL implementations compile the dispatch function used in generic functions upon first invocation.
3:20:48
stylewarning
fiddlerwoaroof: no way except to access the slot directly. That'll change in due time of course.
3:22:34
stylewarning
(Supposing that I don't replace it with structs, I'll probably make each one its own slot. But it's a detail I'm not so concerned with at the moment.)
3:23:00
stylewarning
(in Coalton, of course, the way to extract values will be through pattern matching, which also isn't implemented)
3:25:04
jcowan
I've actually been wearing my ISLisp implementor's hat today, thinking about how to implement ISLisp in CL. I'm realizing that it's going to be *very* expensive to use only portable CL rather than being able to depend on SBCL
3:25:58
jcowan
For example, (+ 'x) only should raise an error per CLHS, but SBCL guarantees to return an error. So either I wrap + with a safe version that always raises an error (and not by a type declaration either, but by actual code), or I just say "Use SBCL".
3:26:19
stylewarning
fiddlerwoaroof: yes, I'd add it here: https://github.com/tarballs-are-good/coalton/blob/master/src/coalton.lisp#L264
3:26:31
jcowan
Kent Pitman has an implementation, but he can't/won't open source it. There is OpenLisp, which is not open, and a bunch of broken implementations.
3:27:11
fiddlerwoaroof
Anyways, I have a suspicion that that type of thing always _will_ raise an error in implementations people user
3:32:44
fiddlerwoaroof
I only know about it because it's been adapted to work with a racket-module like system
3:49:56
fiddlerwoaroof
Anyways, I think your implementation of Hindley-Milner might be my best chance of my understanding how the algorithm works: it looks a lot cleaner than most of the other places I've looked
3:50:56
fiddlerwoaroof
This might be because I'm really bad at reading ML-style languages or my eyes glaze over when people write page after page of type judgments
4:05:04
fiddlerwoaroof
I'm kinda interested to what degree a lisp would benefit from something like the smalltalk "IDE"
4:05:56
oni-on-ion
yeap =) opengenera was closest; lisp experiments were precursor to smalltalk environment afaik. current attempts are mezzano and mcclim
4:09:06
jcowan
Interlisp (of which Genera is the only surviving implementation) and Smalltalk came out of the same hacker culture, and they shared a great deal, especially the image-based rather than file-based representation.
4:09:50
fiddlerwoaroof
jcowan: yeah, one of my many overly ambitious projects is to implement a fully-image based modern CL system
4:10:40
fiddlerwoaroof
I've been thinking of using sqlite's appendvfs to append a relational database to an image, and stuff all the source in there with arbitrary metadaya
4:11:22
fiddlerwoaroof
And then define a suite of functions that can generate temporary buffers from the database that contain a projection of your source-code
4:11:41
jcowan
There are bits in the Squeak image that were set by hand before 1980 and have no representation in the source file.
4:12:01
fiddlerwoaroof
i.e. something like (buffer-with-methods generic-function &rest specializers) that would give you a temp file with all the relevant methods
4:12:42
fiddlerwoaroof
jcowan: I thought that at some point they went back and reimplemented the vm from scratch so that that was no longer the case?
4:15:36
jcowan
Xerox sent out the image and a bunch of docs to various outside organizations and asked them to implement VMs according to their own notions, and the result was a lot of Smalltalks and the book _Bits of History, Words of Advice_
5:45:48
stylewarning
fiddlerwoaroof: I updated the README. I also just made a good number of fixes/improvements. All of this still here works: https://github.com/tarballs-are-good/coalton/blob/master/src/library.lisp
6:01:12
fiddlerwoaroof
I was just thinking it might be interesting to implement a unification-only mode that does success typing
6:03:33
fiddlerwoaroof
And, it works by leaning really heavily on the type system to generate a bunch of the boilerplate necessary to serve an api
6:05:52
fiddlerwoaroof
So, my thought is that if you declare assumed-good types for a bunch of functions and use those in a server spec and if you had a type-only checker, you could get the code generation "a la carte"
6:27:36
fiddlerwoaroof
stylewarning: one thing that occurs to me is that your coalton-toplevel macro return an "environment constructor"
6:28:01
fiddlerwoaroof
that is, a function that, given some object that represents an environment, updates it to have the definitions contained inside the macro form
6:29:41
fiddlerwoaroof
I thought the way j-bob (the theorem prover from The Little Prover) handles this was quite eleagant
6:31:01
fiddlerwoaroof
Although, the downside would be that host/coalton interop becomes a little more complicated.
7:41:36
beach
So it looks like it3ration was here mostly to tell us how nice Clojure is an how ugly Common Lisp is, and not so much to get information about Common Lisp.
7:43:44
elderK
I don't get the bad rap people give CL. I was reading some blog posts today, by Fare, who linked to other such posts, about people banging on CL.
7:43:53
beach
Somehow, I can't see myself going to #clojure and ranting about how I like mutable data structures, lisp-2, etc.
7:44:09
elderK
I mean, I've never found anything in CL all that horrible. Maybe that's just because I'm used to C and C++ but like, nothing stands out as being outright @!#$ing crap.
7:44:54
elderK
As for namespaces, I like that functions live in their own namespace. It makes some things much clearer. Like, how many times have you seen Scheme code with "lis" as a parameter?
7:45:07
beach
Well, you can like it or not. That's not my point. My point is that it is kind of weird to show up in a forum dedicated to language X and spend most of the time ranting about how great language Y is and how bad language X is.
7:46:27
beach
"The names of things seem super antiquated compared to Clojure (aka, remove-if-not instead of filter"
7:46:34
no-defun-allowed
to be honest, neither is better and both have places where they look awkward
7:46:56
no-defun-allowed
which is why i propose a new system: lisp1.5 (not to be confused with the 1960's implementation)
7:47:17
no-defun-allowed
interpret/compile/whatever the syntax both ways and use which one handles the most test cases correctly
7:47:27
beach
Again, that's not my point. My point is that it's strange to come to #lisp and rant about how bad it is and how good Clojure is.
7:47:43
elderK
It's like, sure, I prefer a general "define" like in Scheme vs. defun, etc, etc. But so what? It's not like it's a major issue. You use defun a few times, and you learn and no problem.
7:47:57
shrdlu68
Perhaps it's time "Comparative PL design" became a thing? Clearly people enjoy comparing languages.
7:52:38
no-defun-allowed
(defun filter (pred list) (loop with in-pan = nil with in-bowl = nil for item in list do (if (funcall pred item) (push item in-bowl) (push item in-pan)) finally (return (values (nreverse in-bowl) (nreverse in-pan)))))
7:52:49
elderK
Someone who isn't a functional person can se eit, and understand what it is doing. But if you see filter? Like beach said: Is it removing? Is it keeping things? What?
7:54:23
no-defun-allowed
although the model should probably be the other way around since you're looking down onto your bench, the pan's contents are first
7:54:40
shrdlu68
Can't say I've never been tempted to go on a vitriolic diatribe against some languages, just never done it.
7:57:11
no-defun-allowed
(eg: new rust macros give you a stream of tokens instead of an AST. the response i got from "what the hell is this nonsense, the compiler has a full parser!" was "just include a parser crate it's less stuff they have to put in the core")
7:59:42
jackdaniel
people coming here and "proving" that their language of choice is better is a defensive stance
8:00:22
jackdaniel
if I had to guess such people hear from somewhere, that CL is better because of *something* and feel compelled to defend themself
8:01:21
shrdlu68
There you go - an opportunity to write a damaging polemic, like Chomsky's review of Skinner's Verbal Behavior.
8:01:22
jackdaniel
but it is rude indeed to barge in to say: your choice sucks (because I truly believe despite what I've heard that my language is better)
8:04:04
shrdlu68
But I doubt one can write something like that in this field and not be accused of malice.
8:07:35
shrdlu68
Hypothesis: no critique of a programming language can ever be taken seriously as a scholarly work.
8:37:04
shka_
shrdlu68: well, this is how it is, but I even named my blog "for more humane computing"
9:54:47
zigpaw
Speaking about language choice, yesterday I was looking at a live stream of someone who wrote a GUI application using Power Shell script, and kept data in CSV files. One of my first thoughts was - how much pain can we cause to ourselves. On the other hand he wasn't working as software developer so as far as I am concerned I was quite happy he was d
9:58:20
jackdaniel
I've seen far worse solutions for data storage than storing it in csv (and some of them required quite a sophisticated knowledge)
10:03:06
jackdaniel
so I think that csv is a sane choice for really small projects, then comes sqlite and then database which is more suited for bigger quantities of data
10:06:25
heisig
My preferred choice of storage is objects in Lisp images. The reasoning is that life is too short to spend it with data serialization and deserialization.