[HN Gopher] A first person shooter in 571 lines of GNU Awk (2016) ___________________________________________________________________ A first person shooter in 571 lines of GNU Awk (2016) Author : nequo Score : 227 points Date : 2023-01-19 16:55 UTC (6 hours ago) (HTM) web link (github.com) (TXT) w3m dump (github.com) | oweiler wrote: | I am shocked how readable the code is. Was expecting some Perl- | like spaghetti. | userbinator wrote: | You could say that the code isn't really awkward to read. | amalgamated_inc wrote: | That's what she sed | ufo wrote: | I was hoping for some clever abuse of AWK's patterns & regexes | but clean code will also do :) | dekhn wrote: | In my UNIX learning history I skipped straight from sed to perl | and didn't use awk. By the time I had switched to python, awk | sounded awfully "old" to me. | | I went back recently and read more on it and now I understand: it | was an excellent interpreted programming language that gave | semiskilled programmers some things C didn't, like associative | arrays, all nicely packaged within the UNIX frame of mind. In an | alternative universe, perhaps awk, instead of perl and then | python, would become the scripting language of choice. | [deleted] | srgpqt wrote: | Huh. Did not know Awk could be so similar to Javascript. I | certainly haven't seen it written in this way before, as usually | I only see it used for simple one-liners. | czx4f4bd wrote: | Awk is a fun, surprisingly powerful language. Even plain mawk | can do a lot, but gawk has debugger support, profiling, | namespaces, and even network support. (I wouldn't necessarily | go out of my way to use most of those features, but it's | possible!) | | It's honestly worth giving the mawk and gawk manual a skim just | to see what all they can do. I want to read through _The AWK | Programming Language_ as well. | | https://invisible-island.net/mawk/manpage/mawk.html | | https://www.gnu.org/software/gawk/manual/gawk.html | benhoyt wrote: | Yeah, they're both languages which are quite unlike C in | operation, but both (by design) use C-like syntax to be more | familiar to existing developers. I think AWK has survived | incredibly well for a language that's 46 years old. | pmarreck wrote: | Awk is super interesting if you peel away a little. One nice | thing about it is that the amount of code it takes to do | something seems to scale quite linearly with the complexity of | the thing you need to do. Which is exactly why you often see it | in one-liners, but it's so much more. Recommend a deeper look | at it. | tannhaeuser wrote: | JavaScript syntax clearly is derived from awk's: the function | keyword, regexp literals, for (x in a), optional semicolons, | (associative) arrays, ... | | Brendan Eich said as much: "JS's function keyword did come from | AWK" [1]. | | [1]: https://brendaneich.com/2010/07/a-brief-history-of- | javascrip... | jhbadger wrote: | There is so much about Awk that just seems more modern than | Perl, which largely replaced Awk in common usage in the mid | 1990s. Maybe the similarity to Javascript (which as others have | mentioned isn't coincidental) will encourage younger people to | take a look at it. | carapace wrote: | This was linked from "The State of the Awk (2020)" on the front | page earlier today: https://news.ycombinator.com/item?id=34438560 | | See also "AWK As A Major Systems Programming Language -- | Revisited" also linked from that article: | http://www.skeeve.com/awk-sys-prog.html | j0hnyl wrote: | I came across this not too long ago. I recently picked up awk and | went looking for unique / unlikely programs written in the | language. This is completely mind blowing. | jandrese wrote: | I don't know if it was the RNG messing with me or something else, | but almost all of the monsters ended up congregating in the | elevator room when I played. I was basically just standing in the | approach hallway blasting them away one after another. | harveywi wrote: | They missed an opportunity to call this "Levenshtein 3D" | pmarreck wrote: | I, at least, appreciated this joke =) | amalgamated_inc wrote: | Literally dead | revskill wrote: | Curious to know if there's language that differentiate between | procedure (function with side-effect) and pure function at the | syntax level. | adrian_b wrote: | Among the gcc extensions to C and C++ there are 2 attributes | for functions without side effects: | __attribute__ ((pure)) __attribute__ ((const)) | | The 'pure' attribute imposes similar but looser restrictions on | a function's definition than the 'const' attribute: 'pure' | allows the function to read any non-volatile memory, even if it | changes in between successive invocations of the function. | retzkek wrote: | Fortran has subroutines and functions. Functions can take | multiple arguments and return a single value (however arguments | can also be modified). Subroutines can take multiple arguments, | which can be inputs, outputs, or both (arguments can be | declared inputs or outputs, but it's not required) and don't | return a value. And then there's common blocks for sharing | variables between subroutines... | kqr wrote: | Ada does this -- sort of. In the base language procedures can't | return anything, and functions must return something. However, | either of the two can execute side effects. | | The SPARK subset of Ada enforces purity of functions at compile | time. | | SPARK also allows partial purity, i.e. you can declare that a | procedure has side effects, but only in the sense that it uses | the wall clock as an input, or only in the sense that it writes | to a global variable. You can specify in some detail exactly | which side effects are allowed to happen in a procedure. | efdee wrote: | BASIC has SUB (for procedures) vs FUNCTION (for functions). | doodpants wrote: | I used Borland Turbo Pascal back in the '80s and '90s, and as I | recall it had separate keywords and syntax for defining | procedures vs. functions. | tgv wrote: | That was about returning a result or not. The void type made | that redundant (in Algol-68). | etra0 wrote: | Nim does this, it has 'proc' and 'func'. They define a `func` | as a procedure with no side effects using the macro | `{.noSideEffect.}` [1]. | | [1] https://nim-lang.org/docs/manual.html#procedures-func | glomgril wrote: | Hell of a side project. As deranged as it is awesome. | mikenew wrote: | Looking at the code it's not nearly as deranged as I would have | expected. It's actually pretty easy to follow. | helf wrote: | This is disgusting and I love it | haolez wrote: | This dev must be one of the few in the world that doesn't need | Google or man pages when awk is needed :) | klyrs wrote: | The weird thing about awk is that it can be written to look | like an ordinary c-inspired scripting language. But it also | supports the terse one-liners that we see so often; and the | general perception is that it's a language for wizards. The | ordinary scripting language is hiding in plain sight. | jandrese wrote: | What a delightfully insane project. AWK is under-appreciated | IMHO. Read the short manual and you'll discover a world of | functionality in a highly orthogonal interface. Pattern | Match->Manipulate. An incredibly useful workflow for many tasks. | avgcorrection wrote: | An elegant tool for forgetting inbetween all my organic needs | for it. | no_wizard wrote: | I wish there was like a "libawk" or something like it for | programmatic usage. Its really a neat piece of work that is | limited on being only a shell program. | | At least, as far as I am aware, there is no programmatic | interface | pphysch wrote: | What would be a use case for this? | PhilipRoman wrote: | This is a somewhat different idea but I'd like to be able | to feed structured data (in memory objects) to an (user | defined) awk-like script without the need to | serialize/parse everything. This could be used for packet | filtering, conditional breakpoints, file searching, syscall | filtering and intercepting, etc. Basically wherever you | need a user defined filter more powerful than regex. | | The embedder can decide what variables and functions to | provide for each invocation of the script. You could get | something like Wireshark filters out of the box: | ip && port==1234 {print size, time} | | Graphviz includes a tool "gvpr" which essentially | implements this idea for processing graphs but of course, | they end up reimplementing a large part of awk. | chaboud wrote: | At this point I'be caved and just coerce through json via | python and jam things through jq for most of my data | inspection and sleuthing. | no_wizard wrote: | Text processing & extraction | pphysch wrote: | Like a middle ground between regex and embedded Lua? | yumaikas wrote: | Where would you use this? Most languages have good enough | string processing to imitate a lot of what AWK does | wrp wrote: | Gawk added facilities for writing extensions, but I don't see | how to use it as a library. Funny I never thought of it, | considering how much I like awk, but using awk instead of Lua | as an embedded extension language sounds appealing. | benhoyt wrote: | I don't know of a "libawk" C library, but my GoAWK | interpreter can also be used as a library (Go) library. See | reference docs: | https://pkg.go.dev/github.com/benhoyt/goawk/interp | | A project that's using it that way is Benthos, a "stream | processor" written in Go. Awk is one of the "processors", the | components that filter and transform data: | https://www.benthos.dev/docs/components/processors/awk | [deleted] | dang wrote: | Related: | | _Show HN: 3D shooter in your terminal using raycasting in Awk_ - | https://news.ycombinator.com/item?id=10896901 - Jan 2016 (55 | comments) | causi wrote: | If you're interested in feats of low-size games, I offer you | kkrieger, a 3D FPS that fits in 96KB. | | https://www.youtube.com/watch?v=8fZBUsn5RYg | beezlebroxxxxxx wrote: | This is wild. One wonders what would happen if the (perhaps | misguided) ideals that shaped that project returned to being in | vogue. | sitkack wrote: | Previous discussions for a post about how they achieved that | feat. | | https://fgiesen.wordpress.com/2012/04/08/metaprogramming- | for... | | Nov 12, 2020 https://news.ycombinator.com/item?id=25043199 | | Aug 8, 2019 https://news.ycombinator.com/item?id=20635640 | | May 13, 2014 https://news.ycombinator.com/item?id=7739599 | badsectoracula wrote: | Procedural generation for 3D content is something quite | common nowadays - see Substance Designer as an example. | | AFAIK the people behind kkrieger tried to push their tool for | commercial use at some point but it didn't seem to catch on - | but that was years ago. | lmm wrote: | Huge but somewhat dull games. No Man's Sky is probably the | big name that went that way recently. Or, in its own way, | Dwarf Fortress. | jesprenj wrote: | AFAIK this was achieved by heavily using DirectX API and | features it contains. When running, it uses around 300 MiB of | RAM. | andai wrote: | The textures and models are procedurally generated at load | time! | McNutty wrote: | In the linked video, one of the kkrieger devs (kb) comments and | addresses some FAQs | 404mm wrote: | Nice. My little CLI utility that filters and lists my servers | in EC2 is 11MB (GO). ___________________________________________________________________ (page generated 2023-01-19 23:00 UTC)