Hacker News new | past | comments | ask | show | jobs | submit login
With friends like these (perl.org)
101 points by lizmat on Aug 17, 2019 | hide | past | favorite | 22 comments



I'm surprised this article doesn't optimize a little further. If you want to compute σ(n), and you can prime factor n, there's no need to go determining all the divisors of n and then adding them up. The σ function is multiplicative, i.e., one has σ(nm)=σ(n)σ(m) when (n,m)=1. So if you've factored n = p_1^a_1 * ... * p_k^a_k, it suffices to compute σ(p_i^a_i) for each i and then multiply them together.

Meanwhile, while computing σ(p^a) can be done by summing, it can be done even more simply by noting that this is a geometric series and so sums to (p^(a+1)-1)/(p-1).

Edit: Actually, not sure how this latter way compares to just doing Horner. Probably about the same, I imagine. I guess Horner would be the right way to do it if division is expensive for some reason.


> which we extract and store in an appropriate Unicode-named variable: pₗpₘpₙ.

Which my phone unfortunately doesn’t render :(


Time to hack some more fonts into your phone.


I haven't tried installing new fonts, I don't think Safari would use them even if I installed them for privacy reasons.


Why "hack"?


Would love to know why my comment got downvoted...


This is Perl, remember. It's rendering just fine -- it's not your phone: I see the same ₙ boxes in Chrome on my MacBook Pro. He meant to use those ₙ boxes on purpose to show off how unintelligible he could make the code look.


I see P subscript 1, P subscript m and P subscript n here on firefox shrug


Renders fine with firefox on android but not chrome on the same phone.


Rather tangential, but:

> Perl 6 aims to let us express ourselves in whichever notation we find most convenient, comfortable, and comprehensible.

Is the reason I’ve always hated Perl once I started using it in a team context vs personal projects. The diversity of code styles even on your own Perl code over the years changes more than other languages I’ve used, let alone taking into account lots of other developers too.

<3 Damian’s articles and talks though, so this isn’t meant as a detractor on him.


With all the special characters in source code and attempts at a terse syntax for array-ish operations, it looks like Perl is trying to become APL. But statements like

    return unique flat small-divisors, big-divisors;
are ambiguous even to a human, because '-' is usually used for subtraction, but I guess Perl's parser somehow manages to disambiguate (between a single variable named 'small-divisors', and the subtraction of 'small' and 'divisor')?


Yes. Somewhat simplified, hyphens inside of identifiers are allowed and not taken to mean infix minus.

I remember when this was switched on. Larry Wall tried it out on the entire spectest suite, and nothing broke (or at most one random thing broke), because basically people already put whitespace around their infix operators.

Incidentally, apostrophes are also allowed inside Perl 6 identifiers.

Personally, I used to conservatively use underscore (`_`) in my Perl 6 identifiers for some years. Then I got used to hyphens, and it's hard to go back.


Hyphens and question marks in identifiers is actually the biggest feature I wish other languages would steal from Lisp. It does help that lisp doesn’t suffer from the “is it an infix operator?” parsing problem, which exists for both programmatic and meat-based compilers.


Then you'd love FORTH. Why limit yourself to hyphens and question marks? The only character you can't use in a FORTH identifier is space.

    FORTH ?KNOW IF HONK ELSE FORTH LEARN THEN

    : C(-; LICK SMILE NOSE WINK ;

    \ FORTH PAPER TAPE PUNCHER:

    : PT# ( L --- L/2 )
      DUP 1 AND IF 
        ASCII @ 
      ELSE BL THEN
      HOLD
      2/
    ;

    : PT. ( N --- )
      <# PT# PT# PT# 
         ASCII . HOLD
         PT# PT# PT# PT#
      #> TYPE
    ;

    : CUT
      ." -----------" CR
    ;

    : PTAPE
      CUT
      BEGIN
        KEY ?DUP WHILE
        DUP ." |" PT. ." |"  SPACE EMIT CR
      REPEAT
      CUT
    ;


> I remember when this was switched on. Larry Wall tried it out on the entire spectest suite, and nothing broke (or at most one random thing broke), because basically people already put whitespace around their infix operators.

Larry Wall seems hilariously easy-going for a language BDFL!


He's a linguist and a self-professed post-modernist. He's interested in how people actually use language, and has very little interest in dictating language purity.


Larry Wall is to Linguistics as Deepak Chopra is to Quantum Physics:

https://en.wikipedia.org/wiki/Larry_Wall

"While in graduate school at the University of California, Berkeley, Wall and his wife were studying linguistics with the intention of finding an unwritten language, perhaps in Africa, and creating a writing system for it. They would then use this new writing system to translate various texts into the language, among them the Bible. Due to health reasons these plans were cancelled, and they remained in the United States, where Larry instead joined the NASA Jet Propulsion Laboratory after he finished graduate school."

https://en.wikipedia.org/wiki/Cultural_imperialism

https://en.wikipedia.org/wiki/Scramble_for_Africa

https://en.wikipedia.org/wiki/Civilizing_mission

https://rationalwiki.org/wiki/Quantum_woo


> I remember when this was switched on [...] and nothing broke (or at most one random thing broke), because basically people already put whitespace around their infix operators

So you are saying that code like a=b-c+d completely changed its meaning? Would this example become a = b-c + d or a = b-c+d or a=b-c + d or ...?

I just can't imagine how you would change an existing language to such an extent.


The oddest lesson of Perl is that, even though there’s a million ways to do it, not all of them are used. It turns out that coders generally realize that the constructed examples you show above are all problematic for reasons unrelated to the change!

“What is b-c, is that a variable or a math?”

“Is it (a=b-c)+d or a=(b-c+d)”

So you simply wouldn’t encounter code written like this, because it’s just as confusing as it is problematic for the hyphen change.


Once you get used to - being allowed inside identifiers (that is, there needs be a letter on both sides the -), it becomes pretty easy to read.

Deciding what things mean based on context is something that humans are very good at.


There are spelled-out plain ASCII alternatives for all those weird unicode operators. If you're thinking in more mathematical notation, the unicode versions can feel more natural to use though.


[flagged]


> The article can't even render fonts correctly.

The article, or what you’re using to view it? Falls back fine for me.




Consider applying for YC's W25 batch! Applications are open till Nov 12.

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: