freenode/#lisp - IRC Chatlog
Search
0:54:06
elderK
mobile_c: Read itself converts the characters and stuff into a tree of lists and things. READ is fundamental.
0:54:22
elderK
If you're used to parsing like, things from another language like C, you will have to roll that mechanism yourself.
0:55:24
mobile_c
how can i parse something like this https://paste.pound-python.org/show/K4QGpELlMYw0VWUjbl37/ using lisp
0:56:10
elderK
mobile_c: If you'd like to learn about how the reader works, you can find out here: http://clhs.lisp.se/Body/02_.htm
0:56:34
didi
I think we are dismissing READ too quickly. It's amazing that we can do it. We should praise it more.
0:57:54
elderK
mobile_c: To parse something like that, you'll probably do a lot of stuff you're used to doing in other languages if you've parsed by hand. Or, you can learn to use one of the many parser-generator libraries available for Lisp.
0:59:10
mobile_c
as i want to parse it like a parser grammar (since technically at the moment it is very similar to one)
1:01:31
malice
With problem definition like this, I'd take a look at parser generators: https://www.cliki.net/parser%20generator
1:02:47
mobile_c
as the main problem is figuring how how to parse it like a rule definition/rule expamsion
1:03:27
elderK
mobile_c: If you want to do it by hand, you could just write a simple lexer and recursive descent parser :)
1:03:59
malice
(also note that the site could use updating; some of the entries are 404 and there are probaly a couple of new ones not listed)
1:05:34
malice
mobile_c: I'm afraid I don't understand the problem well enough to suggest an optimal solution. One of the things I do not understand is the need for Lisp parser
1:06:14
malice
then I do not understand the goal - do we want any parser, some specific parser, what representation of AST should we produce, how do we handle the errors, etc.
1:08:59
malice
although writing your own parser won't be much different from other languages, I guess.
1:12:06
aeth
keep in mind that cliki is probably 15 years old, and not as popular as random github pages like https://github.com/CodyReichert/awesome-cl these days
1:14:56
malice
mobile_c: there's also rdp generator here: http://www.informatimago.com/develop/lisp/index.html
1:33:11
aeth
I think that for a reader macro as long as it returns (turns into?) one thing you can just quote it, but I could be wrongly generalizing from read-eval.
2:48:15
antonv
a library (an ASDf system) shoudl chose a dependency (another ASDF system) based on what OS / distro it runs on
2:48:52
antonv
simply speaking, depending on OpenSSL version installed, we should choose an FFI wrapper to load
3:43:35
fiddlerwoaroof
however, if it's something like "which openssl version is installed", you might have to do a bit of work to get the features setup appropriately.
9:52:53
ogamita
elderK: to test reader macros easily, you can use read-from-string: (read-from-string "`(foo \"string\" ,x)") #| --> (list* 'foo (list* "string" (list x))) ; 18 |# be sure to escape double-quotes and backslashes!
9:55:29
ogamita
aeth: when you prefix a reader macro by a quote, this prevents what is read to be evaluated. So it should print what has been read. Unfortunately, the pretty printer, and even the printer, will often print some objects in a special way. For example: (prin1-to-string '(function foo)) #| --> "#'foo" |# instead of printing as a normal (function foo) list. You can use your own printing function to avoid this caveat, eg. (print-conses
9:55:29
ogamita
'(function foo)) #| (function . (foo . ())) --> #'foo |# ; notice how the result after --> is printed by cl:print.
10:23:22
ogamita
elderK: another trick when you are developping a reader macro is to use 'my-reader-macro instead of #'my-reader-macro in set-macro-character or set-dispatch-macro-character.
10:23:41
ogamita
elderK: with ' when you redefine the reader macro, it's taken into account immediately.
10:42:14
no-defun-allowed
The symbol adds redirection so the name is looked up during a funcall instead of being handed the old function object.
10:42:39
ogamita
it's used with apply or funcall, so a symbol denotes the global function of same name. (actually, symbol-function is used).
10:49:01
elderK
Is there any particular reason to say #'name rather than just 'name for say, apply or reduce or whatever?
10:50:20
jackdaniel
elderK: if you have (flet ((name () "foo")) …) then 'name will refer to a global function definition, while #'name will refer to the local one
10:51:28
jackdaniel
also #'foo gives you a function itself, so if you (let ((foo #'foo)) (loop (funcall foo))), it will always call the same function when looping (even if you redefine it in a different thread)
11:08:46
jackdaniel
you probably want to replace lambda and uiop piggyback with your own function working on strings
11:15:26
elderK
If you have trouble like, navigating the CLHS as it is online, Zeal could really help :)
11:16:51
jmercouris
I know about sort, did know how to write the predicate to compare two strings and see which one has alphabetical precedence
11:19:06
jackdaniel
jmercouris: lexicographic in uiop is there for lists, that's why I did coerce them
11:21:28
White_Flame
the inequality tests are based on char< etc, which do defer to implementation specifics
11:24:02
elderK
jmercouris: string<= doesn't seem to be implementation-specific. Although I guess like, if you like, want to compare unicode strings in an ASCII-only Lisp, I guess would hit trouble.
11:24:39
White_Flame
it relies on character codes, which used to not be very standardized, and thus implementation specific