frontpage.
newsnewestaskshowjobs

Made with ♥ by @iamnishanth

Open Source @Github

fp.

StageConnect: Behringer protocol is open source

https://github.com/OpenMixerProject/StageConnect
76•jdboyd•3h ago•20 comments

Andrej Karpathy – It will take a decade to work through the issues with agents

https://www.dwarkesh.com/p/andrej-karpathy
745•ctoth•15h ago•702 comments

New Work by Gary Larson

https://www.thefarside.com/new-stuff
238•jkestner•11h ago•53 comments

AMD's Chiplet APU: An Overview of Strix Halo

https://chipsandcheese.com/p/amds-chiplet-apu-an-overview-of-strix
43•zdw•4h ago•8 comments

The Unix Executable as a Smalltalk Method [pdf]

https://programmingmadecomplicated.wordpress.com/wp-content/uploads/2025/10/onward25-jakubovic.pdf
75•pcfwik•7h ago•6 comments

The pivot

https://www.antipope.org/charlie/blog-static/2025/10/the-pivot-1.html
300•AndrewDucker•13h ago•132 comments

Live Stream from the Namib Desert

https://bookofjoe2.blogspot.com/2025/10/live-stream-from-namib-desert.html
477•surprisetalk•20h ago•88 comments

Exploring PostgreSQL 18's new UUIDv7 support

https://aiven.io/blog/exploring-postgresql-18-new-uuidv7-support
220•s4i•2d ago•161 comments

PlayStation 3 Architecture (2021)

https://www.copetti.org/writings/consoles/playstation-3
142•adamwk•4d ago•31 comments

Claude Skills are awesome, maybe a bigger deal than MCP

https://simonwillison.net/2025/Oct/16/claude-skills/
542•weinzierl•15h ago•278 comments

WebMCP

https://github.com/jasonjmcghee/WebMCP
80•sanj•11h ago•19 comments

Show HN: ServiceRadar – open-source Network Observability Platform

https://github.com/carverauto/serviceradar
31•carverauto•7h ago•1 comments

Tahoe's Elephant

https://eclecticlight.co/2025/10/12/last-week-on-my-mac-tahoes-elephant/
51•GavinAnderegg•6d ago•25 comments

If the Gumshoe Fits: The Thomas Pynchon Experience

https://www.bookforum.com/print/3202/if-the-gumshoe-fits-62416
30•prismatic•1w ago•0 comments

EVs are depreciating faster than gas-powered cars

https://restofworld.org/2025/ev-depreciation-blusmart-collapse/
338•belter•22h ago•766 comments

What's the Deal with GitHub Spec Kit

https://den.dev/blog/github-spec-kit/
10•mohi-kalantari•4d ago•1 comments

4Chan Lawyer publishes Ofcom correspondence

https://alecmuffett.com/article/117792
382•alecmuffett•1d ago•522 comments

The Rapper 50 Cent, Adjusted for Inflation

https://50centadjustedforinflation.com/
619•gaws•16h ago•160 comments

Asking AI to build scrapers should be easy right?

https://www.skyvern.com/blog/asking-ai-to-build-scrapers-should-be-easy-right/
104•suchintan•13h ago•46 comments

Ruby Blocks

https://tech.stonecharioteer.com/posts/2025/ruby-blocks/
8•stonecharioteer•3d ago•1 comments

The Wi-Fi Revolution (2003)

https://www.wired.com/2003/05/wifirevolution/
79•Cieplak•6d ago•58 comments

Cyberpsychology's Influence on Modern Computing

https://cacm.acm.org/research/cyberpsychologys-influence-on-modern-computing/
13•pseudolus•5d ago•1 comments

Claude Code vs. Codex: I built a sentiment dashboard from Reddit comments

https://www.aiengineering.report/p/claude-code-vs-codex-sentiment-analysis-reddit
97•waprin•1d ago•43 comments

When if is just a function

https://ryelang.org/blog/posts/if-as-function-blogpost-working-on-it_ver1/
44•soheilpro•3d ago•50 comments

Amazon’s Ring to partner with Flock

https://techcrunch.com/2025/10/16/amazons-ring-to-partner-with-flock-a-network-of-ai-cameras-used...
512•gman83•23h ago•443 comments

Intercellular communication in the brain through a dendritic nanotubular network

https://www.science.org/doi/10.1126/science.adr7403
276•marshfram•17h ago•217 comments

MIT physicists improve the precision of atomic clocks

https://news.mit.edu/2025/mit-physicists-improve-atomic-clocks-precision-1008
83•pykello•6d ago•37 comments

How I bypassed Amazon's Kindle web DRM

https://blog.pixelmelt.dev/kindle-web-drm/
1598•pixelmelt•1d ago•487 comments

Researchers Discover the Optimal Way to Optimize

https://www.quantamagazine.org/researchers-discover-the-optimal-way-to-optimize-20251013/
43•jnord•4d ago•10 comments

Smithsonian Open Access

https://www.si.edu/openaccess
65•bookofjoe•3d ago•9 comments
Open in hackernews

When if is just a function

https://ryelang.org/blog/posts/if-as-function-blogpost-working-on-it_ver1/
44•soheilpro•3d ago

Comments

blahgeek•9h ago
Seems lispy
taeric•9h ago
Without the discussion of applicative-order versus normal-order.
middayc•8h ago
BTW: In Lisps, if is still a special form / macro, because in Lisp lists are evaluated by default, in Rebols if can be a function because blocks (lists) aren't evaluated by default.
kazinator•7h ago
You can rarely successfully generalize about languages in the Lisp family. :)

TXR Lisp: (relevant to this article) there is an iff function that takes functional arguments.

Square the odd values in 0 to 9:

  1> (mapcar [iff oddp square use] 0..10)
  (0 1 2 9 4 25 6 49 8 81)
The use function is a synonym of identity: i.e. just use the incoming value as-is

Square the even ones instead by inverting oddp with notf:

  2> (mapcar [iff [notf oddp] square use] 0..10)
  (0 1 4 3 16 5 36 7 64 9)
Get rid of use with iffi: a two-argument iff with an implicit identity else:

  3> (mapcar [iffi oddp square] 0..10)
  (0 1 2 9 4 25 6 49 8 81)
Now about the point about Lisps and if: the regular if operator with value and expression arguments has a companion if function:

  4> (special-operator-p 'if)
  t
  5> (fboundp 'if)
  t
Unlike in some other dialects like Common Lisp, a symbol can have a binding in the macro or operator space, and in the function space at the same time.

But this if is not useful control. It's useful for things like being able to map over a function-like facsimile of the if operator. E.g. take an element of the (a b c d) or (x y z w) list depending on whether the leftmost list has a nil or t:

  6> [mapcar if '(nil t nil t) '(a b c d) '(x y z w)]
  (x b z d)
In the reverse direction, being able to write a macro for a function function exists, allows for ordinary macros to be "compiler macros" in the Common Lisp sense: provide optimizations for certain invocations of a function.

This dialect is not even "weird"; overall it is Common-Lisp-like. Right down to the multiple namespaces, which is why the [...] syntax exists for referring to functions and variables in a combined virtual namespace.

veqq•2h ago
What's the benefit of being implemented as lisp-2 but acting like lisp-1 with [ ]? Why not just be a lisp-1?

> TXR is an original notation for matching entire text documents or streams, inspired by the unification that underlies logic programming systems

This has me hooked.

bloaf•8h ago
I checked the Rye homepage, and it has "dialects" which allow more familiar math infix notation. In that sense it is very tcl-y, tcl technically being a lisp.

Looking at their rather confusing looping mechanisms, they probably could benefit from being a little more tcl-y, since tcl has some of the best looping semantics I've worked with.

middayc•8h ago
Any concrete feedback on looping mechanisms being confusing is appreciated.
bloaf•7h ago
Certainly:

I can tell the rye devs like the idea of everything being a function. But in their very first "language basics" section, they introduce assignment not as a function call, but as some kind of magic that happens when you have colons in a name.

So when we get to the "looping" section, it is the first time we have seen a colon-having-name outside the context of assignment:

> loop 3 { ::i , prns i }

And it is explained that the above line of code is "injecting" values for the code block to "pick up".

But right away this begs a number of questions:

* Why the double-colon? I would assume each loop-body-evaluation happens in its own scope, and that we're not creating global variables, so a single colon (:i) should be sufficient, right?

* What are we doing, conceptually? Is the ::i meant to be "a function which when given a value modifies its enclosing scope to include the symbol i" or "an unassigned symbol which the loop function will use to do something akin to term-rewriting with?"

* Do we really need a symbol at all, or could we just have a the point-free loop "loop 3 {prns}"?

* If we can't have the point free thing, is it because somehow the injected value would end up "to the left" of prns, if so, why would we want that?

* If we're doing something more like term rewriting, why isn't the symbol given as a separate argument from the body?

middayc•7h ago
Rye is foremost a REBOL and REBOL has this notion of many types of words at it's core:

`word` - regular word, can evaluate to value it's bound to or call a funtion if bound to a function

`word: "value"` - set-word, assignment that you noticed

`probe :word` - get-word, always returns bound value, doesn't call a function if it's bound to a function, in Rye this is `?word`, because `:word` is left-set-word.

`'word` - literal word, evaluates to a word itself

etc ...

Rye adds even more word types. Rye also has left to right flow so it adds left-set-word. In Rye all assigned words with set-words are constants and they are used by default. So we also need a "mod-word", that is the double colon that you noticed, and left-mod-word. Because of left-to-right flow Rye also has .op-words and |pipe-words.

The logic around words, op-words and pipe-words ... I tried to explain here:

https://ryelang.org/meet_rye/specifics/opwords/

Another pattern you noticed (good observation btw:) is the idea of injected blocks that isn't used just for loops, but also for conditionals, function bodies, HOF-like functions etc ...

https://ryelang.org/meet_rye/specifics/injected_blocks/

All in all it is supposed to be a compact set of ideas that fit together. Some are somewhat unusual.

bloaf•7h ago
> Rye also has left to right flow so it adds left-set-word. In Rye all assigned words with set-words are constants and they are used by default. So we also need a "mod-word", that is the double colon that you noticed, and left-mod-word

So I would assume that the :i is actually constant within the loop body scope. That is, the loop function is doing something like this:

; i is not assigned in this scope

evaluate {1 :i, prns i}

evaluate {2 :i, prns i}

evaluate {3 :i, prns i}

; i is still not assigned in this scope

But it sounds like you're telling me that :i would actually escape the scope of the loop body and so it needs to be modifiable or else the loop will break.

middayc•6h ago
Yes, Rye follows REBOL in this case. Plain block invocation doesn't create it's own scope / context. That holds for do, if, either, loop, for, map, etc.

It would be costly to have this on by default. If you want separation there are many ways to achieve it. Rye has many functions related to contexts / scopes. For creating contexts in multiple ways and evaluating code inside contexts or with context as parent or isolated context, etc.

And a lot of builtins directly accept anonymous functions in place of blocks of code.

For example for loop also accepts function if you want separation and don't mind the cost.

    for { 1 2 3 } fn { x } { print x }
    ; which can also be written with fn1
    for { 1 2 3 } fn1 { .print }
    ; or latest experiment where we have syntax for 3 injected blocks 
    ; .() - same as "with"
    ; .[] - same as "reduce/with"
    ; .{} - same as "fn1"
    ; where it's already decided department from REBOL: 
    ; () is "do"
    ; [] is "vals"
    ; {} is literal block 
    for { 1 2 3 } .{ .print }
kazinator•7h ago
If you treat assignment as a function, then you have to reify environments as run-time objects, whereby you basically lose lexical scope.

Lisp originally, as in LISP, had assignment as a function: it was called SET.

To use it, you usually had to quote: (SET 'VAR 42).

It worked without an environment parameter because variables were in a pervasive environment, but the quote was needed to get the variable symbol as a run-time value. (SET VAR 42) would mean evaluate VAR to a symbol, and then pass that symbol to the SET function along with 42, so whatever variable was in VAR would be assigned.

Assignment is inherently non-functional, since it is a side-effect, so it is mostly counterproductive to model it as a function.

A pattern matching or logical language can have implicit bindings as the results of an operation, and so produce variables that way. Then instead of assignment you have shadowing, in that some construct binds a variable again that was already used, so that the most recent value then emerges, shadowing the previous one.

bloaf•6h ago
So tcl handles it somewhat more elegantly, I think. It also has a set function, but does not require any special quoting because it uses the $ prefix to denote "get the value of this symbol":

    set a 5
    puts $a  #prints 5
and of course because it is modeled as a function (albeit an impure one) you can pass arguments to it as normal:

    set a b
    set $a 5  #equivalent to set b 5
    puts $b   #prints 5
of course, everything in tcl is a string, so this works too lol

    set a 5
    set $a b
    puts $5  #prints b
middayc•30m ago
I’ve personally always thought that REBOL’s use of set-words and similar constructs was a strength. It makes sense conceptually, is visually distinguishable, and maintains a strong sense of internal consistency.

REBOL (and by extension, Rye) was never designed around the idea that everything must be a function. It just turns out that this approach fits naturally within the core principles and rules of the language.

All “active” words happen to be functions, because nothing else is needed. The behavior of different word types (and, more broadly, value types) is determined by the evaluator. In that sense, you could say that Rye does have syntax, expressed through its distinct word types.

veqq•9h ago
Combinatory programing offers functional control flow. (Here is a straight forward explanation: https://blog.zdsmith.com/series/combinatory-programming.html ) I was inspired to write `better-cond` in Janet:

    (defn better-cond
    [& pairs]
    (fn [& arg]
        (label result
            (defn argy [f] (if (> (length arg) 0) (f ;arg) (f arg))) # naming is hard
            (each [pred body] (partition 2 pairs)
                (when (argy pred)
                (return result (if (function? body)
                                    (argy body) # calls body on args
                                    body)))))))
    Most Lisps have `cond` like this:

    (def x 5)
    (cond
    ((odd? x) "odd") ; note wrapping around each test-result pair
    ((even? x) "even"))

    Clojure (and children Fennel and Janet) don't require wrapping the pairs:

    (def x 5)
    (cond
    (odd? x) "odd"
    (even? x) "even")

    My combinatoresque `better-cond` doesn't require a variable at all and is simply a function call which you can `map` over etc.:

    ((better-cond
    (fn [x] (> 3 x)) "not a number" # just showing that it can accept other structures
    odd?   "odd"
    even?  "even") 5)

    Of course, it can work over multiple variables too and have cool function output:

    (defn recombine # 3 train in APL or ϕ combinator
    [f g h]
    (fn (& x) (f (g ;x) (h ;x))))

    (((better-cond
    |(function? (constant ;$&))
    |($ array + -)) recombine) 1 2) # |( ) is Janet's short function syntax with $ as vars
roxolotl•6h ago
Do you have any recommendations for a language where you _have to_ use these concepts. I love playing with them but I find that unless i’m paying a lot of attention in most cases I fall back to a less functional style even in a language like Janet. I’d love to find a language where you largely have to use these combinatorial logic style functions so I can’t just default back to other styles.
veqq•3h ago
J and BQN (APL has off-ramps...)

https://code.jsoftware.com/wiki/Essays/Tacit_Expressions

https://mlochbaum.github.io/BQN/doc/tacit.html and https://mlochbaum.github.io/BQN/doc/control.html

Forth, Factor and Uiua (which combines the above approach) don't use these concepts yet are also inherently point-free, and without lambdas so you definitely wouldn't be able to rely on functional techniques!

icepat•8h ago
Is this just a quirk in my display, or are all the code blocks in this formatted like a CIA black highlighter
middayc•8h ago
I checked in Firefox and Chrome (on Linux) and code samples look OK to me. What browser/OS are you using. Maybe send me a screenshot at janko dot itm at gmail.
blauditore•8h ago
Same here. I guess it's an issue with (system) dark theme (you can simulate that in dev tools. Android here, so must be Chrome.
middayc•7h ago
I fixed it thanks! I was able to activate dark more in Firefox on desktop and find problems with CSS.
singlow•8h ago
It's only a problem if I have my browser set to use dark theme or system theme and my system theme is dark if I switch it to light theme. Everything looks good. So most likely he's using some kind of CSS framework that's automatically responding to the dark theme, but other styles that he's hand coded are not compatible with it
middayc•8h ago
Thank you all for heads up! I was playing with CSS and didn't test the dark mode. I think it's fixed now.
jrochkind1•8h ago
Smalltalk, anyone? I guess the OO version.
sebastianconcpt•8h ago
Yeah, here. They should know the feeling of booleans as instances and ifTrue: ifFalse: as methods. But for us is such an obvious thing that isn't really something too remarkable. It normalized language awesomeness.
middayc•8h ago
There is a language https://sprylang.se/index.html which started more as Rebol and moved towards Smalltalk.
ivanjermakov•8h ago
The drawback is that this approach elevates code blocks to first class. It means that there is a semantical difference between a value that is a block and a value that is a result of a block. This reduces code clarity, because now block def/result is discriminated by context instead of syntax.

- closures get tricky, i.e. having outer scoped variables within a block

- inter-block operators still need special care, e.g. return should return from a function or a nearest block, same for break/continue/etc.

hatthew•8h ago
This is interesting, but I'm not convinced it's better than the python it's being compared to. Memorizing and understanding the behavior of functions that perform control flow seems no easier than memorizing and understanding hardcoded syntax/keywords. The additional flexibility of making everything a first-class citizen allows people to write code that is too clever for its own good. I could be wrong but I think there is a broad consensus that reflection is a Bad Idea.

Open to being convinced otherwise

(tangent but related, aren't the "Loops" and "Iteration" examples given for python literally the exact same syntax, with the exception of changing how the iterable is generated?)

Nevermark•7h ago
> I could be wrong but I think there is a broad consensus that reflection is a Bad Idea.

Reflection may be bad in practice for other reasons/conditions, but the lack of simple/minimal/regular primitive conventions in many languages, makes reflection a basket of baddies.

The code blocks of Rye seem comparable to closures, which is a sensible thing to have. Once all code blocks are closures, there are fewer concepts to wrangle, and functional control makes excellent sense.

hatthew•5h ago
That makes sense, thanks!
hshdhdhehd•1h ago
I agree. In any somewhat functional language (I.e. all the mainstream ones) you can wrap "if" in a function if you please.

E.g.

    function funif (b, f) {
       return (b && f())
    }

If you want to do clever stuff. I never feel the need as I would rather abstract over bigger things.
middayc•37m ago
You can do it, but that is not how the (default) control structures work in those languages. There is usually also some syntax cost.
middayc•1m ago
It depends on what you want. If you want the most stabile and predictable way to specify the behavior, then static control structures have little downsides.

If you want to explore with how you can specify behaviors or rules and create new options or the ones tightly fitting your problem domain or mental model, then this gives you more tools to do so.

davidw•8h ago
Seems a bit like Tcl, which lets you create your own control structures like that.
middayc•7h ago
I don't know a lot about Tcl, but one thing I know is said for it "everything is a string". In REBOL's it's somewaht reverse as all this live code are REBOL (Rye) values and REBOL (and Rye) have an unusual number of datatypes, REBOL 30+ (many literal types), which it uses as additional information for functions to work with, and is usefull at creating dialects

For example file-path, url and email address are distinct types in REBOL where in mosta languages are just strings.

pwg•6h ago
Or redefine the language provided 'if' statement, in the case that one wanted to do so.
middayc•6h ago
You can't really redefine if because everything is a constant, but you can define if in your own context yes.
spankalee•8h ago
I wish they showed the `else` syntax, because the traditional ALGOL-style if-then-else statement doesn't look native when shoved into most function call notations, unless you have something pretty interesting around named parameters and expressions delimiters.
middayc•8h ago
there is no if { } else { } in REBOL or Rye and it wouldn't really fit. There is either function that accepts two code blocks. It can act as a typical if / else or as a ternary expression as it also returns the result of a block:

    print either pwd = "correct" { "Hello" } { "Locked" }
This is Rebol's doc on either, Rye's works exactly the same: https://www.rebol.com/docs/words/weither.html
iamevn•8h ago
See the `either` function further down

  either some-condition { print "was true" } { print "was false" }
analog31•6h ago
Interestingly, Excel provides "if" as a function:

=if(condition, value-if-true, value-if-false)

middayc•6h ago
Yes, Io language is closest to that syntax probably:

https://iolanguage.org/guide/guide.html#Introduction

analog31•6h ago
I wonder if it's more readable to non-programmers than control flow.
lisbbb•6h ago
This discussion makes me so happy because people still care about programming languages and not just on stupid Java or whatever is making gobs of money. LISP should have a much larger following than it does, though I fully admit it has its own warts.
solomonb•5h ago
Given an algebraic data type such as:

    data List a = Nil | Cons a (List a)
You can define its recursion principle by building a higher-order function that receives an element of your type and, for each constructor, receives a function that takes all the parameters of that constructor (with any recursive parameters replaced by `r`) and returns `r`.

For `List` this becomes:

   foldr :: (() -> r) -> (a -> r -> r) -> List a -> r
The eliminator for `Nil` can be simplified to `r` as `() -> r` is isomorphic to `r`:

   foldr :: r -> (a -> r -> r) -> List a -> r
   foldr z f Nil = z
   foldr z f (List a xs) = f a (foldr f z xs)
For `Bool`:

    data Bool = True | False
We get:

    bool :: a -> a -> Bool -> a
    bool p q True = q
    bool p q False = p
Which is precisely an If statement as a function!

:D

mappum•5h ago
I own the 'if' package on npm, which I wrote to be functions that can replace the if keyword, making no use of the if keyword in its definition.
middayc•30m ago
interesting. Give us an example of it's usage ... or how you implemented it?
ozy•3h ago
Useless unless the logical operators receive their rhs unevaluated. And that is generalized as a language feature.
sparkie•49m ago
A general language feature would be fexprs, or call-by-name (which can be combined with call-by-value using call-by-push-value).

In Kernel[1] for example, where operatives are an improved fexpr.

    ($define! $if
        ($vau (condition if-true if-false) env
            ($cond 
                ((eval condition env) (eval if-true env))
                (#t (eval if-false env)))))
$vau is similar to $lambda, except it doesn't implicitly evaluate its operands, and it implicitly receives it's caller's dynamic environment as a first class value which gets bound to env.

$lambda is not actually a builtin in Kernel, but wrap is, which constructs an applicative by wrapping an operative.

    ($define! $lambda
        ($vau (args . body) env
            (wrap (eval (list* $vau args #ignore body) env))))
All functions have an underlying operative which can be extracted with unwrap.

[1]:https://ftp.cs.wpi.edu/pub/techreports/pdf/05-07.pdf

tromp•23m ago
For lambda calculus, the motto is "when everything is a function". The boolean true is the function λx.λy.x, while false is λx.λy.y. If b then x else y then simply becomes b x y. In a functional language like Haskell that is basically a typed lambda calculus with lots of syntactic sugar, we can replicate this with:

    type MyBool a = a -> a -> a

    myTrue :: MyBool a
    myTrue = \x y -> x
    myFalse :: MyBool a
    myFalse = \x y -> y

    myIf :: MyBool a -> a -> a -> a
    myIf b myThen myElse = b myThen myElse

    main = print (myIf myTrue "true" "false")