freenode/#lisp - IRC Chatlog
Search
2:01:12
Bike
(setf (gethashes table ...) new-value) will expand into (funcall #'(setf gethashes) new-value table ...)
2:02:02
Bike
of course, for most uses i imagine the number of keys will be fixed, so you could write something to do it without a loop
2:21:01
stacksmith
johnymacs: it's great that you jumped in and are coding, but you have a bit of a learning curve. Rather than fighting it, you need to get to the point where CLHS makes sense. Also not bitch that CL is getting in your way. It is your brain that's in the way of accomplishing tasks, not CL.
2:25:01
stacksmith
Bike's code should pretty much to the basics. Also read about Lisp macros - I think you may not fully appreciate them. They are kind of like Forth immediate words - they run at compile time and transform the code to your wishes.
2:42:04
jeosol
anyone encounted (sb-vm::tal-call-symbol ....) error while running multiple threads. My code runs okay when I run serial, but I switch to parallel, I get that (sb-vm::tal-call-symbol ...) error and then says a function (defined by macro) is undefined
2:49:47
jeosol
This is the link to the section of the code. Just create pastebin account. Pardon the upcase, as the code is generated from macro
2:50:41
jeosol
First of all, I will say I am not an expert lisp programmer, but I am writing an application in Lisp using SBCl for an optimization challenge with deadline in a few weeks
2:51:43
jeosol
things run serial without problems, but when I switch to parallel to gain some speed up, I get problems with GET-CPG-CELL-FACE-X- not being defined.
2:52:27
jeosol
I just simply abort. I have never been able to run the code in parallel lots of macro generated functions.
2:54:37
jeosol
the problem is an optimization problem. I am doing a bunch of F(X), where X is a vector of solutions. There can be many solutions in one iterations (think stochastic optimization algorithms), I can evaluate serially, but can get good speedup
2:55:14
jeosol
if I do things in parallel. Serially evaluation runs okay, but when I switch to parallel, I get some that SB-VM issue. I am using lparallel library
2:56:10
jeosol
@pierpa what is background/domain? the data for the challenge is not public in the sense that a request has to be made to get the data
2:56:54
jeosol
and solving the problem needs access to some other black box modeling tools. I can provide more details offline if needed
3:00:42
jeosol
@Bike, this new paste shows the restarts I get when there is an error https://pastebin.com/bJqGkceM
3:02:15
jeosol
the calling function is defined in the same package as the function that it is complaining about, except that the latter is defined by a macro
3:03:45
jeosol
@Bike, it is weird, runs okay, when serial, but with parallel it blows up. there is something in the code base, that is not correct. I thought it was race condition related so I ran parallel option but with one worker per batch, same error
3:08:49
jeosol
@pierpa, the problem is really challenging, each function takes 14 mins on my machine. and I need to run hundreds or thousands of function evaluations, so parallel is definitely the way to go
3:08:54
stacksmith
jeosol: are there any global variables in play? They may not be the same in a different thread...
3:10:00
jeosol
Thanks @stacksmith, appreciate the help. That defvar is in the same package. It is a vector of other functions defined by a macro.
3:10:37
stacksmith
I don't know if that's sufficient to be in the same package... I would print it and make sure...
3:10:52
jeosol
I posted an earlier problem, I got recommendations (I think it was @Bike, not sure) to use that instead of constructing function names dynamically using intern and format ..
3:11:14
jeosol
I posted an earlier problem, I got recommendations (I think it was @Bike, not sure) to use that instead of constructing function names dynamically using intern and format ..
3:11:35
stacksmith
It's fine to use an array, it's just that it's global. So when a new thread starts, it is probably nil.
3:13:40
stacksmith
Inside that thread that is. You may need to rebind it in whatever function that starts a new thread in lparallel.
3:20:32
jeosol
in the debugger I get this error: COMMON-LISP-USER::GET-NORMAL-CPG-CELL-FACE-X-1 is undefined
3:20:51
jeosol
Not sure why it is looking for that function in the CL-USER package when I run in parallel?
3:28:42
stacksmith
jeosol: If you create a new thread and output to *standard-output* you will crash, because inside the thread *standard-output* is nil (or maybe unbound, I can't remember).
3:30:09
Bike
not directly, but if it's looking for a symbol in the wrong package that seems like a good place to start looking for problems
3:30:39
stacksmith
Honestly, the first thing to do is print the array and see if it has functions in it...
3:45:45
pierpa
jeosol: wait, "defined by a macro" means that your macro is creating the symbol you use as the function name?
3:45:56
jeosol
@stacksmith, my application runs and writes statement to the *standard-output*, e.g., results from computations, etc.
3:46:44
stacksmith
Are you sure that the output comes from inside the thread - or from main thread after the computations are done?
3:47:50
stacksmith
Also, if you put the whole program into a thread, it's possible that some intialization function causes macros to expand inside the thread, with CL-USER as the default package...
3:48:48
jeosol
@stacksmith, no, I am not saying you are wrong or anyone. I need suggestions on what the problem could be
3:49:35
stacksmith
jeosol: if you want to rule out the issues I proposed, just output the values of *package* and your array from inside the thread...
3:52:55
stacksmith
Bordeaux-threads docs state "Global bindings are shared between threads: the initial value of a global variable in the new thread will be the same as in the parent, and an assignment to such a variable in any thread will be visible to all threads in which the global binding is visible." - but I always have to rebind *standard-output* or it does not work.
3:53:59
stacksmith
So if any of the globals at thread startup happen to be bound, the values are lost.
3:54:51
stacksmith
Hence, I suspect that package may be bound, and inside the thread it's what it was originall - CL-USER.
3:55:33
pillton
I'm not sure how bordeaux-threads can make such a claim given that it is up to the implementation to decide what happens with the environment when a new thread is created.
3:56:59
stacksmith
I would imagine that threads are started way deep, in a place where bindings are not in scope.
4:00:07
Bike
you could have all special bindings be in thread local storage. then there'd be no global bindings.
4:02:55
stacksmith
Then you would have to keep track of all special bindings separately. Do implementations do that?
4:04:30
stacksmith
Well, whatever way symbols are associated with values - you would need to keep a separate list and upon thread creation recreate it in the new TLS buffer - and you would still wind up with the initial global values...
4:06:56
stacksmith
Except, the outer bindings would contain the entire rest of the system, requiring a full recompile every time anything is changed - at least the way SBCL currently works...
4:09:23
rme
Typically, implementations make certain special variables thread-local (such as *print-base*, etc.). Other special variables see a global value. In CCL, there's a form called defstatic which is like defparameter, but asserts that the symbol in question will never be given a thread-local binding.
4:12:49
Zhivago
Personally, my preference is to use (possibly very light-weight) processes rather than threads, so that this problem doesn't exist.
4:14:38
jeosol
This is a pain, not resolved, yet, but may be I have to rethink how I structure things
4:16:07
jeosol
I will keep hacking at this as I need the parallel functionality. Thanks for all your comments. I am monitoring the chat for hints ... :-)
4:16:36
stacksmith
jeosol: have you tried to output *package* from the environment in which your macro runs? Is it possible that you have an (eval-when ...) initialzation that somehow winds up inside the thread?
4:20:21
stacksmith
I think so, if the thread initialization is around the macros. They run in a new context in CL-USER package
4:24:49
stacksmith
I try to spawn new threads after the system is loaded and all compilation and expansion is done...
4:34:49
stacksmith
I think so, but you may want to decide if you want to truncate or deal with floats or fractions, etc.
4:41:55
jeosol
@stacksmith, I don't start the threads in eval-when. I use that to define the functions when I load the system. I think the problem is related to *package*
4:48:51
jeosol
My application is very large so I am using asdf:package-inferred-system for all my files and I have to manage things carefully. See the updated repo as of January 2018 https://www.youtube.com/watch?v=sgdiRh-alfQ
4:48:56
pierpa
that EXPORT will not make the symbol accessible in any package apart than it's home package
4:49:21
stacksmith
Do you need to have the macros in eval-when? It may not be the issue, but is there a reason?
4:50:57
jeosol
@stacksmith, I only use the threads for the function evaluations. Multiple calls SIMD type, F(X), where my X's are different CLOS objects
4:52:00
pierpa
jeosol: your system is the one shown by the video, or your system is the thing which produced the video?
4:52:06
stacksmith
Well, I still think that the first thing you should've done a couple of hours ago when we started this - print or stick the value of *package* somewhere and look at it.
4:54:10
jeosol
There is a visualization for SBCL code base with GOURCE on youtube but not sure how updated it is. There are others for LINUX, python, etc
4:57:49
jeosol
The tool shows evolution and complexity of GIT repo. I was just fooling around with options to GOURCE and added elasticity to the branches etc
5:01:24
jeosol
@stacksmith. The code base does not focus on a single problem but a series of interrelated problems in a domain. The part on optimization is focused at that challenge I mentioned. There are parts doing some small ML type workflows, etc
5:02:05
jeosol
but my focus for the last few moments is in the optimization part to get it to work for that challenge problem.
5:03:53
jeosol
I asked a question yesterday here about web frameworks in CL to use. I wanted to build a web application to have public access. I know a bit of hunchentoot and cl-who, html, javascript, etc, I will do this later, but for now, I just run within slime
5:05:54
jeosol
@stacksmith, like I said before, I am not an expert on a lot of things. The part of Cl I understood the most is CLOS part because my code is essentially OOP which is easier to manage for me. How things work internally, is not all clear to me so I learn as I go
5:06:04
stacksmith
jeosol: I've been up for two days and getting fuzzy, but if your export is in the macro definition, you probably want (export 'name ,*package*), no? Splice in the package as it exists at expansion time, not when the macro was defined...
5:07:55
stacksmith
Wait, that's backwards. You want no comma, the package at expansion time, not at definition time. Can someone look at this because I am getting cross-eyed...
5:08:02
jeosol
@stacksmith, thanks for the suggestions, you can get some rest man. I will go through the messages to review the messages again
5:09:40
stacksmith
Wait, it is right there. Without a comma it expands to *package* and gets its value then and there, with a comma it spliced in the package at macro definition time.
5:10:17
pierpa
you should either create the symbol in the right package with (INTERN "NAME" the-right-package), or IMPORT the symbol in the right package later. Your EXPORT does nothing.
5:11:31
jeosol
Since I use asdf:package-inferred-system and essentially one-file defsystems, I usually import the functions one.
5:12:10
jeosol
For the error I am getting the caller and called function are in the same package. Everything blows up when I go parallel function evaluation, otherwise, it runs without problems.
5:12:57
stacksmith
jeosol, just to be clear, macroexpanding your macro in REPL and having it expand in its eval-when environment during startup is likely very different. That's why I've been urging you to figure out a clean way to see what *package* is, at that point and go from there...
5:13:32
pierpa
I suggest reading carefully the packages chapter of CLTLII, or alternatively the relevant parts of CL recipes.
5:13:33
jeosol
@stacksmith, ok let me do that. You men when I am running the application, to print the value of *package*
5:14:39
stacksmith
yeah, but be careful about when you do it. You want to modify your macro to push the package onto a global, I think - because it might expand more than once....
5:14:49
jeosol
Thanks @pierpa, I need to get a copy of that book for sure. When my system got large, after a chat with Fare and switching to one-file system, it is painful but manageable
5:41:24
jeosol
ok, I asked because it you are working with time and dates, it is easier to use one of the time-date librarieis
5:41:48
jeosol
Which one you use depends on what you are doing, time resolutions, if you want to track local-time, etc
6:32:44
stacksmith
didi: not as good as "In theory, there is no difference between theory and practice. But, in practice, there is. "
6:35:56
stacksmith
Or perhaps my favorite by Alan Perlis: "Syntactic sugar causes cancer of the semicolon."
9:11:20
flip214
because long lines that get broken might be interpreted as first line + syntax error or, worse, two individual lines
9:37:37
dim
what would you recommand to a retiree using windows who wants to hack some common lisp, in terms of setup? I'm thinking ACL or LispWorks might make sense in that case, right?
9:46:45
dim
yeah I told the guy to use Emacs if he already knows how to, or if he's ready to take on the learning curve
9:47:14
dim
the other options are for if he wants a windows native IDE for CL, I guess, where you can click and discover things
9:47:55
dim
Shinmera: with some luck this guy will to, but I just don't know him and won't be able/willing to offer any guidance other than an email sometimes, so...
9:49:42
jackdaniel
being able and willing two are two different things. if I had a choice I'd dump emacs today despite knowing it reasonably well
9:52:24
dim
oh? for me Emacs embeds my whole workflow, tailored the way I like it… I think the only reason I can work from a mac laptop is because I have Emacs and the underlying Unix tools easily available
9:53:55
jackdaniel
I agree it is a powerful tool etc etc, and when I'm installing Windows VM to test ECL usually I'm hacking from inside Emacs too
9:56:51
runejuhl
dim: maybe spacemacs? I've only tried it briefly, but it seems like a good introduction to emacs with a pretty sizable community
9:59:41
dim
I sent the email now, saying Emacs/SLIME first, then maybe ACL or LispWorks for having a windows like experience
10:00:34
dim
jackdaniel: oh and I think for hacking lisp I would like having a McCLIM based environement with some kind of graphics support and things, really, but well, it's not there yet
11:25:14
myrkraverk
flip214: (I honestly don't know much about the optional ; in JS, and the flak it's gotten) and that is precisely why I was surprised to learn Go doesn't have semi colons.
11:30:44
myrkraverk
Well, it's surprising enough for newbies, and sometimes people just want to align numbers with zero instead of space.
11:32:22
_death
newbies make tons of mistakes and this would just be another one.. and I doubt it's a very common mistake anyway
11:32:51
myrkraverk
I thought the idea behind Go (and Rust for that matter) was to create a language that'd be safer than C. Apparently Go has already failed in my opinion; not that I'm likely to learn much more of Go.
11:33:27
loke
myrkraverk: As I said on Mastodon some time ago, “Go is the Visual Basic of systems programming”
11:34:28
_death
Go fixes some C stupidities, though it lacks C's ABI.. it also has a nice and readable standard library.. but it's also kind of the antithesis to Lisp, so..
11:35:56
myrkraverk
Lisp is my go-to language for many, many tasks now; a lot of it has to do with quicklisp.
11:36:00
jackdaniel
I've heard the opinion, that it is an improvement over C (so basically that it is better C). But do we want to get stuck with another (albeit better) C for next 40 years? :-)
11:37:20
_death
it's an improvement in some respects, but not others.. also, why would we be stuck? we use CL :)
11:37:23
myrkraverk
I've seen a recent advertisement/comment/opinion that people need programmable programming languages for today's tasks -- and my thought was "we already have had that in lisp for centuries now"
11:38:20
runejuhl
Go is a decent language IMO, it's beginner friendly (good stdlib, highly opiniated wrt style making source easy to ready), the (weak) type system saves some errors, but the main attraction @work is that we can compile a statically linked binary that's relatively small and efficient
11:39:27
runejuhl
I'd love to replace it with something lispy though, but haven't found a good fit.. And I'm sure my coworkers would object a bit, since they have just gotten fairly procient in Go...
11:48:24
beach
When I give talks to industry, I always point out that I think a project leader or manager who chooses a programming language without an independent standard should be fired. Such a choice may very well require substantial maintenance work in the future, and in some cases complete rewrites (when the single implementation is no longer supported).
11:49:25
beach
Actually, I give them one more possible choice, namely to also hire an entire team of compiler experts that are able to keep the language they chose going even when it is abandoned.
11:52:30
beach
Thanks. I have given this a lot of thought actually, so I am glad that my work is recognized.
11:53:40
beach
In a talk like that, I talk about "risk analysis", and if they had done one of those, they would have seen the light. Unfortunately, most project leaders and managers don't even know what a risk analysis is.
11:54:10
beach
myrkraverk: Ask Google about Java. They were sued by Oracle after having chosen Java, thinking it was free.
11:56:09
beach
I require the standard to be "independent", i.e., not from the supplier of the implementation.
11:56:20
_death
since there is a clear divide between the users of the language and the designers (and implementers) of the language
11:56:32
myrkraverk
beach: Google also complained about "the community" dropping the JVM implementation that was formerly an Apache project; not ever mentioning that it was Oracle's move to make it cost real world money to maintain.
11:58:02
myrkraverk
I don't remember the specifics, but Oracle made the test suite cost real world money, if it wasn't used for OpenJDK and/or GPL licensed; something along those lines.
11:58:37
_death
and there are also nontechnical reasons that make deprecating yesterday's stuff with tomorrow's deprecated stuff a thing
11:59:35
dim
beach: the risk analysis certainly weights in the expected life time of the project at hand and the cost of a rewrite, either for using a new programming language, a new version of a non-standard programming language (PHP/Python I'm looking at you guys), or maybe even for architectural changes (micro services, distributed network / serverless / k8s and such)?
12:01:03
dim
with Golang, I kind of like the default tooling, wherein you don't have much to think about before you can build a project and have a program to run, static binary, it's quite easy
12:02:40
dim
I mean, I use CL to ship a program to people who are not expected to hack it, just use it, and they know nothing about CL
12:03:33
dim
I wish we had something like that for CL, including support for shared libs, or even better, having CL implementations of common libs so that you don't need the .so at all
12:04:13
dim
pgloader, pgcharts, pginstall, those are applications that happen to be written in CL; the REPL is awesome for me as a developer, totally useless for the users
12:04:33
runejuhl
dim: that sounds like what I've been looking for -- if you do find something, I'd love a heads up
12:08:13
dim
for pgloader, my whole goal is “Continuous Migrations”, that is, a way to automate a task and do it again and again, unmanned
12:10:49
_death
a repl doesn't exclude it.. I won't elaborate on the advantages, expect them to be obvious to people here ;)
12:12:01
jackdaniel
slapping REPL on top of some complicated software gives you nothing - not much different than attaching gdb to running C process
12:12:13
dim
yeah I agree, but it doesn't help solve the problems I mentionned in any way that I can see :/
12:16:20
jackdaniel
maybe that's why I don't like Emacs. I'm interested in editing files, not programming them.
12:17:22
jackdaniel
if we assume that Lisp is an application to write programs with, then I have to conclude that it is a very crappy application
12:17:50
Shinmera
dim: What's the difference? You're using an interface (text) to make the computer do things (evaluation).
12:18:03
dim
I don't use Emacs as an application either, it's an interactive environment that I can program to my desires, I like that
12:19:00
dim
Shinmera: I would say that for me, an application implements a solution to a use-case, or a set of use cases, it's not open-ended and supposed to be evolved by the user into something else
12:19:44
dim
when you're given lisp, nobody knows what kind of problem you're going to solve with it
12:19:55
Shinmera
My point is that the distinction between what people see as an "application" or not is very arbitrary. Whether you're pushing buttons or writing text is hardly consequential.
12:20:02
dim
when you're given an application, I'd argue that people know what kind of problem you might want to solve with it
12:20:47
dim
what I know for sure is that everytime a pgloader user sees the lisp REPL / prompt with the useful restart values, they feel like I didn't do a proper job at writing an application that just works
12:21:33
dim
it began with comparing Golang and Lisp in several dimensions, including the default tooling, and I think the default tooling for Golang makes a lot of sense
12:21:35
stacksmith
Modern idiocy is to create a lot of declarative layers like CSS or crap in Emacs. Once it gets big, there is no way to figure out who sets a color or responds to a message...
12:22:25
_death
dim: both CL and Elisp provide abstractions useful for particular domains (abstractions for creating abstractions, or abstractions for manipulating buffers and windows and points and marks and...).. this suggests to their users the kind of things they may be used for
12:23:49
dim
like saying that having gcc and the libc is preferable to shipping cat, it's a coupld open and dup calls anyway
12:24:53
dim
some users want to be able to use /usr/bin/cat without having to know how simple it is to write the C code behind it, that's my argument in favor of the go build default tooling vs the immense flexibility we have in CL with the REPL, I guess
12:25:25
_death
dim: it's more like saying that a Lisp with a properly designed CAT function can be nicer than UNIX cat
12:26:38
myrkraverk
And shipping a cat can be painful if it's not in a good enough box. They have claws.
12:27:09
dim
the unix box comes with a good enough REPL for most users, because they know nothing else, mainly, but that's not the point
12:27:27
dim
so default golang tooling is pretty good at targetting the Unix user experience, I guess?
12:28:04
dim
whereas the CL default tooling is meant for something else entirely, which means that using CL to target the unix user experience is full of traps, uneasy, and frustrating as hell
12:28:16
Shinmera
myrkraverk: My messages are: whether something is or isn't an application is entirely arbitrary, and: whether people are comfortable with something or not is almost entirely a question of presentation.
12:30:08
myrkraverk
dim: for my lisp code, I've settled on SBCL; which can be painful enough to handle, when shipping to many boxes.
12:33:54
jackdaniel
imho not in this case - it just introduces noise which (once again - imho) misses the point yet redirects people attention
12:51:18
_death
I suspect many of them are.. and this is why pgloader may be much more useful (hackable, extensible, maintainable) than a go-pgloader.. maybe 99.9% of your users don't care, but that is the target audience you picked :)
13:17:03
beach
schweers: I haven't decided that. Perhaps how special variables are handled in the presence of threads. But that's a good point.
13:17:57
schweers
is there any thread aware implementation in which threads don’t inherit the root binding of the main thread?
13:19:14
beach
In all implementations I know of, the global binding is shared between all threads and every subsequent binding is thread specific.
13:19:39
beach
And of some implementation doesn't do it that way, it would have to change in order to be WSCL conforming.
13:19:53
schweers
by global binding you mean the root binding, not the binding active when the thread is spawned, right?
13:21:15
beach
dim: Yes, and as the article by Hudak and Jones shows, the cost of learning a new programming language is minuscule compared to the potential savings in productivity of choosing a language that is adapted to the task at hand.
13:23:35
myrkraverk
By CL's default tooling, are we talking about the compiler/interpreter environment, or quicklisp?
13:24:34
beach
schweers: Only one that I know of. They don't exist because the cost of conducting one is exorbitant. Luckily, the US Navy did a small one once. It is not perfect, but it gives some indications.
13:27:52
schweers
but in all seriousness, given a Lisp OS, there should still be cases where a reboot is inevitable, right?
13:28:20
TMA
schweers: there are experiments in live kernel patching in linux (both suse and redhat are developing one, iirc)
13:29:11
dlowe
I would think that it's possible for any OS data structure to become corrupted in such a way that it will require a reboot to fix.
13:30:04
trafaret1
I have started using emacs I would like to have lisp like ipython shell in emacs where I type some expression and it will be instantly evaluate into text file beneath expression
13:33:24
_death
trafaret1: https://www.quicklisp.org/beta/ in particular "To install and configure SLIME"
13:33:33
svillemot
trafaret1: "apt-get install slime" actually works (though you won't necessary get the latest version, depending on your distribution)
13:33:36
trafaret1
I fall in love to emacs and shortcuts in programming I don't have expirience but I want start with lisp
13:34:28
beach
dlowe: Do you see what I mean about having to reboot even when the system is bug free?
13:35:07
shrdlu68
trafaret1: Great! Well, quicklisp is a package manager used for CL, used to install libraries not in the language's "standard library".
13:35:37
svillemot
beach: why do you recommend against using apt-get for install slime? (I'm maintaining the package in Debian)
13:36:56
beach
svillemot: Maybe my information is outdated, but I have seen several newbies in the past who do not use Quicklisp for installing SLIME and then they get outdated or incompatible versions. I will gladly accept being corrected.
13:37:05
trafaret1
for little correction I have started installing slime through apt-get and next do I need to add package from melpa into emacs?
13:37:49
beach
dlowe: Restart should not be needed in most cases for the LispOS I am planning, just like we don't need to restart our Common Lisp system when we update a function.
13:39:01
beach
dlowe: And, yes, the current situation is what it is because most existing operating systems have monolithic kernels.
13:39:18
svillemot
still, it is easy to use, since it registers the proper bits into both Emacs and ASDF
13:39:22
schweers
there are cases in which I have made a change and found it easier just to restart the lisp session than to "undefine" the relevant parts and reload code in the correct order.
13:39:35
svillemot
_death: in this precise case, trafaret1 told he was using an apt-based distribution
13:40:00
beach
schweers: Yes, there are situations like that, mainly because existing Common Lisp systems rely on that being a reasonable possibility.
13:40:09
_death
svillemot: yes, but other people in the channel may not be able to help with debian-specific issues
13:40:29
beach
schweers: SICL (the basis for the OS I am thinking of) has first-class global environments which will make many of those situations unnecessary.
13:41:15
beach
schweers: It is compatible with the standard, but it is an extension,yes. http://metamodular.com/environments.pdf
13:43:18
schweers
if I understand correctly, (some?) scheme implementations have an extra argument to eval, which is an environment. I suppose that is at least something.
13:44:44
schweers
trafaret1: if you mean “Can I produce standalone binaries?” the answer is that it depends on your implementation, but mostly, yes, you can.
13:45:38
shrdlu68
trafaret1: The distinction between language and implementation is rather clear in CL, but you'll get used to it.
13:51:56
trafaret1
I worring about hard connection between lisp and pure math stuff like lambda expression and recurrsion
13:54:53
trafaret1
shrdlu68: I mean does learning lisp require more math skill compare to c++ for example
13:55:08
shrdlu68
trafaret1: Lisp's reputation precedes it. Unfortunately almost everything in that reputation is inaccurate.
13:55:46
schweers
as lisp covers more ground than any other programming language or runtime I have yet seen (with the possible exception of concatinative languages), there is more stuff to learn. But in a way, this is an advantage. I always viewed compilers as a box of black magic (and to some extent still do), but lisp lets you, the user of the language, change how compilation works. this is something which takes some time to learn, bu
13:55:46
schweers
more than in other languages, because most other languages do not cover this topic in the languages themselves.
13:56:22
shrdlu68
trafaret1: In many ways CL is just a language that doesn't get in the way of your coding.
13:56:25
schweers
speaking of which: I find C++ templates hard to understand. But I have to admit that I never tried that hard :/
13:57:23
schweers
trafaret1: try not to be too put off by some things in the language and the standard that just seem weird. Almost everything in CL is the way it is for a very good reason.
13:58:20
schweers
yes, there are dark corners everywhere, but it seems to me that CL has surprisingly few such corners