freenode/#lisp - IRC Chatlog
Search
5:13:20
pjb
In lesser languages such as C or Ada, managing types is easy: just use pointers to structures for everything.
5:36:32
aeth
Well, C and C++ and similar languages add an extra level of complexity in API choice that you don't see in CL. Basically, pass by reference vs value. i.e. (at least C-style pass by value) your choice is a pointer vs. copying-everything.
5:42:10
pjb
generally, it's optional. Pascal has it, with var parameters. Modula-2 with INOUT parameters, etc.
5:42:15
aeth
beach: No, what I meant is that for every function you make, you have this mental overhead of whether or not to do foo or &foo and there's probably even a line in object size where it's more efficient to do one or the other, and it's a lot of thinking
5:47:54
aeth
It gets pretty bad in C++ more than C because you want to do OOP like everyone else, so you're doing a lot of Foo *foo that you call with &foo (except when you don't) and that means that in a lot of places you're having to do (*foo)[whatever] or (*foo)(whatever) or whatever << (*foo) and it quickly turns into a mess
5:49:06
aeth
At least compilers are pretty good at telling you (in the first of 200 lines, which you then have to scroll up to read) when you should have used foo instead of &foo to call the function that wants Foo *foo.
5:54:20
aeth
(I'm not sure about Ada and if it addresses this. I wouldn't be surprised if Pascal is similar.)
6:00:51
beach
In metamodular.com/modular-c.pdf I recommend programming with pointers only and using something like the Boehm-Weiser automatic memory manager. Uniform reference semantics is the only sane way of programming.
6:02:43
aeth
I wonder if there's a way to get something like CL semantics... basically, pointers except when it fits in a machine word? I guess not that simple.
6:04:26
pjb
aeth: it wouldn't be safe C. It's better to write pure C code, (C code that is defined by the standard).
6:05:44
aeth
pjb: Wouldn't it be even better to compile a C ABI-compatible binary, but with much Lispier semantics where possible? Technically, only the interop would matter.
6:15:02
aeth
pjb: I don't think that counts because of the runtime. So I guess this is necessarily off-topic except for the obvious choice of the compiler language
6:15:51
aeth
pjb: If such a language existed, you could potentially rewrite ECL in it, though. Then ECL wouldn't need a C compiler, too, since it could just do ECL->this-hypothetical-language->ECL
6:16:34
pjb
aeth: the point is that when you adopt a stereotyped programming style, you necessarily use a run-time.
7:40:22
verisimilitude
With Ada, it's not defined whether copying or referencing occurs with in out parameters, sans some special cases such as limited objects.
7:42:14
beach
The fact that SBCL no longer complains when there is a DEFMETHOD but no associated DEFGENERIC does not suit me at all. My worsening dyslexia results in numerous spelling errors that are not caught.
8:00:19
saturn2
beach: (shadow 'defmethod) (defmacro defmethod (name &rest rest) `(if (typep (symbol-function ',name) 'generic-function) (cl:defmethod ,name ,@rest) (error "~A is not a generic function" ',name)))
8:15:11
Shinmera
ACTION wonders if a general utility to check all symbols for a close Levenshtein distance would be useful
8:20:51
pjb
Here I have a tool to check for "duplicate" symbols, ie. symbols with the same name interned in different packages. https://github.com/informatimago/lisp/blob/master/tools/symbol.lisp#L133
11:50:16
Shinmera
no-defun-allowed: Shoulda watched my streams ;) https://github.com/Shinmera/flow/blob/master/graph.lisp#L131
12:40:43
jonatack
Just realised how good the logs are for this channel. Thank you to the kind people who maintain them!
15:14:04
asdf_asdf_asdf
int = 5; void a(int &n) { n = 2; } std::cout<<i; // 5 a(i); std::cout<<i; // 2
15:16:10
Bike
i think you've been told this before, but if you insist on asking sbcl specific questions instead of using cffi, ask #sbcl. they'll probably tell you to use cffi and you should probably listen
15:37:09
Bike
also, with fixnums, like in your attempt at a C++ analogy, it definitely won't work since they're just immediate and do not have addresses
15:38:30
asdf_asdf_asdf
@Bike; OK. Then how change value variable inside function that will be changed outside function?
15:39:23
Bike
You cannot pass a reference like you can in C++. You can only pass values as arguments.
15:39:51
Bike
You can do things like (let ((x 2)) (print x) (funcall (lambda () (setf x 5))) (print x)), which will print 2 then 5.
15:40:42
Bike
Lisp just does not have references. You can pass objects and modify objects: (let ((x (cons 2))) (print (car x)) (funcall (lambda (c) (setf (car c) 5)) x) (print (car x)))
15:41:16
Bike
But lisp has an entirely different model of things from C. Variables do not "have addresses".
15:42:03
asdf_asdf_asdf
@Bike; Did it mean, that every time variables has different/other/another addresses?
15:45:18
Bike
If you write something like (let ((x 2)) ...) for example, there's nothing stopping the compiler from simply storing 2 in a register, or perhaps using a different register for the same variable in different places, or maybe it will put it on the stack, or maybe it will eliminate the variable entirely and the value won't even exist in a register.
15:47:56
asdf_asdf_asdf
OK. So, why in SBCL are instruction such as get-lisp-obj-address, int-sap, etc?