I Hate the Letter F

(old.reddit.com)

68 points | by thunderbong 3 hours ago ago

39 comments

  • SvenL 43 minutes ago

    Boy, finally somebody who also hates a certain letter. I hate c - it’s totally garbage letter.

    Take for example Pacific Ocean. Every damn c in that two word is pronounced differently. Worst part, you could replace it with other letters (Pazifik Oshean). It’s redundant.

    C is just a nightmare…

  • fbn79 an hour ago

    I think the "F" is OP Zahir https://en.wikipedia.org/wiki/The_Zahir

  • robin_reala an hour ago

    As a commenter points out, that’d make programming a difficult pastime. Can’t think of a non-esolang without if and for apart from Brainfuck, and that’s got an f in the name.

    • reikonomusha an hour ago

      Easy in Common Lisp without sacrificing ergonomics or getting stuck in a Turing tarpit.

      We'd make a small preamble to define new names for things like DEFUN, Lisp's operator to define new functions. No F's needed to do that either. We can do this by taking advantage of read-time evaluation.

      First we get references to the symbols DEFMACRO and DEFUN.

          (eval-when (:compile-toplevel :load-toplevel :execute)
            (setq de*un (intern (map 'string 'code-char '(68 69 70 85 78))))
            (setq de*macro (intern (map 'string 'code-char '(68 69 70 77 65 67 82 79)))))
      
      This technique can be used to access any symbol in Common Lisp that may have an F in it.

      Now, to make life-without-F easy, we define new names for DEFMACRO (mac) and DEFUN (proc) without actually lexically referring to the F-infected symbols:

          (#.de*macro mac (&body r) `(,de*macro ,@r))
          
          (mac proc (&body r) `(,de*un ,@r))
      
      Now we can define functions with PROC instead of DEFUN. Here's the Fibonacci function, with the F censored out. Note that we don't need IF since Lisp has the superior COND:

          (proc *ib (n)
            (cond
              ((= 0 n) 0)
              ((= 1 n) 1)
              (t (+ (*ib (- n 1)) (*ib (- n 2))))))
      
      Test it:

          > (print (*ib 10))
          55
      • benrutter 8 minutes ago

        This is excellent! I was playing around with a lisp (hy) recently, and hadn't really used macros before then. It's amazing how much you can reengineer lisp from within to meet your needs, even if they're as small as "I don't want to use F".

        I haven't seen any non-lisp languages that give you that kind of power, for better or worse.

    • evmar an hour ago

      With Rust you could get by with "match bool { true => ..., _ => ... }" and "loop { ... break }" I think.

      • Trung0246 44 minutes ago

        `unsafe` code is a little bit tough since the keyword have an F, unless there's another way to create unsound code by abusing rustc.

      • notpushkin an hour ago

        Yeah, using a language with pattern matching should do the trick. Maybe OCaml or even F#.

        rimshot

    • RodgerTheGreat an hour ago

      In Lil[0], avoiding "F" is doable, but not very convenient.

      The if/elseif keywords are off the table, but you still have both explicit looping constructs and function declarations:

          while x ... end
          each x y z in w ... end
          on name x y do ... end
      
      There are five primitive operators with "F": typeof (rarely needed), floor (inconvenient to work around but at least you still have % for modulo), first (can be replaced with indexing), flip (transpose a matrix/table; this could be replaced (slowly) with a user-defined function), fuse (join a list of strings into a single string; very difficult to do without, since Lil doesn't have a vanilla string-concat operator), format (string formatting; this removes tons of functionality and the easiest ways of working around not having fuse).

      Most of the query forms (select, extract, and update expressions) would be OK, but they all need a "from" clause to specify the source table, so no dice.

      What you're left with is still very much Turing-Complete, but much less ergonomic.

      [0] http://beyondloom.com/tools/trylil.html

    • frogulis an hour ago

      I infer from the wording in your comment that you consider Brainfuck to be a non-esolang. Your mind must operate on a different plane to mine!

      • robin_reala 24 minutes ago

        It’s the most well known of the esolangs at least.

    • skykooler 34 minutes ago

      You could do a lot in assembly (which uses instructions like JNZ for "if"), as long as you don't need any floating point math.

    • Someone an hour ago

      https://en.cppreference.com/w/cpp/language/charset:

      “Mapping from source file (other than a UTF-8 source file)(since C++23) characters to the basic character set(until C++23)translation character set(since C++23) during translation phase 1 is implementation-defined, so an implementation is required to document how the basic source characters are represented in source files.”*

      ⇒ pre C++23, you could have a C++ compiler that used an Unicode “Pile of poo” (https://www.unicode.org/L2/L2017/17407-frowning-poo.pdf) instead of the letter F.

    • yojo an hour ago

      JavaScript gives you the ternary operator (?/:) to handle conditionals plus switch/case. Plus you get map/reduce methods on iterables, and you can write procedures with “const thing = ()=> {}”

      I think I could write an arbitrarily complex program without major issue.

    • xigoi 35 minutes ago

          if (x) { y; } → while (x) { y; break; }
          for (a; b; c) { d; } → a; while (b) { d; c; }
    • pfortuny an hour ago

      I guess you can (at least in C ) use && where you would use “if” and a convoluted while where you could write a “for”.

      • akira2501 an hour ago

            #include <stdio.h>
        
            int main() {
                    int a = 1;
                
                    switch(a) case 1: puts("there's always this");
            }
        
        Switch accepts a statement. It does not have to be compound.
      • tgv an hour ago

        When you're dedicated and don't have to work in a large team:

        ihatetheletterf.h:

            #define cond if
            #define loop for
            #define otherwise default
            #define untrue false
            #define real float
        
        And when you work in a (large) team, they won't likely accept weird constructions just to avoid a letter anyway.
        • reshlo an hour ago

          You just used the letter f 13 times to make that file, though.

      • thaumasiotes an hour ago

        > and a convoluted while where you could write a “for”

        What's convoluted about it? A `for` is about as simple as syntactic sugar gets.

            for( a; b; c ) {
            }
        
        is exactly equivalent to

            a;
            while( b ) {
              c;
            }
        
        (OK, a variable declared in `a` will remain in scope after the while loop terminates, but the only way for this to have an effect on anything is if you intentionally refer to it afterwards, in which case you needed to predeclare it for the for loop too.)
    • reshlo an hour ago

      You might be able to get by in Haskell if you avoid case expressions.

    • danielheath 32 minutes ago

      Unless and Each, in ruby?

    • coffee_ an hour ago

      happenstance x > 0:

      per x in y:

    • fragmede an hour ago

      whitespace

      • thayne an hour ago

        Definitely an esolang

  • pavlov 33 minutes ago

    Replace it with “ph” in every word, and you’ll have the phine benephit of sounding like a 90s indie band or a 70s phone hacker.

  • jessekv 38 minutes ago

    I don't hate the letter "s", but its sound is quite distinctive in conversation.

    In a crowded room, listen for the "s" sounds and you will see what I mean.

    • mofunnyman 29 minutes ago

      Ask any audio engineer about the letter S. You can walk out of the room, go live your life for a year, come back, and they will still be screaming.

    • scottapotamas 28 minutes ago

      That sound has a name - sibilance

  • scosman 15 minutes ago

    Clearly doesn’t give a f

  • beardyw an hour ago

    Upvotes awarded where the letter not used.

  • yegle an hour ago
  • d--b 41 minutes ago
  • kelseyfrog an hour ago

    Such a grand oulipo. well done

  • saagarjha an hour ago

    A true lipogrammer, I guess.

  • labster an hour ago

    I wonder how easy it would be to avoid that letter when programming. It would certainly be easier in Perl, since you can use unless conditionals and while loops, and subroutines are simply called sub. In the case you absolutely need a module using the dreaded letter, require can be used instead of use so that letter can simply be escaped. The same applies to method calls, just call indirectly. The idea reminds me about JS*uck.

    • beardyw an hour ago

      Just missed out - one occurrence.

    • etcd an hour ago

      FORTH would be a good language despite its name starting with F.