Register a SA Forums Account here!
JOINING THE SA FORUMS WILL REMOVE THIS BIG AD, THE ANNOYING UNDERLINED ADS, AND STUPID INTERSTITIAL ADS!!!

You can: log in, read the tech support FAQ, or request your lost password. This dumb message (and those ads) will appear on every screen until you register! Get rid of this crap by registering your own SA Forums Account and joining roughly 150,000 Goons, for the one-time price of $9.95! We charge money because it costs us money per month for bills, and since we don't believe in showing ads to our users, we try to make the money back through forum registrations.
 
  • Post
  • Reply
Blotto Skorzany
Nov 7, 2008

He's a PSoC, loose and runnin'
came the whisper from each lip
And he's here to do some business with
the bad ADC on his chip
bad ADC on his chiiiiip

BigRedDot posted:

I guess this is some religious allusion but I have no idea what it means.

"Penny wise, pound foolish", roughly (think about the size of a gnat and a camel)

Adbot
ADBOT LOVES YOU

Blotto Skorzany
Nov 7, 2008

He's a PSoC, loose and runnin'
came the whisper from each lip
And he's here to do some business with
the bad ADC on his chip
bad ADC on his chiiiiip

MEAT TREAT posted:

This is probably the biggest gap in my programming knowledge, but how the hell can I know if my high level (Python, Java, C#) code is provoking cache misses? Is there some profiling tool that can tell me?
First, what tef said.

Second, if you were working in C, you could putz about with cachegrind, although I don't think anything meaningful could be extracted from it for anything interpreted or run in a vm or jitted. I suppose you could consider at a conceptual level that caches try to take advantage of temporal and spatial locality, eg. repeated references to a thing or references to adjacent things both take better advantage of a cache than references to random objects (although I don't know if Python provides a true contiguous array, but Java and C# both do).

This would be very far down on my priority queue of poo poo to consider if I had VHLL code that needed to go faster.

MEAT TREAT posted:

Do I have to necessarily be programming in some kind of assembly code to get the most out of my embedded hardware, or is just following certain best practices? I've never done any kind of embedded/mobile coding so I'm quite curious to know more on the subject.

This really depends on what you mean by "get the most out of". If your embedded application needs to do something at a given high frequency (megaherz PWM or communication by a protocol or whatever) and you don't have on-board dedicated hardware to do it, you might indeed hit a wall if you can't drop down to at least C, and there are certain annoyances with some compilers that target embedded platforms that make writing routines in assembly either necessary or the easier path in certain circumstances. That being said, if you're just trying to build something to blink LEDs and sound buzzers and run a stepper motor you'll probably be fine with whatever (even BASIC stamps can be surprisingly capable).

TasteMyHouse
Dec 21, 2006

Otto Skorzeny posted:

there are certain annoyances with some compilers that target embedded platforms that make writing routines in assembly either necessary or the easier path in certain circumstances.

VisualDSP++ I am looking at you.

The King of Swag
Nov 10, 2005

To escape the closure,
is to become the God of Swag.

mr_jim posted:

None of the "C-like" languages are all that close to C. Usually that term just means that they use {} to delimit blocks, and they have similar syntax for control structures and function calls. Or, in the cases of C++ and Objective-C, they started out as extensions of C. But they all require a different approach to programming than C.

Objective-C I would argue is the closest "C-like" language, in fact you can't call it "C-like" as it's actually just a superset of C. All the magic that goes on is contained within the Obj-C runtime library. When compiled, ObjC code is turned into strict C before being fully compiled into object files.

That's important to remember because Objective-C is C and all the same rules, especially of memory management apply. In fact, the first major language I learned way back was Objective-C and the language is inseparable from strict C. If you learn ObjC, you already know C and if you know C, you know 98% of everything about ObjC.

That's not an exaggeration either; the real beauty behind ObjC is that it adds so little while you gain so much. The only real downside is that it's the polar opposite of C++; the two languages approach and tackle object orientation using completely different concepts. Unfortunately for someone like me who has learned both but strongly prefers one, it has ruined the other. I cannot look at C++ code without cringing the entire time.

mr_jim
Oct 30, 2006

OUT OF THE DARK

The King of Swag posted:

Objective-C I would argue is the closest "C-like" language, in fact you can't call it "C-like" as it's actually just a superset of C. All the magic that goes on is contained within the Obj-C runtime library. When compiled, ObjC code is turned into strict C before being fully compiled into object files.

That's important to remember because Objective-C is C and all the same rules, especially of memory management apply. In fact, the first major language I learned way back was Objective-C and the language is inseparable from strict C. If you learn ObjC, you already know C and if you know C, you know 98% of everything about ObjC.

That's not an exaggeration either; the real beauty behind ObjC is that it adds so little while you gain so much. The only real downside is that it's the polar opposite of C++; the two languages approach and tackle object orientation using completely different concepts. Unfortunately for someone like me who has learned both but strongly prefers one, it has ruined the other. I cannot look at C++ code without cringing the entire time.

All of that is true. When I said that Objective-C requires a different approach, I was thinking in terms what it adds to C, not what it changes. A program written in Objective-C that makes use of the features that it adds (objects, messages, and dynamic typing) will be structured differently than one written in C.

raminasi
Jan 25, 2005

a last drink with no ice
Super-newbie Prolog question:

I have a particular, not-necessarily-commutative defined relationship:
code:
full_overlap(a,b).
full_overlap(a,c).
full_overlap(b,a).
full_overlap(c,a).

full_overlap(a,d).
full_overlap(a,e).

full_overlap(d,e).
full_overlap(e,d).

full_overlap(X,X).
How do I define a rule to make my relationship transitive? I.e. naively:
code:
full_overlap(X,Y) :-
  full_overlap(X,Z),
  full_overlap(Z,Y).
This, of course, doesn't work in cases like full_overlap(d,a) because it flips back and forth forever between full_overlap(d,e) and full_overlap(e,d).

My prior experience with Prolog was five years ago for three weeks in a class I ended up dropping, so I really don't know how to "think Prolog" yet.

pseudorandom name
May 6, 2007

The King of Swag posted:

Objective-C I would argue is the closest "C-like" language, in fact you can't call it "C-like" as it's actually just a superset of C. All the magic that goes on is contained within the Obj-C runtime library. When compiled, ObjC code is turned into strict C before being fully compiled into object files.

Objective C has exceptions now, so it isn't a strict superset of C.

pokeyman
Nov 26, 2006

That elephant ate my entire platoon.

pseudorandom name posted:

Objective C has exceptions now, so it isn't a strict superset of C.

Alright, I'll bite: show me an example of C code that can't be compiled by an Objective-C compiler due to Objective-C exceptions.

(Also, "now"? Hasn't Objective-C had exceptions for a decade?)

tef
May 30, 2004

-> some l-system crap ->

GrumpyDoctor posted:

Super-newbie Prolog question:

try


code:

simple_relation(a,b).
simple_relation(b,c).

transitive_relation(X,Y) :- simple_relation(X,Y).
transitive_relation(X,Y) :- simple_relation(Y,X).

pseudorandom name
May 6, 2007

pokeyman posted:

Alright, I'll bite: show me an example of C code that can't be compiled by an Objective-C compiler due to Objective-C exceptions.
I'm assuming you meant "show me an example of Objective C code that can't be compiled to C due to exceptions", because that's what we were talking about.

foo.cpp:
code:
#include <iostream>
using namespace std;

extern "C" void stuff();

int main(int argc, char* argv[])
{
	try {
		stuff();
	} catch(...) {
		cout << "stuff threw!" << endl;
	}

	return 0;
}
bar.m:
code:
#import <Foundation/NSString.h>
#import <Foundation/NSException.h>

void stuff()
{
	NSException *e = [NSException
		exceptionWithName: @"TestException"
		reason: @"This is a test exception"
		userInfo: nil];
	@throw e;
}
And, yes, you can fake exceptions using setjmp() and longjmp(), but the C++ runtime doesn't, so in order to interoperate with C++, you have to generate the .eh_frame data, and there's no way to do that from C.

pseudorandom name fucked around with this message at 05:54 on Apr 17, 2011

ultrafilter
Aug 23, 2007

It's okay if you have any questions.


tef posted:

try


code:

simple_relation(a,b).
simple_relation(b,c).

transitive_relation(X,Y) :- simple_relation(X,Y).
transitive_relation(X,Y) :- simple_relation(Y,X).

That's symmetry, not transitivity. You want something like
code:
transitive_relation(X,Y) :- simple_relation(X,Z), simple_relation(Z,Y)
I hope that's the right syntax, but it's been a long time since I've written in Prolog.

The King of Swag
Nov 10, 2005

To escape the closure,
is to become the God of Swag.

pseudorandom name posted:

...And, yes, you can fake exceptions using setjmp() and longjmp(), but...

The Apple docs flat out say that exception handling is faked using setjmp() and longjmp() and thus is subject to any limitations associated with those functions. Part of the problem is that you're confusing the NextStep library (exceptions require the use of NSException) with the ObjC runtime. Now, the latest versions of the runtime do natively support exceptions, but if I understand the gcc documentation correctly, they're still broken down into setjmp.h trickery during compile-time.

pseudorandom name posted:

I'm assuming you meant "show me an example of Objective C code that can't be compiled to C due to exceptions", because that's what we were talking about.

No, he meant what he typed. ObjC being a superset of C means it encompasses C in its entirety and thus there is no functional C code that won't compile properly in ObjC. This is in contrast to C++ which builds from C, but is not a superset of C, as C will not necessarily compile correctly under C++.

Edit: Just want to add that ObjC by its nature has to be broken into valid C before final compilation into object files, because there isn't actually an ObjC compiler. Both gcc and LLVM are C compilers that use flags to link the ObjC runtime and to optimize for ObjC memory usage patterns, but they can still only compile C code (Apple's LLVM implementation may have some weird exceptions, I'm not sure).

The King of Swag fucked around with this message at 07:50 on Apr 17, 2011

ShoulderDaemon
Oct 9, 2003
support goon fund
Taco Defender

ultrafilter posted:

That's symmetry, not transitivity. You want something like
code:
transitive_relation(X,Y) :- simple_relation(X,Z), simple_relation(Z,Y)
I hope that's the right syntax, but it's been a long time since I've written in Prolog.

And that's an incomplete transitive relation, because it only allows you to step over a single intermediate.

code:
transitive_relation(X,Z) :- simple_relation(X,Z).
transitive_relation(X,Z) :- simple_relation(X,Y), transitive_relation(Y,Z).
transitive_relation(X,Z) :- transitive_relation(X,Y), simple_relation(Y,Z).
The first line makes the transitive relation a superset of the simple relation. The second allows you to introduce an intermediate node, as long as you can make a simple step to it from the left. The third line allows steps from the right. Lines 2 and 3 are of couse equivalent in power, but one or the other may allow the solver to perform better depending on your data.

The trick here is that we're avoiding an infinite recursion while searching transitive_relation by compelling the solver to reduce by at least one simple_relation each time. This way the solver always makes progress of some sort.

pseudorandom name
May 6, 2007

The King of Swag posted:

The Apple docs flat out say that exception handling is faked using setjmp() and longjmp() and thus is subject to any limitations associated with those functions. Part of the problem is that you're confusing the NextStep library (exceptions require the use of NSException) with the ObjC runtime. Now, the latest versions of the runtime do natively support exceptions, but if I understand the gcc documentation correctly, they're still broken down into setjmp.h trickery during compile-time.
And the Apple docs go on to say that 64-bit binaries use the table-based zero cost exception handling mechanism, which doesn't use setjmp()/longjmp() at all. On Linux, 32-bit and 64-bit Objective C and Objective C++ binaries always use the table-based zero cast EH system.

The King of Swag posted:

No, he meant what he typed. ObjC being a superset of C means it encompasses C in its entirety and thus there is no functional C code that won't compile properly in ObjC. This is in contrast to C++ which builds from C, but is not a superset of C, as C will not necessarily compile correctly under C++.

Edit: Just want to add that ObjC by its nature has to be broken into valid C before final compilation into object files, because there isn't actually an ObjC compiler. Both gcc and LLVM are C compilers that use flags to link the ObjC runtime and to optimize for ObjC memory usage patterns, but they can still only compile C code (Apple's LLVM implementation may have some weird exceptions, I'm not sure).

I was responding to your comment that

The King of Swag posted:

All the magic that goes on is contained within the Obj-C runtime library. When compiled, ObjC code is turned into strict C before being fully compiled into object files.
which is blatantly wrong; the C, C++, Objective C and Objective C++ frontends in clang and gcc are all separate entities and at no point are any of the other source languages transformed into C before being compiled, the compilers understand each of the languages natively.

(gcc actually goes to the extent of having entirely separate binaries for each of the source languages, called cc1, cc1plus, cc1obj, and cc1objplus, respectively. clang has a single binary that can operate in the different modes as necessary. But there's no cfront nonsense anywhere.)

pokeyman
Nov 26, 2006

That elephant ate my entire platoon.

pseudorandom name posted:

I'm assuming you meant "show me an example of Objective C code that can't be compiled to C due to exceptions", because that's what we were talking about.

You assume wrong. I was responding to you saying

pseudorandom name posted:

Objective C... isn't a strict superset of C.
which you can easily prove by giving an example of a C program that cannot be compiled by the Objective-C compiler. This example is what I was asking for.

I think I just misunderstood you originally and that we actually agree: Objective-C is not a subset of C. (Which is trivial given that Objective-C is a strict superset of C.) This seems to be what you're arguing in your other posts. C works in both compilers, Objective-C only works with Objective-C compilers.

tef
May 30, 2004

-> some l-system crap ->

ultrafilter posted:

That's symmetry, not transitivity. You want something like
code:
transitive_relation(X,Y) :- simple_relation(X,Z), simple_relation(Z,Y)
I hope that's the right syntax, but it's been a long time since I've written in Prolog.

misread the question coming in at 5 am whoops

rolleyes
Nov 16, 2006

Sometimes you have to roll the hard... two?

rt4 posted:

PHP is like rubbing my brain on a metal grater

Sounds like it's close to the metal to me! :v:

edit:
Regarding the "C-like" discussion, all I ever take it to mean is that the syntax is similar. If you know C++ and look at the source code for a C# program you're going to be able to follow it... right up until you run into a lambda expression or something.

rolleyes fucked around with this message at 16:03 on Apr 17, 2011

raminasi
Jan 25, 2005

a last drink with no ice

ShoulderDaemon posted:

And that's an incomplete transitive relation, because it only allows you to step over a single intermediate.

code:
transitive_relation(X,Z) :- simple_relation(X,Z).
transitive_relation(X,Z) :- simple_relation(X,Y), transitive_relation(Y,Z).
transitive_relation(X,Z) :- transitive_relation(X,Y), simple_relation(Y,Z).
The first line makes the transitive relation a superset of the simple relation. The second allows you to introduce an intermediate node, as long as you can make a simple step to it from the left. The third line allows steps from the right. Lines 2 and 3 are of couse equivalent in power, but one or the other may allow the solver to perform better depending on your data.

The trick here is that we're avoiding an infinite recursion while searching transitive_relation by compelling the solver to reduce by at least one simple_relation each time. This way the solver always makes progress of some sort.

It's still not working though.

code:
[trace] 21 ?- transitive_relation(d,a).
   Call: (7) transitive_relation(d, a) ? creep
   Call: (8) simple_relation(d, a) ? creep
   Fail: (8) simple_relation(d, a) ? creep
   Redo: (7) transitive_relation(d, a) ? creep
   Call: (8) simple_relation(d, _G624) ? creep
   Exit: (8) simple_relation(d, e) ? creep
   Call: (8) transitive_relation(e, a) ? creep
   Call: (9) simple_relation(e, a) ? creep
   Fail: (9) simple_relation(e, a) ? creep
   Redo: (8) transitive_relation(e, a) ? creep
   Call: (9) simple_relation(e, _G624) ? creep
   Exit: (9) simple_relation(e, d) ? creep
   Call: (9) transitive_relation(d, a) ? creep
   Call: (10) simple_relation(d, a) ? creep
   Fail: (10) simple_relation(d, a) ? creep
   Redo: (9) transitive_relation(d, a) ? creep
   Call: (10) simple_relation(d, _G624) ? 

raminasi
Jan 25, 2005

a last drink with no ice
Ok I jury-rigged this up but it feels really inelegant:
code:
transitive_relation(X,Y) :- simple_relation(X,Y).
transitive_relation(X,Y) :- transitive_relation(X,Y,[]).
transitive_relation(X,Y,_) :- simple_relation(X,Y).
transitive_relation(X,Y,Path) :- 
  simple_relation(X,Z), 
  X \== Z, % this was really just to make debugging easier
  not(member(Z,Path)),
  transitive_relation(Z,Y,[X|Path]).

qntm
Jun 17, 2009
Is this a good place to ask about software licensing? I have made what I think is a pretty useful PHP parser generator, and I want other people to be able to use it. I do want my name to always be attached to modified/improved versions made and distributed by other people, but I am not sure how I feel about commercial use. Somebody suggested this to me and I thought it looked pretty good and then somebody else went "no no no" because apparently it is incompatible with other software licenses.

Basically, I don't particularly want to be taken advantage of, but I'm not a lawyer. Does anybody have any personal recommendations or experience?

tef
May 30, 2004

-> some l-system crap ->
where is the can of worms emote when you need it

tef
May 30, 2004

-> some l-system crap ->

qntm posted:

Is this a good place to ask about software licensing? I have made what I think is a pretty useful PHP parser generator, and I want other people to be able to use it.

MIT License is the simplest way to let people use your code without effort or pissing around.

quote:

I do want my name to always be attached to modified/improved versions made and distributed by other people, but I am not sure how I feel about commercial use.

This seems like a good idea until you end up with a readme bigger than the code base listing every single contributor. Also, attribution requirements don't play well with gnu software licenses, and they are pretty popular. My advice would be to care less about what people do with your code.

If they like what you've done they'll give you credit anyway.

tef
May 30, 2004

-> some l-system crap ->
Really, i'd rather talk about the code:

Looking at your code, it isn't a parser-generator, but a parsing library, given it doesn't produce a php file as output from the grammar specified. Yacc is normally a LALR(1) parser generator, not an LR(1) p-g. There is a difference in how the LR states are calculated for LALR (LR(1) has an insane amount of states). LR(1) handles left recursion, so I find it strange that your parsing library does not handle it.

You've actually written a top down parser library (that's LL-esque if you're keeping track), but I can't see any lookahead used to disambiguate states. It doesn't seem to handle choice but ordered choice from a passing inspection.

tef
May 30, 2004

-> some l-system crap ->

GrumpyDoctor posted:

Ok I jury-rigged this up but it feels really inelegant:
code:
transitive_relation(X,Y) :- simple_relation(X,Y).
transitive_relation(X,Y) :- transitive_relation(X,Y,[]).
transitive_relation(X,Y,_) :- simple_relation(X,Y).
transitive_relation(X,Y,Path) :- 
  simple_relation(X,Z), 
  X \== Z, % this was really just to make debugging easier
  not(member(Z,Path)),
  transitive_relation(Z,Y,[X|Path]).


Left recursion's a bitch :-)

You could fix this by using a different resolution method, or ensuring you only use right recursive terms in prolog, i.e terms 1+2 in shoulderdaemon's post (but note the conclusion below)

ShoulderDaemon posted:

code:
transitive_relation(X,Z) :- simple_relation(X,Z).
transitive_relation(X,Z) :- simple_relation(X,Y), transitive_relation(Y,Z).
transitive_relation(X,Z) :- transitive_relation(X,Y), simple_relation(Y,Z).
The trick here is that we're avoiding an infinite recursion while searching transitive_relation by compelling the solver to reduce by at least one simple_relation each time. This way the solver always makes progress of some sort.

Given it is prolog, search always proceeds from left to right, so the third relation here will cause infinite loops, but the first two should work, on an acyclic dataset.

But going by your little statement above it seems that you also have loops in your data i.e a relation(a,a) term in your dataset, you'll have to exclude them from the recursive case to prevent loops.

Which means you end up doing your 'inelegant' solution, recording the path to prevent looping.

tef fucked around with this message at 19:42 on Apr 18, 2011

qntm
Jun 17, 2009

tef posted:

Really, i'd rather talk about the code:

Looking at your code, it isn't a parser-generator, but a parsing library, given it doesn't produce a php file as output from the grammar specified.

Ah, indeed. I didn't twig that there was a clear distinction there. I was actually toying with attempting to output PHP code, but it turned out to be very difficult to achieve starting from my specific implementation. Also there is no easy way to print out a callback as text in PHP.

quote:

Yacc is normally a LALR(1) parser generator, not an LR(1) p-g. There is a difference in how the LR states are calculated for LALR (LR(1) has an insane amount of states). LR(1) handles left recursion, so I find it strange that your parsing library does not handle it.

You've actually written a top down parser library (that's LL-esque if you're keeping track), but I can't see any lookahead used to disambiguate states. It doesn't seem to handle choice but ordered choice from a passing inspection.

Yeah, I spent a horrifying amount of time trying to straighten all of this out by reading Wikipedia but I just could not get a clear handle on any of it. If you think it is a top-down parser library then you are more likely to be correct than I am.

There is no lookahead used to disambiguate states because any potential ambiguity is specifically disallowed at parser instantiation time.

The code is at http://qntm.org/railroad2 for anybody playing at home.

Will look into the MIT license.

qntm
Jun 17, 2009
Also to be honest I see no problem with having a potentially huge list of contributors attached to a piece of work that they all contributed to?

tef
May 30, 2004

-> some l-system crap ->

qntm posted:

There is no lookahead used to disambiguate states because any potential ambiguity is specifically disallowed at parser instantiation time.

A top down parser starts at the top of the parse tree and moves down the parse tree, so you start at the top of the parse tree, work out what comes next and try to parse it. So you go from <expression> to <literal> + <expression> to <number>, the idea being that you predict what comes next and try it.

Top down parsers are Combinator Based, or, PEGs, Recursive Descent and LL. Top down parsers have problems with left-recursion, because as starts at the top and explores, a rule like <expr> :== <expr> + <literal> will continue to search in a loop. To deal with this people remove the left-recursive terms, or cry. Top down parsers often use backtracking to deal with choices in parsing, exploring each rule until it fails or it succeeds.

A bottom up parser on the other hand, starts with <number> and then moves up to <literal> and then <expression>. You start at the bottom of the parse tree and move up, building the parse from the root nodes. Bottom up parsers are LR, LALR, SLR and a whole bunch of others.

Bottom up parsers are often implemented with automata. As it is processing the input it has to make two choices, 'shift' - keep reading and carry on, or 'reduce' - read enough input, can now turn what i've shifted into a bit of the parse tree. In trying to remove any ambiguity and have a deterministic parse, the parser must do one or the other. Unlike a top down parser, there isn't prediction, bottom up parsers read (shift) enough until it knows *exactly* what it is. When the parser doesn't know exactly what to do, it has what is known as a conflict. These can take many forms, shift/reduce and reduce/reduce conflict.

Bottom up parsers often use lookahead to reduce or deal with these conflicts, peeking ahead at the input stream to work out what to do. This is the number after LR in brackets. LR(0) has no lookahead.

So, given you can't use left recursion, but you seem to be building states and you don't use lookahead, you seem to have built a LL(0) parser :-)

If all this seems a little interesting and you'd like to know more I would heartily recommend 'Parsing Techniques 2nd Edition' http://www.amazon.com/Parsing-Techniques-Practical-Monographs-Computer/dp/038720248X it's awesome, comprehensive, accessible and generally explains most of this stuff. It's awesome.

I haven't begun to get into left corner and non-canonical stuff or generalized parsers. Maybe I should get around to writing that book....

tef
May 30, 2004

-> some l-system crap ->

qntm posted:

Also to be honest I see no problem with having a potentially huge list of contributors attached to a piece of work that they all contributed to?

Given you're writing it for php, they won't be distributing the software, so you won't get the attribution you desire.

gnu have a nice page on why they don't like the attribution clause, http://www.gnu.org/philosophy/bsd.html
personally I find it (requiring attribution) a little passive aggressive :-)

tef fucked around with this message at 23:13 on Apr 18, 2011

pokeyman
Nov 26, 2006

That elephant ate my entire platoon.
Public domain bitches.

(See also: CC0)

tef
May 30, 2004

-> some l-system crap ->
intellectual property is theft


just call me joseph proudhon

spiritual bypass
Feb 19, 2008

Grimey Drawer
What will you tell us next? Women should keep to secretarial work as to not drive down programming wages?

Blotto Skorzany
Nov 7, 2008

He's a PSoC, loose and runnin'
came the whisper from each lip
And he's here to do some business with
the bad ADC on his chip
bad ADC on his chiiiiip

tef posted:

intellectual property is theft


just call me joseph proudhon

i recently realized that mutualism and distributism are pretty similar :pirate:

Lonely Wolf
Jan 20, 2003

Will hawk false idols for heaps and heaps of dough.

tef posted:

Maybe I should get around to writing that book....

I would read a book you wrote, especially if it were about why PHP is a stupid jerk, but parsing is pretty cool too.

tef
May 30, 2004

-> some l-system crap ->

rt4 posted:

What will you tell us next? Women should keep to secretarial work as to not drive down programming wages?

programmers need to own the methods of production, i.e have the source to their compiler :v:

Mustach
Mar 2, 2003

In this long line, there's been some real strange genes. You've got 'em all, with some extras thrown in.
You can statically link to the standard library, but only if you use the government's compiler collection.

pseudorandom name
May 6, 2007

pokeyman posted:

Public domain bitches.

(See also: CC0)

Public domain doesn't let you disclaim any liability.

clockwork automaton
May 2, 2007

You've probably never heard of them.

Fun Shoe

pokeyman posted:

Public domain bitches.

(See also: CC0)

I release under the WTFPL:

code:
            DO WHAT THE gently caress YOU WANT TO PUBLIC LICENSE
                    Version 2, December 2004

 Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>

 Everyone is permitted to copy and distribute verbatim or modified
 copies of this license document, and changing it is allowed as long
 as the name is changed.

            DO WHAT THE gently caress YOU WANT TO PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. You just DO WHAT THE gently caress YOU WANT TO. 

Internet Janitor
May 17, 2008

"That isn't the appropriate trash receptacle."
clockwork automaton: right on! I've done the same for years.

pokeyman
Nov 26, 2006

That elephant ate my entire platoon.

pseudorandom name posted:

Public domain doesn't let you disclaim any liability.

No, it just doesn't do so automatically. It doesn't stop you from doing so if you feel you must.

Adbot
ADBOT LOVES YOU

pokeyman
Nov 26, 2006

That elephant ate my entire platoon.

clockwork automaton posted:

I release under the WTFPL

GPL-compatible too! I love it.

  • 1
  • 2
  • 3
  • 4
  • 5
  • Post
  • Reply