frontpage.
newsnewestaskshowjobs

Made with ♥ by @iamnishanth

Open Source @Github

Charles Bukowski, William Burroughs, and the Computer (2009)

https://realitystudio.org/bibliographic-bunker/charles-bukowski-william-burroughs-and-the-computer/
18•zdw•1h ago•1 comments

WebGL Water (2010)

https://madebyevan.com/webgl-water/
63•gaws•1h ago•15 comments

Brandon's Semiconductor Simulator

https://brandonli.net/semisim/
29•dominikh•1h ago•1 comments

Fleurs du Mal

https://fleursdumal.org
61•Frummy•3h ago•20 comments

ALICE detects the conversion of lead into gold at the LHC

https://www.home.cern/news/news/physics/alice-detects-conversion-lead-gold-lhc
487•miiiiiike•11h ago•256 comments

Business books are entertainment, not strategic tools

https://theorthagonist.substack.com/p/why-reading-business-books-is-a-waste
86•ZeroTalent•5h ago•36 comments

What’s new in Swift 6.2

https://www.hackingwithswift.com/articles/277/whats-new-in-swift-6-2
112•ingve•5h ago•90 comments

Fighting Unwanted Notifications with Machine Learning in Chrome

https://blog.chromium.org/2025/05/fighting-unwanted-notifications-with.html
9•feross•1d ago•4 comments

Sofie: open-source web based system for automating live TV news production

https://nrkno.github.io/sofie-core/
274•rjmunro•12h ago•35 comments

Launch HN: Nao Labs (YC X25) – Cursor for Data

118•ClaireGz•9h ago•51 comments

Stratolaunch Successfully Completes Reusable Hypersonic Flight and Recovery

https://www.stratolaunch.com/news/stratolaunch-successfully-completes-reusable-hypersonic-flight-and-recovery-with-talon-a2-vehicle/
4•speckx•2d ago•0 comments

21 GB/s CSV Parsing Using SIMD on AMD 9950X

https://nietras.com/2025/05/09/sep-0-10-0/
246•zigzag312•12h ago•125 comments

Rust’s dependencies are starting to worry me

https://vincents.dev/blog/rust-dependencies-scare-me/?
194•chaosprint•16h ago•239 comments

Some novelists are becoming video game writers – and vice-versa

https://www.theguardian.com/games/2025/apr/30/novelists-video-game-writers
23•ilamont•2d ago•15 comments

Math Machine – A notebook will show your kid how far they have travelled

https://kidswholovemath.substack.com/p/math-machine
47•sebg•3d ago•7 comments

Past, present, and future of Sorbet type syntax

https://blog.jez.io/history-of-sorbet-syntax/
108•PaulHoule•9h ago•71 comments

New Tool: lsds – List All Linux Block Devices and Settings in One Place

https://tanelpoder.com/posts/lsds-list-linux-block-devices-and-their-config/
74•mfiguiere•7h ago•14 comments

Show HN: Hydra (YC W22) – Serverless Analytics on Postgres

https://www.hydra.so/
41•coatue•10h ago•19 comments

Itter.sh – Micro-Blogging via Terminal

https://www.itter.sh/
201•rrr_oh_man•12h ago•62 comments

Show HN: Aberdeen – An elegant approach to reactive UIs

https://aberdeenjs.org/
187•vanviegen•13h ago•101 comments

PlainBudget – Minimalist Plain Text Budgeting

https://plainbudget.com/
14•jgalvez•2h ago•4 comments

Reverse Engineering "DNA Sequences" in the Lost World: Jurassic Park Video Game

https://32bits.substack.com/p/under-the-microscope-the-lost-world
57•bbayles•2d ago•4 comments

Odin, a Pragmatic C Alternative with a Go Flavour

http://bitshifters.cc/2025/05/04/odin.html
72•hmac1282•8h ago•36 comments

Rollstack (YC W23) Is Hiring TypeScript Engineers (Remote US/CA)

https://www.ycombinator.com/companies/rollstack-2/jobs/QPqpb1n-software-engineer-typescript-us-canada
1•yjallouli•9h ago

Show HN: Hyvector – A fast and modern SVG editor

https://www.hyvector.com
247•jansan•15h ago•65 comments

NSF faces shake-up as officials abolish its 37 divisions

https://www.science.org/content/article/exclusive-nsf-faces-radical-shake-officials-abolish-its-37-divisions
476•magicalist•13h ago•611 comments

CryptPad: An Alternative to the Google Suite

https://cryptpad.org/
157•ColinWright•14h ago•61 comments

Show HN: A backend agnostic Ruby framework for building reactive desktop apps

https://codeberg.org/skinnyjames/hokusai
73•zero-st4rs•10h ago•20 comments

Show HN: Oliphaunt – A native Mastodon client for macOS

https://testflight.apple.com/join/Epq1P3Cw
83•anosidium•9h ago•28 comments

All BART trains were stopped due to ‘computer networking problem’

https://www.kqed.org/news/12039472/bart-shuts-down-entire-train-service-due-to-computer-networking-problem
181•ksajadi•11h ago•150 comments
Open in hackernews

Past, present, and future of Sorbet type syntax

https://blog.jez.io/history-of-sorbet-syntax/
108•PaulHoule•9h ago

Comments

dismalaf•9h ago
Interesting article, but to me it really defeats the point of Ruby. The hyper-dynamic "everything is an object" in the Smalltalk sense of the definition is much of what makes Ruby great. I hate this idea that Ruby needs to be more like Python or Typescript; if you like those languages use those languages.

I get that a lack of types is a problem for massive organizations but turning dynamic languages into typed languages is a time sink for solo developers and small organizations for zero performance benefit. If I wanted a typed language to build web apps with I'd use Java or something.

Hopefully Matz sticks to his guns and never allows type annotations at the language and VM level.

kodablah•9h ago
> I hate this idea that Ruby needs to be more like Python or Typescript

It's not be more like those, it's be more like helpful, author-friendly programming which is very much Ruby's ethos.

Every time I think about ripping out all of the RBS sig files in my project because I'm tired of maintaining them (I can't use Sorbet for a few reasons), Steep catches a `nil` error ahead of time. Sure we can all say "why didn't you have test coverage?" but ideally you want all help you can get.

PaulHoule•8h ago
As a Pythoner the most direct value I get out of types is the IDE being smart about autocompletion, so if I'm writing

   with db.session() as session:
      ... use the session ...
I can type session. and the IDE knows what kind of object it is and offers me valid choices. If there's a trouble with it, it's that many Pythonic idioms are too subtle, so I can't fully specify an API like

   collection = db["some_collection"]
   collection.filter(lambda doc: doc["amount"].as_integer() > 500)
   collection.filter({"name": "whatever"})
   collection.filter({"field": lambda f: f["subfield"] = jsonb({"a":1, "b":"2})})
not to mention I'd like to be able to vary what gets returned using the same API as SQLAlchemy so I could write

   collection.filter(..., yield_per=100)
and have the type system know it is returning an iterator that yields iterators that yields rows as opposed to an iterator that yields rows. It is simple, cheap and reusable code to forward a few fetch-control arguments to SQLAlchemy and add some unmarshalling of rows into documents but if I want types to work right I need an API that looks more like Java.
jimbokun•6h ago
> Sure we can all say "why didn't you have test coverage?"

Well types are a form of test performed by the compiler.

jaredsohn•4h ago
LLMs can probably help maintain them so that probably could be solved if you start using LLMs more.

This maybe already exists, but it would be nice if RBS or Sorbet had a command you could run that checks that all methods have types and tries to 'fix' anything missing via help from an LLM. You'd still be able to review the changes before committing it, just like with lint autofixing. Also you'd need to set up an LLM API key and be comfortable sharing your code with it.

jbverschoor•7h ago
It’s all about message passing. Why not allow a compile time check if something respond to a message. Types/interfaces are good. Failing early is a good thing. The earliest you can fail is during editing, and then compile/interpret time.

In Objective-C, you also pass messages to an object, and it could be anything you want. But it would output warnings that an object/class did not respond to a certain message. You could ignore it, but it would always result in a runtime error obviously.

  [someObject missingMethod]
Swift is a much nicer language in terms of typing, and I have started replacing some smaller Ruby scripts with Swift. Mostly out of performance needs though. (Single file swift scripts)

The lack of proper typechecking is one of the main reasons I would not use Ruby, especially in larger teams.

Unittests are fun and all, but they serve a different purpose.

dismalaf•5h ago
> The lack of proper typechecking is one of the main reasons I would not use Ruby, especially in larger teams.

Cool. I'm using Ruby for a startup because it's 10x more productive for building a webapp versus a compiled language and because I'm solo.

And when I want typing I use something like C++ because I don't want to lose productivity without a major performance boost.

corytheboyd•1h ago
> I'm using Ruby for a startup because it's 10x more productive for building a webapp versus a compiled language

I’ve been a Ruby/Rails dev for about 14 years. Just started working on Java projects at work and… holy shit, it slows down the entire organization and they don’t even seem to know how much of it is because of the terrible immovable object that is the mountain of Java code they made. Before this experience I had always assumed that rigid types alone would be a boon… oh how wrong I was. The rigidity just leads to people writing 10x more garbage to get simple things done, which causes a 10x worse maintainability problem. The rate at which I hear “oh lol just another NPE” is astounding, how is this constant occurrence not interpreted as a complete failure of the “type” system????

Maybe a crack team of Java Experts wouldn’t do this, but the reality of most software companies is that people of ALL skill levels are writing code. Poorly written Ruby is a whole lot easier to figure out (as an expert of Ruby) than 10x the amount of code in Java. I hate this.

Lio•4h ago
I respect this view but I can really see the utility of gradual typing as your project grows and matures.

I also wonder if we’ll eventually be able to pass type information to the JIT. If that helps ruby grow I’m all for it.

dismalaf•4h ago
> I also wonder if we’ll eventually be able to pass type information to the JIT.

It's not like Ruby doesn't have types and the JIT can't determine them. It just happens at runtime, literally the defining feature of dynamic languages.

Lio•4h ago
That’s true but it would be useful to upfront specify exactly what’s in an array and exactly how big it will be for the entire life of the array.
__float•2h ago
> Hopefully Matz sticks to his guns and never allows type annotations at the language and VM level.

Why? Just because they _exist_ doesn't mean you'd need to use them.

usernamed7•8h ago
I've been a ruby dev for 15+ years; i'd really love it if ruby adopted a C# similar approach to typing (albeit, more ruby-like and more flexible). It's the most readable, simplest way I would enjoy as a rubyist. Everything else (including sorbet) feels bolted on, cumbersome and cringe. I appreciate the article and how it goes over the constraints; but genuinely sorbet is just not good enough from a DSL standpoint.

Type's can be fun and useful, and i'd love to see them incorporated into ruby in a tasteful way. i don't want it to become a new thing developers are forced to do, but there is a lot of utility from making them more available.

dismalaf•8h ago
C#, ew. Crystal (Ruby but statically typed) has nicer type syntax. Or Pony. Or Nim, Odin, and others.
usernamed7•8h ago
Hrm, i think this is a good point, It might be something better served by a ruby-like alternative. I'll have to tinker with crystal sometime. Thanks for this comment!
emn13•8h ago
While I'm most familiar with C#, and haven't used Ruby professionally for almost a decade now, I think we'd be better off looking at typescript, for at least 3 reasons, probably more.

1. Flowsensitivity: It's a sure thing that in a dynamic language people use coding conventions that fit naturally to the runtime-checked nature of those types. That makes flow-sensitive typing really important.

2. Duck typing: dynamic languages and certainly ruby codebases I knew often use ducktyping. That works really well in something like typescript, including really simple features such as type-intersections and unions, but those features aren't present in C#.

3. Proof by survival: typescript is empirically a huge success. They're doing something right when it comes to retrospectively bolting on static types in a dynamic language. Almost certainly there are more things than I can think of off the top of my head.

Even though I prefer C# to typescript or ruby _personally_ for most tasks, I don't think it's perfect, nor is it likely a good crib-sheet for historically dynamic languages looking to add a bit of static typing - at least, IMHO.

Bit of a tangent, but there was a talk by anders hejlsberg as to why they're porting the TS compiler to Go (and implicitly not C#) - https://www.youtube.com/watch?v=10qowKUW82U - I think it's worth recognizing the kind of stuff that goes into these choices that's inevitably not obvious at first glance. It's not about the "best" lanugage in a vacuum, it's a about the best tool for _your_ job and _your_ team.

Kinrany•8h ago
Tangent, has C# recovered from nulls being included in all reference types by default?
neonsunset•8h ago
Yes. It will complain if you assign one to something that isn't T?.

For the best experience you may want to add `<WarningsAsErrors>nullable</WarningsAsErrors>` to .csproj file.

emn13•7h ago
"Recovered" sounds so binary.

I think it's pretty usuable now, but there is scarring. The solution would have been much nicer had it been around from day one; especially surrounding generics and constraints.

It's not _entirely_ sound, nor can it warn about most mistakes when those are in the "here-be-dragons" annotations in generic code.

The flow sensitive bit is quite nice, but not as powerful as in e.g. typescript, and sometimes the differences hurt.

It's got weird gotcha interactions with value-types, for instance but likely not limited to interaction with generics that aren't constrained to struct but _do_ allow nullable usage for ref types.

Support in reflection is present, but it's not a "real" type, and so everything works differently, and hence you'll see that code leveraging reflection that needs to deal with this kind of stuff tends to have special considerations for ref type vs. value-type nullabilty, and it often leaks out into API consumers too - not sure if that's just a practical limitation or a fundamental one, but it's very common anyhow.

There wasn't last I looked code that allowed runtime checking for incorrect nulls in non-nullable marked fields, which is particularly annoying if there's even an iota of not-yet annoted or incorrectly annotated code, including e.g. stuff like deserialization.

Related features like TS Partial<> are missing, and that means that expressing concepts like POCOs that are in the process of being initialized but aren't yet is a real pain; most code that does that in the wild is not typesafe.

Still, if you engage constructively and are willing to massage your patterns and habbits you can surely get like 99% type-checkable code, and that's still a really good help.

neonsunset•7h ago
> Related features like TS Partial<> are missing, and that means that expressing concepts like POCOs that are in the process of being initialized but aren't yet is a real pain; most code that does that in the wild is not typesafe.

If it's an object, it's as simple as having a static method on a type, like FromA(A value) and then have that static method call the constructor internally after it has assembled the needed state. That's how you'd do it in Rust anyway. There will be a warning (or an error if you elevate those) if a constructor exits not having initialized all fields or properties. Without constructor, you can mark properties as 'required' to prohibit object construction without assignment to them with object initializer syntax too.

emn13•4h ago
Yeah, before required properties/fields, C#'s nullability story was quite weak, it's a pretty critical part of making the annotations cover enough of a codebase to really matter. (technically constructors could have done what required does, but that implies _tons_ of duplication and boilerplate if you have a non-trivial amount of such classes, records, structs and properties/fields within them; not really viable).

Typescript's partial can however do more than that - required means you can practically express a type that cannot be instantiated partially (without absurd amounts of boilerplate anyhow), but if you do, you can't _also_ express that same type but partially initialized. There are lots of really boring everyday cases where partial initialization is very practical. Any code that collects various bits of required input but has the ability to set aside and express the intermediate state of that collection of data while it's being collected or in the event that you fail to complete wants something like partial.

E.g. if you're using the most common C# web platform, asp.net core, to map inputs into a typed object, you now are forced to either expression semantically required but not type-system required via some other path. Or, if you use C# required, you must choose between unsafe code that nevertheless allows access to objects that never had those properties initialized, or safe code but then you can't access any of the rest of the input either, which is annoying for error handling.

typescript's type system could on the other hand express the notion that all or even just some of those properties are missing; it's even pretty easy to express the notion of a mapped type wherein all of the _values_ are replaces by strings - or, say, by a result type. And flow-sensitive type analysis means that sometimes you don't even need any kind of extra type checks to "convert" from such a partial type into the fully initialized flavor; that's implicitly deduced simply because once all properties are statically known to be non-null, well, at that point in the code the object _is_ of the fully initialized type.

So yeah, C#'s nullability story is pretty decent really, but that doesn't mean it's perfect either. I think it's important to mention stuff like Partial because sometimes features like this are looked at without considering the context. Most of these features sound neat in isolation, but are also quite useless in isolation. The real value is in how it allows you to express and change programs whilst simultaneously avoiding programmer error. Having a bit of unsafe code here and there isn't the end of the world, nor is a bit of boilerplate. But if your language requires tons of it all over the place, well, then you're more likely to make stupid mistakes and less likely to have the compiler catch them. So how we deal with the intentional inflexibility of non-nullable reference types matters, at least, IMHO.

Also, this isn't intended to imply that typescript is "better". That has even more common holes that are also unfixable given where it came from and the essential nature of so much interop with type-unsafe JS, and a bunch of other challenges. But in order to mitigate those challenges TS implemented various features, and then we're able to talk about what those feature bring to the table and conversely how their absence affects other languages. Nor is "MOAR FEATURE" a free lunch; I'm sure anybody that's played with almost any language with heavy generics has experienced how complicated it can get. IIRC didn't somebody implement DOOM in the TS type system? I mean, when your error messages are literally demonic, understanding the code may take a while ;-).

uticus•4h ago
nope, still recovering: https://github.com/dotnet/core/blob/main/release-notes/10.0/...
neonsunset•3h ago
This has nothing to do with null analysis. It simply lets you replace an assignment behind an if with an inline expression.
usernamed7•8h ago
wow i certainly appreciate your perspective and insight as a regular C# developer! My experience was limited to building a unity project for 6 years and learning the differences from Ruby.

Another commenter suggested another language like crystal, and that might actually be what it really needs, a ruby-like alternative.

emn13•7h ago
I love building libraries, so having the chance to talk about the gotchas with things like this is a fun chance to reflect on what is and is not possible with the tools we have. I guess my favorite "feature" in C# is how willing they are to improve; and that many of the improvements really matter, especially when accumulated over the years. A C# 13 codebase can be so much nicer than a c# 3 codebase... and faster and more portable too. But nothing's perfect!
nightpool•8h ago
What parts of a C# approach do you think Ruby should adopt? The syntax? I don't think anyone thinks of C# as having a particularly good or noteworthy type syntax or features—anything you can find in C# you can probably find in most other typed languages. I'm curious what specifically you think C#'s typing system is better at than e.g. Typescript, Python or Rust
uticus•4h ago
> i'd really love it if ruby adopted a C# similar approach to typing

interesting that you've called out C# as the specific example of a way to approach typing. c# did nothing new with their typing system, instead copied from java and others https://en.wikipedia.org/wiki/Comparison_of_C_Sharp_and_Java...

throwaway346434•6h ago
> There was also a project called TypedRuby, largely a passion project of an engineer working at GitHub. After a few weeks of evaluation, it seemed that there were enough bugs in the project that fixing them would involve a near complete rewrite of the project anyways.

There's 6 open bugs and 4 closed ones. This seems like either it's throwing shade or they didn't bother lodging bug reports upstream.

Groxx•6h ago
Last commit: 2018

Readme:

>Note: TypedRuby is not currently under active development.

I think "brief check, move on" is reasonable, particularly if it doesn't appear to already be at several-year-stable quality.

jez•6h ago
We were in direct contact with the author, most bugs were reported over email. The project was a hobby project and we did not feel it to be prudent to flood someone’s hobby project with dozens of issues created by a team working at a venture funded startup.
Trasmatta•6h ago
When it comes to "Ruby-like and statically typed", Crystal is such an amazing language. I think the design is incredible, but every time I try to use it, I just hit so many issues and things that slow me down. I think it's such a cool language, but every time I try to use it I just end up switching back to Ruby.
durkie•6h ago
Same! I reach for crystal when I need something that is going to perform faster than ruby, but man I get my hand slapped constantly when writing it.
smuffinator•5h ago
I love Crystal. It's what I wish Ruby was. If only the tooling was a bit better
eterps•5h ago
Crystal could have been big if it worked really well in combination with Ruby out of the box (f.i. as an extension language).
Lio•5h ago
Shout out to the crystalruby[1] project. I’ve not used crystal much myself but I love how easy it is to switch between the two.

1. https://github.com/wouterken/crystalruby

breckinloggins•6h ago
> My counter is that when it comes to language design, semantics—what the types mean—are easily 10 times more important than syntax

Sometimes I long for the days before type theory took over programming language research.

mvdtnz•6h ago
You don't need fancy boy theories to see value in types.
dismalaf•5h ago
The value in types is telling the compiler to make certain assumptions so it can optimize the output.

There's not a ton of value to be had in something like Typescript or Python types.

dragonwriter•4h ago
> The value in types is telling the compiler to make certain assumptions so it can optimize the output.

Correctness is more important (in general and as a benefit of type checking) than optimization. Doing the wrong thing fast is easy, but not valuable.

williamdclt•4h ago
Yet TS is massively popular. So maybe that’s not the only value?
dismalaf•4h ago
Popular != Good.

Also what's good for enterprise isn't good for everyone.

I get that orgs probably like TS so that newbie devs don't do crazy things in the code, and for more editor hand-holding. But it's not valuable for everyone, if it was actually better than everyone would be using it, not just some people.

horsawlarway•1h ago
I think this is a beginner take.

If you only work in small teams, or small projects, I could see this opinion getting formed and maybe agree.

But having worked on large projects... Types are fucking great. So much value exists in simply having a tool that highlights everywhere in the codebase my change impacts.

It makes refactoring at scale possible and expedient in a way that is simply better. Period.

I can be fearless changing things, because I don't have to wonder about all the places my change might have broken - it literally gives me the exact set of files and lines I need to go fix. I don't even have to rely on tests.

It's... Better. It's better even for my personal projects, and it's unimaginably better for my 300 engineer org.

breckinloggins•25m ago
I… didn’t say I saw no value in types?

I meant that there was a culture shift around program language research that had given advances in syntax a permanent back seat.

uticus•6h ago
it's amazing to me that the industry hasn't found a better way to support bits of code interacting with other bits of code properly, than adding an attribute to a bit of code calling it a "type"

...saying this as someone who benefits from it but also rarely uses sub-typing ("poodle" type sub to "dog" type sub to "animal" type) or any sort of the other benefits that are commonly associated with typing. for me the benefit is code checking and code navigation of unfamiliar code bases

xboxnolifes•5h ago
structural typing? duck typing?
uticus•4h ago
structural typing is a good step - but afaik there's no way to distinguish between different types that have the same structure but different context - a "truth.right" will be different from a "direction.right", but it's up to the dev to keep that straight.

duck typing is what ruby does without sorbet or rbs, it portrays nothing about how the code bits interact at the boundary. if a "dog" is passed in but a "cat" is expected, things will work just fine until runtime when the cat is asked to bark. (saying as someone who is a big fan of ruby overall)

zhisme•4h ago
With great power comes great responsibility.

It is developer responsibility to ensure that you will not receive cat during designing stage of your classes. And inheritance is bad, this is also sharp knife. But annotating everywhere

      sig { params(cat: Cat) }
does not improve your design, it just makes noisy and clumsy. I would think that if your code need type annotations, it smells like bad design and should be considered for refactoring.
gitroom•5h ago
man i always bounce between loving ruby's speed to build and wishing for just a bit more built-in safety tbh. you ever feel like adding more types actually slows you down or does it make big teams way less stressed?
bradly•5h ago
I've been a Ruby dev since 2006 and started using Sorbet fulltime at work about a year ago. After about six months I started wanting it in my personal projects. Not enough to add the dependency, but if Ruby had it built-in I would probably use it. For myself, it makes it easier to work on code I'm not familiar with either because I didn't write it or I wrote it longer than X days ago.

The Sorbet syntax is pretty bad, though. And things go from bad to worse as soon as you get a bit tricky with composition or want to do something like verify the type of an association.

I haven't tried inline RBS comments yet, but the DSL does look more pleasing.

The team in general had mixed views. Some hated it, some liked it, most developers just don't really care–although now the Sorbet advocates are claiming it helps the AI, so now there is that leaning on the Sorbet lever as well.

status_quo69•5h ago
One thing that I've wondered is why sorbet didn't choose to use the stabby lambda syntax to denote function signatures?

  sig ->(_: MyData) { }
  def self.example(my_data)
    ...
  end
Obviously this opens up a potential can of worms of a dynamic static type system, but it looks sufficiently close enough to just ruby. My opinion is that sorbet doesn't lean into the weirdness of ruby enough, so while it has the potential to be an amazingly productive tool, this is the same community that (mostly) embraces multiple ways of doing things for aesthetic purposes. For example you could get the default values of the lambda above to determine the types of the args by calling the lambda with dummy values and capturing via binding.

Personally having written ruby/rails/c#/etc and having been on a dev productivity team myself, I say: lean into the weird shit and make a dsl for this since that's what it wants to be anyways. People will always complain, especially with ruby/rails.

jez•26m ago
I don’t know if there’s a Ruby reflection API to produce the values of default keyword arguments in a lambda, but correct me if that’s not the case. This syntax is neat enough to be worth spending some time thinking about if you can correct me.