100言語Spedrdrun :エピソード87:サイド


Sidefはプロトタイププログラミング言語であり、Ruby、Raku、Juliaに触発されている.

OSXのインストール


Sidefを実行するのは簡単ではありません.これはPerl 5プラットフォームで実行し、CPANを介してインストールすることができますが、深刻な問題に実行されます.
OSXにバンドルされたPerlバージョンは本当に推奨されませんので、私はBREWバージョンを使いました.残念ながら、以下のようにします:
$ brew install perl
$ cpan Sidef
インストールするsidef イン~/.cpan/build/Sidef-3.99-0/bin/sidef , しかし、それはシステムPerlを使用するようにハードコード化されています.
それで、私は2つの追加ステップを必要としました.シンボリックリンク~/.cpan/build/Sidef-3.99-0/bin/sidef いくつかの場所に$PATH ライクln -s ~/.cpan/build/Sidef-3.99-0/bin/sidef ~/bin/ .
と編集sidef からの最初の行を変更するプログラム#!/usr/bin/perl to #!/usr/bin/env perl したがって、それはOSXから時代遅れのものではなく、適切なバージョンを使用します.
これらの手順の後、我々は行く準備ができています.
これは確かにsidefだけで良い処理する必要があります.そして、SASFのためにVSCODE構文を強調していません.多くの場合、非常にまれに使用される言語もある.

こんにちは、世界!


こんにちは、世界は全く驚くべきことです.ここの醜いセミコロンでない.
#!/usr/bin/env sidef

say "Hello, World!"
$ ./hello.sf
Hello, World!

フィズバズ


実際には、ルビー、ラク、ジュリアの間の何かのように見える.
#!/usr/bin/env sidef

(1..100).each { |n|
  if (n % 15 == 0) {
    say "FizzBuzz"
  } elsif (n % 5 == 0) {
    say "Buzz"
  } elsif (n % 3 == 0) {
    say "Fizz"
  } else {
    say n
  }
}
  • 範囲1..100 から行く1 to 100
  • ない... 範囲
  • {|args| ...} ブロックはRubyのように見えますが、同じ方法で全く使われません
  • if elsif else 必要(){} s
  • ブロック


    Rubyブロックには特別な場所があり、ブロック引数は通常の引数とは別のものです.そうでない.
    Sidefは構文の柔軟性の非常に高いレベルを持っています.
    #!/usr/bin/env sidef
    
    func twice(f) {
      say "Running it twice:"
      f()
      f()
    }
    
    var hi = { say "Hi!" }
    twice(hi)
    twice({ say "Hello!" })
    twice { say "This does not work!" }
    
    say ""
    say "Iteration:"
    { |i| say "Block got: #{i}" }.each(10..12)
    { |i| say "Block got: #{i}" } << 13..14
    for 15..16 { |i| say "Block got: #{i}" }
    (17..18).each { |i| say "Block got: #{i}" }
    { |i| say "Block got: #{i+19}" } * 2
    2.times { |i| say "Block got: #{i+21}" }
    
    say ""
    say "Single argument:"
    60 |> { |i| say "Block got: #{i}" }
    60 |> :inc |> { |i| say "Block got: #{i}" }
    60 |> {|i| i + 2} |> { |i| say "Block got: #{i}" }
    60 |> {_+3} |> { |i| say "Block got: #{i}" }
    60 |> (:add, 4) |> { |i| say "Block got: #{i}" }
    { |i| say "Block got: #{i}" }(69)
    
    $ ./blocks.sf
    Running it twice:
    Hi!
    Hi!
    Running it twice:
    Hello!
    Hello!
    
    Iteration:
    Block got: 10
    Block got: 11
    Block got: 12
    Block got: 13
    Block got: 14
    Block got: 15
    Block got: 16
    Block got: 17
    Block got: 18
    Block got: 19
    Block got: 20
    Block got: 21
    Block got: 22
    
    Single argument:
    Block got: 60
    Block got: 61
    Block got: 62
    Block got: 63
    Block got: 64
    Block got: 69
    
    Rubyスタイル以外のすべての作品twice { say "This does not work!" } 文字通り何もありません、そして、私は理由がわかりません.
    デバッグツールがいくつかあります-c compile the code into a Perl program and -D dump the syntax tree of a program , しかし、結果は本当に人間に読めません.
    と思った-k keep track of potential unsafe parser interpretations それについて何かを言うかもしれません、しかし、それも何も言いません.
    構文の柔軟性の度合いが高いのは、通常のプログラミングでは重要ではありませんが、DSLSがそれらのために働くものを選ぶのを容易にするので、DSLSにとっては素晴らしいことです.
    特に|> コードは非常にかわいいです.

    フィボナッチ


    サイドサポートis cached 自由のための回想のために、それは私がなぜより多くの言語がこれをしないかについて、わからない一般的な十分なユースケースです.キャッシュをクリアする方法もあります.
    #!/usr/bin/env sidef
    
    func fib(n) is cached {
      return 1 if (n <= 2)
      fib(n - 1) + fib(n - 2)
    }
    
    (1..100).each {|n|
      say "fib(#{n}) = #{fib(n)}"
    }
    
    $ ./fib.sf
    fib(1) = 1
    fib(2) = 1
    fib(3) = 2
    ...
    fib(98) = 135301852344706746049
    fib(99) = 218922995834555169026
    fib(100) = 354224848179261915075
    

    演算子の優先順位


    Sidefは、優先順位規則であまりにかわいいです.
    #!/usr/bin/env sidef
    
    say(2+3*4+5)
    say(2 + 3 * 4 + 5)
    say(2 + 3*4 + 5)
    say(2+3 * 4+5)
    
    4つの異なる結果を出力します.
    $ ./math.sf
    29
    25
    19
    45
    
    Sidefちょうど演算子の優先順位を持っていない代わりに、いくつかの完全に非常識な方法で何が起こるかを決定するために間隔を使用しようとします.
    標準演算子優先順位に従うことは最悪の考えです.Smalltalkはそれを試みました、そして、それは言語を殺しました.すべてのSmalltalkの後継者は、この愚かな考えを解くためにすべての痛みを伴うものをしなければならなかった.そして、Smalltalkは少なくとも単純な一貫した規則を持ちました.Sidefは正気ではありません.
  • 空白がなければ、演算子は右から左へ2+3*4+5 is 2+(3*(4+5)) )
  • スペースを指定すると、演算子は左から右へ(2 + 3 * 4 + 5 is ((2+3)*4)+5 )
  • いくつかのスペースで、演算子はスペースがあるときに右に左に適用され、
  • これは言語を失望させる.

    悪化する


    ここでは、SideFでのワードルゲームです.
    #!/usr/bin/env sidef
    
    var words = File.new("wordle-answers-alphabetical.txt").read.split
    var word = words.rand
    var guess = ""
    
    while (guess != word) {
      print "Guess: "
      guess = STDIN.readline
      if (guess.size != 5) {
        say "Only 5 letter words allowed"
        next
      }
      {|i|
        if (word[i] == guess[i]) {
          print "🟩"
        } elsif (word.include(guess[i])) {
          print "🟨"
        } else {
          print "🟥"
        }
      } * 5
      print "\n"
    }
    
    あまり悪くなかった.
    $ ./wordle.sf
    Guess: trial
    🟥🟥🟥🟨🟥
    Guess: maybe
    🟥🟨🟥🟥🟩
    Guess: snake
    🟨🟥🟩🟥🟩
    Guess: chase
    🟥🟩🟩🟩🟩
    Guess: phase
    🟩🟩🟩🟩🟩
    

    あなたはsidefを使うべきですか?


    いいえ.
    私は楽しい実験を支持します、しかし、sidefは数を加えるのと同じくらい単純な何かをする絶対的な最悪の方法を持ちます.
    さらに大きな問題は、いくつかのコードを書くとき、Sidefはそれが意味するものを決定し、半分の時間はあなたが何か他の何かを意味したと判断します.エラーメッセージがない、ドキュメントがない、構文のデバッグツールはありません、コードはちょうどそれがどんな感じでもします.時々、コードは何かをします.非常に頻繁にコードだけで何もしないし、それは多くの邪魔です.
    私は、それが少なくとも必要であるカジュアルな遊びのためにsidefを使えるようにすると思います:
  • 演算子優先順位を修正
  • より良いエラーメッセージ
  • いくつかの種類の“印刷方法は、”オプションは、多くの() sと地獄の側があなたがちょうど何を考えたかについて、あなたに話すために
  • 作業OSXパッケージ
  • これらの問題が修正されて、おそらくSidefは私が週末または2つのためにプレーを勧めることができる何かになる可能性があります.現在の状態では、ちょうどNO .

    コード


    All code examples for the series will be in this repository .
    Code for the Sidef episode is available here .