6 ms·
The Princeton INTERCAL Compiler's source code
- breakingcups 1y ago"[...] to English, where the interpreter was once literally another person but is now downgraded to an AI prompt system."
- MangoToupe 1y ago[flagged]
- deleted 1y ago[deleted]
- entrepy123 1y agoThe INTERCAL satirical language (the original compiler's source code of which is announced as recovered in TFA) was covered in a couple of episodes [0, 1] of the (highly recommended, if I may say) Advent of Computing podcast [2]. [0] https://adventofcomputing.libsyn.com/website/episode-78-intercal-and-esoterica [1] https://adventofcomputing.libsyn.com/website/episode-158-intercal-rides-again-restoring-a-lost-compiler [2] https://adventofcomputing.com
- lukasb 1y agoI always associated INTERCAL with COME FROM but it turns out that was "invented" separately (although its first implementation was in C-INTERCAL.)
- MangoToupe 1y agoI thought come-from was an early scheme primitive. It's pretty trivial to implement and it's a fun trick. Edit: i am very wrong. i also had no clue it was meant as a joke. I just figured someone had a use case.
- deleted 1y ago[deleted]
- vnorilo 1y agoThe recent C# feature called interceptors [1] pretty much looks like comefrom from where I stand. Yet everyone talking about it has either been serious, or very good at trolling. 1: https://khalidabuhakmeh.com/dotnet-8-interceptors https://khalidabuhakmeh.com/dotnet-8-interceptors
- pjmlp 1y agoI am completly against them, I think they have re-invented Microsoft Fakes, and PostSharp, only badly.
- skissane 1y agoFrom your link: [InterceptsLocation("/Users/khalidabuhakmeh/RiderProjects/ConsoleApp12/ConsoleApp12/Program.cs", line: 3, character: 3)] they added a language feature which is sensitive to precise line/character offsets in your source code, so the tiniest change to the source code invalidates your code… I’m speechless. Whatever they are aiming to achieve here, surely there is a more elegant, less ugly way
- poizan42 1y agoYou are not supposed to use interceptors in code you write yourself. The feature exists for Roslyn Source Generators that runs every time you build the code.
- ninkendo 1y agoI’m still confused though, if you’re generating the code anyway, why do you need an interceptor? Can’t you just generate the code to match what you want to redirect to, directly inline?
- poizan42 1y agoYes if all the code was generated. The problem is when you want to modify the behavior of user-supplied code - Roslyn Source Generators are additive so you cannot make modifications directly to user-supplied code. You can read about how they work here: https://github.com/dotnet/roslyn/blob/main/docs/features/incremental-generators.md https://github.com/dotnet/roslyn/blob/main/docs/features/inc... Basically they get the files (and ambient metadata) that are part of the compilation, filter to the parts it depends on, transforms to a in-mem representation of the data needed for the code generation, and then finally adds new files to the compilation. Since they can only add new files they cannot e.g. add code to be executed before or after user code is executed like with AOP. Interceptors are a solution to that problem.
- anyfoo 1y agoCOBOL has an almost-COME-FROM, its called “ALTER” and it changes the destination of a GO TO, but it’s “discouraged” nowadays.
- skissane 1y agoHistorically, COBOL has had some rather fascinatingly unusual features-my favourite is OPEN INPUT REVERSED, which opens files for reading backwards-not sure if this was ever in any of the COBOL standards, but it exists in IBM mainframe COBOL, and many implementations on other platforms have copied it from there. It usually only works for files with fixed length records, and reads the records in reverse sequential order, but the bits/bytes within the record in forward order. In theory, it could be made to work for variable-length record files as well, but I’m not aware of any implementation which does. The original motivation was to support reading magnetic tapes backwards, so you could write data to a tape, then read it back in without a time-consuming rewind - which was important in the early years of computing, when memory and disk sizes were so small, magnetic tapes were commonly used for temporary storage / work files. Most tape drives nowadays don’t support reading tapes backwards, even though there are standard SCSI commands defined to do so-but I believe IBM 3592 tape drive series still supports this, as do virtual tape servers targeted at mainframes. The drive physically reads the bits off the tape in reverse order, but then reverses the data before sending it to the computer. I’m not aware of any other language which supports reading files backwards, other than COBOL. Well, mainframe assembly does, and you can invoke the relevant mainframe IO calls from languages such as C-but COBOL is the only language I know of which has it as a language feature.
- rbanffy 1y ago> I’m not aware of any other language which supports reading files backwards, other than COBOL. You can always use seek() and read(). Won’t work for variable length records, but open(file).readlines()[::-1] should work in Python (even though it’s cheating under the hood).
- skissane 1y agoThose are ways of emulating reading files backward using other language features, not explicit language features for reverse-reading of files. Actually now I realise z/OS stdio has support for backwards-reading of VSAM files: you can fopen with mode “r,type=record,acc=bwd” and “acc=bwd” sets file read direction to reverse. And you can put an open type=record file in reverse reading mode by calling flocate() with __KEY_LAST, __KEY_EQ_BWD, etc But going just by the docs, that only works for VSAM not BSAM. Whereas COBOL’s OPEN INPUT REVERSED definitely works for BSAM, but not sure if it works for VSAM
- Duanemclemore 1y agoProbably my single favorite podcast episode ever is the Future of Coding's episode on INTERCAL [0]. At least I think they tried to make it about INTERCAL. No matter what - a consideration befitting the subject. [0]https://futureofcoding.org/episodes/064.html https://futureofcoding.org/episodes/064.html
- ghssds 1y agoThey call it an esoteric language but event-driven programming is basically based on "COME FROM" structures. Shell also extensively uses PLEASE-like fonctionality in the form of SUDO. The syntax of INTERCAL is very clean if we compare it to, say, regex.
- anyfoo 1y agoNot sure about regex. Its syntax is, by definition, regular. (Okay, most regex engines people use aren’t technically fully regular languages anymore, but that just makes things more convenient.)
- eru 1y ago> Its syntax is, by definition, regular. No, not at all. Regexes describe regular languages, but that doesn't mean that their own syntax needs to be a regular language. Eg many regexes allow parens, so you can have both 'ab|c' and 'a(b|c)'. But if you require your parens to be balanced, that's no longer a regular language.
- skissane 1y ago> But if you require your parens to be balanced, that's no longer a regular language From a certain pedantic perspective, it still is a regular language, since there is a finite (implementation dependent) upper bound on nesting depth, and balanced parens with a finite upper bound of nesting is regular. OTOH, one can appeal to the linguistic distinction between competence and performance, and say that regexes are irregular in pure competence, even though all (practically usable) languages turn out to be regular once we constrain them by performance as well.
- eru 1y ago> From a certain pedantic perspective, it still is a regular language, since there is a finite (implementation dependent) upper bound on nesting depth, and balanced parens with a finite upper bound of nesting is regular. That's a silly point, because it makes all languages trivially finite, even monsters like C++. (Finity is even more of a restriction than being regular.)
- xxmarkuski 1y agoINTERCAL is presented at the Christmas Lecture in Programming at KIT
- az09mugen 1y agoSince there is the source now, does someone know what quantity/proportion of "PLEASE" the developer needs to write ? Because IIRC, if you don't put enough or too much "PLEASE", the compiler won't compile.
- moritzwarhier 1y agoLet's start with: I don't know. Also I can't read this language (BASIC variant?) and am browsing from a phone. But this line at least outputs the error message: https://github.com/rottytooth/INTERCAL72/blob/f94e0c8eaaf1347a3d9aaea58ddeffb9327ffc01/restored/ical.sbl#L406 https://github.com/rottytooth/INTERCAL72/blob/f94e0c8eaaf134... edit: probably slightly complicated :D but this makes me wonder if it's related to the source mutliplying some variable/register value by 3 in the error line: > You will need at least 3 lines of code, with one PLEASE statement among them. (from README) Just searching "PLEASE" also shows increments and a comparison with a number written in hex... so it should be easy to figure out the intercal "please" halting problem instance, right? :)
- az09mugen 1y agoThank you so much for the time you took answering that existential question of mine! (And maybe others)
- moritzwarhier 1y agoThanks for your reply: apparently, sometimes questions as answers can be helpful :)
- tasty_freeze 1y agoI'm waiting for the self-hosting version of the compiler before I deploy it in my own projects.