freenode/#lisp - IRC Chatlog
Search
14:46:49
schweers
the thing is that I’m just working this into a somewhat complex program. so pasting the relevant bits isn’t really a straightforward process :/
14:52:27
schweers
is it possible that I’m not allowed to call LAUNCH-PROGRAM from a thread other than the main thread?
15:17:29
schweers
turns out that I am giving some wrong parameters in. I gave a broken pathname, gave :rename-and-delete (which is illegal), and :error-output t is also apparently illegal
15:19:50
flip214
ACTION waits for phoe to give a downward arrow, so that I can write something useful there
15:29:11
schweers
is there actually a good reason why sbcl does not properly work with pathname types like "tar.bz2"?
15:29:58
phoe
schweers: yes, there was one - when you have "foo.bar.baz" it has no idea whether the file "extension" is "bar.baz" or "baz"
15:31:32
rpg
schweers: this isn't really SBCL's fault -- the ANSI spec really isn't clear about how file types should be parsed, because it was written in a time of greater filesystem diversity than today.
15:31:42
phoe
(uiop:native-namestring (make-pathname :name "foo" :type "bar.baz")) ;=> "foo.bar.baz"
15:32:05
rpg
I am honestly a little surprised, though, that when you push a type in with MAKE-PATHNAME it doesn't do the right thing.
15:32:11
Xach
schweers: I suspect it is inherited from CMUCL, and the answer may be lost in the mists of time. or not!
15:32:59
phoe
rpg: the type is correctly set to be "tar.bz2" but NAMESTRING refuses to work with it.
15:34:11
flip214
The pathname #<PATHNAME ...> does not have a namestring because the :TYPE component contains a #\.
15:34:22
schweers
rpg: regarding your point that the standard doesn’t specify how to do this: I know that, but it seems like a language lawer move. It seems to me to be an insane way of handling this, but I might be wrong. Hence my question about the rationale for this way of doing things.
15:34:58
Xach
schweers: I think it is reasonable to say that the type is everything after the final "." and the name is everything before.
15:35:34
rpg
Xach: but surely if you actually push a value into type as in this case, NAMESTRING ought to report it back.
15:35:40
schweers
Does the standard require namestring parsing and printing to be a bijective relation?
15:36:20
Xach
rpg: if you parse-namestring you get a different object, and that's not what namestrings are for.
15:36:22
rpg
Xach: In that case, I think SBCL should raise an error in response to setting type in that way.
15:45:49
flip214
how about (CONCATENATE 'string filename ".tar.bz2") and avoid pathnames altogether?
15:46:37
Xach
If it were me, I would make a function that makes a new suffix like .bz2 by combining the existing name and type into the name and making the new suffix the type. There are many other options.
15:51:28
Shinmera
pathname-utils has functions to get the "real" type and name of a file, but nothing to push/pop types. Should probably add that.
15:51:30
Xach
ccl had an approach where the namestring had an escape character distinguishing where the name ended and the type began. i don't remember exactly how it was shown, but it meant you would see something like "foo\.tar.gz" or "foo>.tar.gz"
16:29:09
beach
jcowan: Maybe you missed it, but I told you that SICL and Clasp are very very different implementation.
16:39:39
beach
Yes. That part (Cleavir, the compiler framework) is working, and Clasp uses it for its main compiler.
16:40:56
beach
The first intermediate representation is AST. Then the AST is translated to HIR (High-level Intermediate Representation).
16:42:06
beach
HIR is pretty much a standard flow graph as in other compilers, except that only Common Lisp objects are manipulated by the instructions, so address calculations are not exposed at that level.
16:49:47
jcowan
But there is nothing wrong with the idea of writing a back end that outputs Scheme and invokes Scheme procedures that implement the primops.
16:50:29
jasom
jcowan: scheme isn't necessarily an optimal kernel language for CL, but it's certainly ported to everything.
16:50:43
beach
jcowan: Well, the entire compiler is written in Common Lisp, but if you don't mind having a Scheme compiler written in Common Lisp, then that's fine.
16:51:12
jcowan
It would be a Common Lisp compiler that generates Scheme (as opposed to C or C++ or LLVM), not a Scheme compiler.
16:51:57
beach
jcowan: Well, SICL has a similar backend already. It takes HIR and translates it into a very simple subset of Common Lisp.
16:51:58
jcowan
dlowe: Yes, but generating Scheme means you can use more capable Scheme systems than Guile
16:52:14
beach
jcowan: That way, I can execute SICL code inside a Common Lisp host, in this case SBCL.
16:53:52
jcowan
This is distinct from aeth's desire to have a Scheme compiler that generates Common Lisp.
16:56:49
phoe
...I just realized that if someone tried to make a Common Lisp successor and if they called it Uncommon Lisp, it would be pronounced like "uncle".
16:56:52
jcowan
Unfortunately aeth and I were discussing the two ideas at the same time, and I occasionally lost track
16:59:10
jcowan
Scheme has also been thought of an as an UNCOL (Universal Computer Oriented Language), or mechanism for translating between any two other computer languages
17:04:31
semz
rpg: Thanks for recommending CCL the other day. After a few hours of beating it with a stick it worked without any visible trouble.
17:14:32
semz
phoe: There were four problems. The first was the usual missing glibc-specific includes, <mcheck.h> and <fpucontrol.h>. Interestingly enough, fpucontrol.h didn't seem to be actually used anywhere.
17:15:05
semz
The second was a missing definition of struct _libc_xmm, or more accurately the fact that this struct has no name in musl. A somewhat ugly way to fix that was to define struct _libc_xmm in the same way in the source file
17:15:24
semz
The third was a glibc-specific function to get a version string which I just replaced with a placeholder
17:16:15
semz
Finally, the kernel would compile but segfault during relocation (do_relocs wrote to j_SPjmpsym which is readonly). This was fixed by disabling PIC though this might bite me later
17:16:43
jmercouris
I just assumed they made fasls and had a specialized "kernel" that could load their own fasls
17:17:11
phoe
we can compute everything computable by writing programs on punch cards or whatever, there's no point in making any other input device
17:17:37
jasom
jmercouris: they all have a runtime that implements things like GC, I/O and such, but when you compile a function it generates machine code that only assumes the existence of that runtime.
17:18:23
jmercouris
jasom: wow, it actually made asm on my screen with disassemble, very interesting
17:18:54
jasom
jmercouris: if you run a profiling run first than disassembly will also have instruction level profiling information
17:19:49
Bike
most compiled c programs do not run on bare metal either. there's no need for them to.
17:20:38
jasom
jmercouris: and when you save an image, it dumps all of ram to disk, including the compiled functions
17:21:01
Bike
do you know what a compiled c program looks like? you get an elf or a mach-o or whatever, which has code, and a bunch of other stuff
17:22:08
jmercouris
though I assume on embedded devices, for microlisp? ulisp? there is a way to make JUST the instructions that run the program, right?
17:23:13
jasom
sbcl does not currently have a working tree shaker (though there was a prototype one about 10 years ago)
17:23:54
jasom
This is odd because embedded devices now adays are much beefier than a mid-80s lisp machine.
17:24:46
dlowe
you have root objects that are always accessible. Those objects refer to other objects that must be kept live.
17:25:20
jasom
jmercouris: well actually it's a graph, but it's a directed graph with known roots. If you remove e.g. the common-lisp package from the roots, then any functions in common-lisp not referenced from your program will "fall out" of the tree. Hence a tree shaker
17:25:38
jasom
jmercouris: you have it backwards. All objects in CL are reachable from a set of root objects.
17:26:04
jasom
jmercouris: this is how garbage collectors work. any objects not reachable from the set of root objects are no longer in use, and thus freed.
17:26:52
jmercouris
okay, so there is no root object, but a set of root objects that all CL implementations implement?
17:27:23
dlowe
anyway, a tree shaker lets you specify, explicitly, which root objects you *actually* care about, and then prunes objects that don't have a reference to them.
17:28:31
jmercouris
let's not get into that, especially not when we begin talking about distributed systems
17:29:20
Bike
so as an example, in lispworks, you usually distribute images that don't include the compiler
17:29:30
jmercouris
okay, so let's say a given implementation, how do they decide what the root objects will be?
17:29:45
Bike
so the lispworks whatevermacallit shakes out the compiler functions and stuff that's dead if those aren't in.
17:30:34
jasom
jmercouris: everything reachable from the global environment. e.g. everything in all of the packages defined by the implementation (including, but not limited to the COMMON-LISP package)
17:31:02
specbot
The Global Environment: http://www.lispworks.com/reference/HyperSpec/Body/03_aaa.htm
17:31:35
jasom
For tree shaking, you just remove all of the non-user-defined packages from the root set, and then anything not used by user-defined packages is no longer reachable, and can be safely deleted.
17:31:52
dlowe
The after-tree-shaking image is not guaranteed to be a conforming implementation of CL. :)
17:31:55
jasom
It's actually somewhat trickier than that (the devil is always in the details), but that's the idea.
17:33:08
jmercouris
I have these nebulous images in my mind of the different components working together
17:33:13
jasom
if they try to convert strings to symbols at runtime (e.g. they are implementing an interpreter) it won't work right, but if you have an interpreter then you need the whole runtime anywas and shouldn't be using a tree-shaker.
17:34:04
jmercouris
does it free them from memory? is there some special process? is it tied to the implementation? is there a CL command?
17:34:43
jasom
jmercouris: It is not built into the standard, but almost all implementations provide it.
17:35:09
jasom
jmercouris: plus, most implementations usually run the GC implicitly before saving an image (Because it would be stupid to not to)
17:37:41
jasom
ECL with the boehm collector disabled would work; you can use free() to free the objects.
17:37:53
Bike
a system with manual memory management but without fixed addresses sounds pretty weird.
17:38:56
dlowe
you'd have to free your bignums, but you don't actually know when it stops being a fixnum without checking.
17:42:10
jasom
One day a student came to Moon and said: “I understand how to make a better garbage collector. We must keep a reference count of the pointers to each cons.”Moon patiently told the student the following story: “One day a student came to Moon and said: ‘I understand how to make a better garbage collector...
17:44:00
onion
[you are] missing [a] noun. i would really like the opportunity to organize and lay out my own memory and addresses, that was my favorite thing
17:44:06
phoe
onion: there's no way to refer to cycles *as* references without traversing the whole reference tree each time you modify a pointer.
17:44:25
phoe
because a single modification of a reference can either create a cycle or break a cycle or both.
17:44:35
onion
the reference count is just a number, starts at 1 on instance create, free object when its at 0
17:46:08
jasom
onion: #1=(A . #1#) <== this will never be collected because it will always have a reference count of at least 1
17:48:01
makomo
i added the quicklisp loading code into my .sbclrc but it seems i can't use any of ql's functionality directly after (load quicklisp-init) is evaluated?
17:48:41
phoe
makomo: are you using symbols from the QL package in the same form where you do the LOAD?
17:48:43
makomo
i wanted to add a few lines of code which would automatically push a path onto ql:*local-project-directories* and call (ql:register-local-projects)
17:50:16
phoe
onion: the problem of reference counting has been solved many times and there are no sane ways of turning cycle information into reference counts, which are numbers.
17:50:56
phoe
each time you modify a pointer, you have to traverse the tree and see what changed. so basically after every modification of a reference, you run GC.
17:54:50
sjl
http://www.cs.virginia.edu/~cs415/reading/bacon-garbage.pdf is a good read if you haven't already seen it
17:57:36
Baggers
the slime-repl code says 'This used to be the default REPL for SLIME, but it was hard to maintain' what is the default repl used in slime now?
17:58:53
Xach
Baggers: inferior-lisp, I think, is the default. my impression is that few go with it.
18:00:22
Baggers
Xach: Cheers. So the common case is probably still slime-repl then? I've just been using slime-fancy for ever without thinking about it
18:00:56
fourier
phoe: it is sort of solved via using different kind of reference counted pointers and by thinking about objects life time and ownership. to solve cycle problem you just have to think if the object is allowed to hold the life cycle of another object or not, and use weak pointer if not
18:06:28
jasom
fourier: weak pointers work for many useful types of data structures, but not for the general case
18:07:26
jasom
e.g. a tree with parent pointers, it's obvious that the parent pointer can be weak; a doubly-linked list, one of the two links can be weak &c. But if it's "I represent a bunch of nodes that may be a coset of other bunches of nodes, and they are directed" there is no solution
18:17:38
asarch
"A half abstraction is expressed in code by a manifestation of the pattern, you're guaranteed to have massive code duplication with all the normal bad consequences that implies for maintainability." —Practical Common Lisp
18:22:03
onion
phoe: okay, i see and didnt know that; havent come across many cycling stuff in my time of refcounted platforms
18:22:06
jackdaniel
patterns (in GoF sense) are considered unnecessary in CL, where you have macros which can capture such patterns in a good abstraction
18:22:35
jasom
jackdaniel: I gave a counterexample to that just a few lines earlier; the with- macro pattern.
18:25:25
jackdaniel
having plugins which could be loaded into existing system could be 'standarized' if we had protocol-oriented libraries for instance
18:26:28
jackdaniel
"avoid macros if you can express something as a function" is a pattern too (sadly some programmers doesn't follow it)
18:27:52
phoe
they are repeatable, in a way, but they definitely do not mean the same as design patterns in more javalike programming languages.
18:28:45
jackdaniel
design patterns are some clues how to arrange things to make them work. it would be suprising if same design patterns would apply to fundamentally different languages.
18:30:35
Bike
sometime i should actually flip through that book on architecture and see how it got so big on programming of all things
18:31:02
aeth
jackdaniel: I would say "if you can express something as an inline function" rather than "as a function". If people are doing macros for performance, the only persuasive alternative is inline functions.
18:40:51
aeth
Perhaps things like how to structure your with- macros, e.g. this article: http://random-state.net/log/3390120648.html
18:44:45
scymtym_
there are multiple kinds of patterns in the OOA/D space. general responsibility assignment patterns (GRASP) are more general guidelines like in jackdaniel's macro example, design patterns in the GoF sense are actually patterns with a name, problem statement, etc. and specific roles that match parts of the design model and architecture patterns are yet another thing
20:00:58
phf
what was the name of the project of implementing most of the Standard in portable lisp, that i believe beach was working on and that the c++/llvm lisp compiler is using?
20:08:07
onion
is it possible to.... link symbols, like a symbolic link in the filesystem? for eg 'this-symbol points to whatever 'this-other-symbol points to
20:13:20
jcowan
In particular, you can redefine standard functions provided that doing so does not impact other functions
20:13:37
jcowan
e.g. you can redefine car to do something else, but this must not affect the definition of cadr
20:17:07
onion
that would be quite the implementation to define the behavior of .. changing parts of CL =)
20:17:40
specbot
Constraints on the COMMON-LISP Package for Conforming Programs: http://www.lispworks.com/reference/HyperSpec/Body/11_abab.htm
20:18:04
onion
in smalltalk its totally cool, to change system stuff, undefined behavior is kind of assumed to do that stuff too. people are a bit self conscious when they find themselves changing system core guts ...
20:18:58
Xach
I like changing internal behavior in my favorite implementation but I don't expect it to work on anything but the version of the implementation I changed.
20:19:40
onion
jcowan: ah cool, so in scheme, the stuff that already "links" or refers/points to system builtins, they are still ok ?
20:20:19
phoe
onion: so it is permitted to tweak your implementation's internals - just don't expect any kind of support when you do so on your own
20:21:38
aeth
Clearly, the solution with a native code compiler is to recompile everything that uses car so that the desirable new behavior is used.
20:22:33
jcowan
and if car is redefined to return a newly created car object, the likelihood of the compiler continuationg to work after a pervasisve change is small
20:23:44
pierpa_
jcowan: I seem to remember that it is possible to redefine CAR. No standard function must change behaviour because of this change.
20:24:51
jcowan
In R6RS and R7RS systems, car is imported from a library, and that makes it an error to redefine it
20:25:27
onion
so for ex., i could modify the symbol lookup stuff a bit, hackish, and add my own little symbol list for lookup. not that symbol links/aliases have any practical use, im just curious
20:29:18
onion
CL especially being one of the least tempting runtimes to 'customize' considering its purpose. albeit general =)
20:30:17
oleo
yah, the when the runtime system says it's UBER it doesn't have to be UBER when you port your ideas....
20:43:45
pagnol
I'm looking for something that would allow me to verify that an s-expression has a certain structure in a declarative fashion
20:47:36
aeth
destructuring-bind and a trivial do-destructuring-bind macro are the way to go, probably. https://gitlab.com/zombie-raptor/zombie-raptor/blob/840ea66d8f264ddaa11d4c65ebb348febe8e77c6/data/shader.lisp#L43-47
20:48:40
pagnol
I would like to declaratively specify that what follows :depends-on should be a list of keywords, for example
20:49:41
aeth
you can combine destructuring-bind and the 5-line do-destructuring-bind to write a declarative macro that essentially combines them. Probably < 40 lines.
20:49:57
oleo
(defun isomorph-p (a b) (cond ((atom a) (atom b)) ((atom b) nil) ((isomorph-p (car a) (car b)) (isomorph-p (cdr a) (cdr b))) (t nil)))
20:50:12
|3b|
ACTION wonders if there are any better parsers available for lists than last time i looked. most of the ones i found only worked on character input
21:03:16
Xach
jasom: that seems to be a variation of what i said. (which does not bother me...just want to make sure i understand.)
21:04:58
aeth
Something like this is more idiomatic imo: (let ((foo `(+ 1 2 3))) (destructuring-bind (symbol &rest arguments) foo (check-type symbol symbol) (apply symbol arguments)))
21:05:16
aeth
destructuring-bind makes your assumptions concrete and that gives you more useful errors when they're wrong!
21:06:03
aeth
car/cdr/caaddr/cdddadr/etc. are just ways to get a random NIL. And in CL (car NIL) => NIL and (cdr NIL) => NIL so you don't know where the NIL was introduced, so you don't know where the s-expression was malformed.
21:28:14
cgay
(eval '(list x y)) => error if x or y unbound. (apply #'funcall '(list x y)) => '(x y) Or did I misread the question...it seems too obvious.
21:29:21
jasom
cgay: you have a list that is of the form (FUNCTION ARG*) and you want to call the function with the arguments.
21:31:40
cgay
ok, I'm just pointing out that eval also evaluates all of the args as well, whereas apply/funcall will happily pass along the symbols.
21:37:19
Bike
stuff with a load form is still self evaluating, it just has arbitrary effects at load time.
21:41:13
jeosol
Need some help on condition system to make my code not blow up depending on input. I am calling a function (evaluation solution ..) which does a bunch of calculation steps. One of these steps could fail making the whole evaluation invalid
21:42:13
jeosol
so I want to wrap this top function with conditions so if it fails, I assign some variables and move on.
21:43:10
jeosol
Based on what I read, I have to throw some error (could be same error type for simplicity) in the different steps and just invoke a predefined restart. Does this sound right
21:43:59
Bike
So you have something like (loop for run in runs do (compute run)), and compute sometimes fails, but in that case you want to continue to the next run?
21:44:56
jeosol
More or less Bike, that is right. Sometimes, I ship the runs via parallel function, but let's discuss the serial case
21:45:34
jeosol
There are several other functions things might fail at and I can't instrument each sub function with conditions/restarts
21:46:12
jeosol
If I call the function, and error results because of some incompatability in parameters, I just given a high objective function value (disregard case) and move on to next
21:46:26
|3b|
restart would let you do things like change a value and continue a particular calculation (or configure how you wanted to handle errors at the top level if you have multiple options for that)
21:46:59
jeosol
yes |3b|, I have some other code using restart, but I was thinking there is a probably a simple way to do this
21:47:30
jeosol
I have something with handler-bind that invokes one of the automatic restarts for a simple test case.
21:49:09
jeosol
I worked through the log file analyzer example in PCL and have a case that works for that example. I still have to consider instrumentation with parallel call.
21:51:50
jeosol
But that example, has a way to test if the entry is even valid. Then proceed with normal proceed or have a restart-case. There are two points of failure, with my CL code when processing the parameters, and then another black-box I call that could also fail
21:52:36
jeosol
even if the CL side executed fine. I just want to call everything one error and be done. Not much time to really instrument code and identify failure points and type.
21:55:35
jeosol
Bike: that sounds like it, I was thinking a different type of error that inherits for 'error'
21:58:34
jeosol
It seems the idea is go near the potential failure points and throw the error, then wrap my function evaluation code with handler-bind where I specify one restart to invoke automatically.
21:59:52
|3b|
so if you just want to completely ignore a run, (handler-case (compute run) ((error (e) (format *error-io* "run ~s failed" run)))) or similar
22:02:08
jeosol
not sure if I explained correctly. If run is good F(X) = value from successful run, if bad, F(X) = 1e9. So what I do is initial F(X) variable to 1e9, and if call was sucessful, it will have the correct value.
22:03:21
|3b|
though if you have time to find specific expected failures, handling those specifically reduces chances of missing some typo and getting more failures than the input would normally cause on its own
22:04:43
jeosol
|3b|: yes, I do plan a full instrumentation with condition system so as identify other recovery mechanisms,
22:05:07
|3b|
ignore-errors also could be useful for finding the errors you would want to eventually handle explicitly, if you store them and make a report at the end or whatever
22:16:28
jeosol
|3b| what do you mean by failure points. My evaluations are serial, so there should be one failure point. Or you mean it will keep track of callers
22:18:06
|3b|
i mean ignore-errors/handler-case will just tell you what the errors were, not where they were signalled (which may be enough to find the problems, depending on the code)
22:19:07
|3b|
handler-bind and dissect will let you store a stack trace at each error, so if it fails in different places with different inputs, you can find all of those at once
22:19:19
jeosol
|3b|, sure eventually I need to be able to identify there the errors are, so I will have to come up with some error hierarchy eventually.
22:20:29
jeosol
for me on the development side, but for users, I would use some automated option, e.g., handle the error smartly, repair solutions, etc
22:21:28
jeosol
guys, I am happy to say, I ran small test case twice, after wrapping my F(X) code within (ignore-errors ..) and both times it ran to completion.
22:23:11
Shinmera
drmeister: You mean something that gathers symbols and docstrings and smashes them into a document?
22:23:36
drmeister
Say I had a technical writer and I want to write documentation for functions and classes or an API?
22:24:08
jasom
drmeister: https://sites.google.com/site/sabraonthehill/lisp-document-generation-apps
22:29:35
Shinmera
There's been a couple of major improvements over the last half year or so thanks to prompts by Baggers.
22:32:14
rpg
What I would most like to see is a tool like declit that lets you add structure by putting in arbitrary text (the stuff that tells users the big picture), and lets you rearrange entries to suit a structure that's not the same as the codes'
22:34:22
jeosol
so I took a quick look at the sabraonthehill link and there is a comment about adding tutorial type material in Staple
22:35:25
jeosol
Oh I see, I would love to take a look at documentation systems. Didier's post a while ago about some library tool discussed about Declit
22:36:39
jasom
I have not used Staple, so it may be my new least non-favorite once I get the chance to try it :)
22:36:40
Shinmera
I'm not sure why Sabra has lots of "no"s in his table for things like author, license, etc. as those have always been outputted by Staple since day one.
22:38:34
Shinmera
Staple can also be used as a full manual generation. Which symbols are outputted can be configured.
22:39:21
Shinmera
I'm rethinking how to make the symbol selection process more easily customisable right now, so hopefully that'll be more convenient soon.
22:46:42
rpg
Shinmera: Something like ASDF -- you could have a chapter for the object model, a chapter for plan-building, etc. It would be conceptually organized.
22:49:03
Shinmera
Well, the cop-out answer is that you can do anything (rainbows) since you can write your own template. To answer your question otherwise, the main "documentation body" is parsed from another file -- typically the README.md, so whatever structure you put in there is output into the resulting HTML. If you want to chop up the symbol indexes and intermix them with your main documentation body then that's currently
22:50:02
Shinmera
If you look at the template, the bulk of it is taken up by the symbol index, which is the main thing Staple does. https://github.com/Shinmera/staple/blob/master/modern.ctml#L99-L158
22:50:37
Shinmera
It does some minor stuff like primitively analysing <code> segments in the resulting body to try and provide cross-references, but the main documentation text is largely left untouched.
22:51:14
Shinmera
It could do more, I suppose, if I had a good idea about what people want it to do for that.
22:53:18
SAL9000
Shinmera: In regards to staple's analysis of "See XYZ" -- any particular reason that you're ignoring cross-package See links? In other words, I'm extending/wrapping another package - I want to cross-reference it's docs (in staple-browser).
22:54:15
Shinmera
Staple-browser is just a small hack that invokes staple directly. For staple "usually", it has no way of knowing where the documentation for another project lives, so it can't make a link to it.
22:54:43
SAL9000
ah. I've been pretty much treating staple as a doc-browser more than an doc-generator. :)
22:55:33
Shinmera
That behaviour could definitely be improved though. Providing a way to let staple know how to resolve cross references would be good.
22:56:40
SAL9000
FWIW, it *does* put an <a> element in, but foo:bar makes a bogus #link and foo::bar makes a link to a nonexistent file (iirc it'd make a link to ./bar)
22:59:20
jasom
https://www.scribd.com/document/375473123/Foo <-- automatic conversion of staple to PDF with pandoc is not terrible
23:00:48
SAL9000
you probably want to use pandoc for html->latex then mess with the source before pdflatex'ing
23:01:11
jasom
SAL9000: most of the things you would mess with in the header you can do on the pandoc command line with -V
23:01:57
SAL9000
looks like method & function names get a ton of extra paragraph breaks in the pdf, although maybe that's scribd web viewer brokenness
23:02:37
jasom
SAL9000: nope that appears too. Would be fairly simple to make html more friendly for pandoc conversion without changing the appearance I bet.
23:02:56
jasom
https://www.scribd.com/document/375473288/Staple-v2 <-- smapper margins with -V geometry:margin=1.5cm
23:05:28
jasom
ah, it looks like it is the <a> since each <code><code/> group gets its own line, and the <a> is interrupting the <code> blocks.
23:05:44
Shinmera
Alright, I need to head off to bed, but I'll gladly read about more suggestions once I wake up. Good night!