知っておくべき60のPicolisp機能-リストとストリング


ようこそ!これは、60の最も一般的なpicolisp機能シリーズの最後のポストです.今日はリストと文字列をカバーします.
Picolispの中で最も重要なデータ型の一つとして、私たちはトピックリストをかなり広範囲に扱います.その後、すぐにいくつかの基本的な文字列の関数を見てみましょう.

基礎,再考
リストがどのように働くかを本当に理解するために、我々は"Concepts and Data Types" post (最初に読んでみないといけません.我々がそこで学んだので、Picolispは3つのデータ型だけを持ちます:数、シンボルとリスト.
要約:セルは64ビットの機械語のペアです.そして、それは伝統的にLisp用語でCarとCDRと呼ばれています.これらの単語は、数値(スカラー)または他のセル(ポインタ)のアドレスを表すことができます.

リストとはリストは、セルのリストをセルに接続するためにセルのCDRが次のセルを指す連鎖セルで構成されます.以下に例を示します.

リストの定義
リストを定義するには、括弧で囲まれます.いくつかの例
  • (A) は単一のセルリストで、A その車でNIL そのCDRで.
  •       +-----+-----+
          |  A  | NIL |       single cell list
          +-----+-----+
    
  • (A B C) シンボルを持つ3つのセルからなるリストですA , B and C そして、彼らの車でNIL 最後のセルのCDRで.
  •       +-----+-----+
          |  A  |  |  |
          +--+--+-----+
                   |
                   V
                   +-----+-----+
                   |  B  |  |  |   
                   +--+--+-----+
                            |
                            V
                            +-----+-----+
                            |  C  | NIL |
                            +-----+-----+
    
  • (A . B) 「ドット対」とは、「cons pair」と呼ばれるものであり、単一のセルからなるリストであり、シンボルと共にA その車でB そのCDRで.
  •       +-----+-----+
          |  A  |  B  |       dotted pair
          +-----+-----+
    
  • リストはまた、入れ子にすることができます、すなわちリストリストはリストであることもできます.

  • リストアクセス
    Picolispは、セルのセルアーキテクチャに基づいてリスト項目へのアクセスを処理する便利な機能を備えています.これは、リストが内部的に構築されている方法を理解するのにとても役立つ.
  • car リストの最初の要素を返す
  • : (car (1 2 3 4 5 6))
    -> 1
    
  • cdr , 他方、最初の要素以外のすべてを返します.なぜなら、上の図面で見ることができるので、CDRはリストの残りを指します.
  • : (cdr (1 2 3 4 5 6))
    -> (2 3 4 5 6)
    
    組み合わせるためにいくつかのショートカットがありますcar and cdr . たとえば、リスト内の2番目の項目を取りたい場合は、cdr . これは、cadrcdr , then car ):
    : (cadr (1 2 3 4 5 6))
    -> 2
    
    一方、入れ子になったリストがあれば、リストの最初の項目の“REST”にアクセスしたいかもしれません.これはcdarcar , then cdr ):
    : (cdar '((1  2) 3 4 ))
    -> (2)
    
    または最初の項目の最初の項目
    : (caar '((1  2) 3 4 ))
    -> (1)
    
    あなたは原則を得る.機能は、最大4 x AまたはBのためにショートカットすることができます.正確には、これらは有効な組み合わせです.caaaar , caaadr , caaar , caadar , caaddr , caadr , caar , cadaar , cadadr , cadar , caddar , cadddr , caddr , cadr , car , cdaaar , cdaadr , cdaar , cdadar , cdaddr , cdadr , cdar , cddaar , cddadr , cddar , cdddar , cddddr , cdddr , cddr .
    同様に、特定の項目はnth , 指定したリストの末尾を返す.(nth 'lst 2)(cdr 'lst) .
    : (nth '(a b c d) 2)
    -> (b c d)
    : (nth '(a (b c) d) 2 2)
    -> (c)
    

    リストの作成
    ある範囲の数のリストが必要であれば、最も簡単な方法はrange 関数.範囲制限の2つの引数を加えて、ステップ幅のための追加パラメータを加えます.
    : (range 1 6)
    -> (1 2 3 4 5 6)
    : (range 6 1)
    -> (6 5 4 3 2 1)
    : (range -3 3)
    -> (-3 -2 -1 0 1 2 3)
    : (range 3 -3 2)
    -> (3 1 -1 -3)
    
    より複雑なリストの場合、リストの構築プロセスは初期化され、make 環境を起動するにはlink アイテムを最後まで加えるyoke 項目を先頭に追加します.リストの先頭と末尾へのポインターは内部的に維持されます.いくつかの例
    : (make (link 1) (link 2 3) (link 4))
    -> (1 2 3 4)
    
    : (make (link 2 3) (yoke 1) (link 4))
    -> (1 2 3 4)
    
    リストを構築する別の方法はcons , これは、最初の引数とCDRの2番目の引数を持つ新しいリストセルを構築します.つ以上の引数が与えられた場合、対応するセルのチェーンが構築されます.( cons ' a ' b ' c ' dはcons ' a ( cons ' b ( cons ' c ' d ))と等価です.
    Note that unlike make / link , 2番目の引数はCDRに追加されます.リストの最後ではなく、内部表現の重要な違いです.
    : (cons 1 2)
    -> (1 . 2)
    : (cons 'a '(b c d))
    -> (a b c d)
    : (cons '(a b) '(c d))
    -> ((a b) c d)
    : (cons 'a 'b 'c 'd)
    -> (a b c . d)
    

    リストの長さlength セルの数に関してリストの「長さ」を返します.引数length がセルではなく数値である場合、値の桁が返されます(負の値は1をプラスします).シンボルの場合は、名前の文字数です.
    # List
    : (length (1 (2) 3))
    -> 3
    : (length (1 . 2))
    -> 1
    
    # Symbol
    : (length "abc")
    -> 3
    
    # Number
    : (length 123)
    -> 3
    

    リスト関数
    これは、リスト内のすべての項目に関数を適用するのに非常に一般的な要件です.以下では、最も一般的な機能を見つけることができます.apply リストに関数を適用します.追加の引数が与えられた場合、リストの先頭の要素として適用されます.
    : (apply + (1 2 3))
    -> 6
    : (apply '((X Y Z) (* X (+ Y Z))) (3 4 5))
    -> 27
    : (apply println (3 4) 1 2)
    1 2 3 4
    -> 4
    
    mapcar 関数とリストを受け取り、リストの各要素に関数を適用します.違いに気づくapply , このようにしてリストに関数を適用する.
    追加のリスト引数が与えられると、それらの要素もまた関数に渡されます.mapcar すべての結果を持つリストを返します.
    : (mapcar sqrt (4 9 16))
    -> (2 3 4)
    : (mapcar + (1 2 3) (4 5 6))
    -> (5 7 9)
    : (mapcar + (1 2 3) 5)
    -> (6 7 8)
    
    mapcar 無名関数
    # add element of first list to square of element of second list
    
    : (mapcar '((X Y) (+ X (* Y Y))) (1 2 3 4) (5 6 7 8))
    -> (26 38 52 68)
    
    mapc と似ているmapcar , を返します.
    : (mapc println (1 2 3 4) '(A B C))
    1 A
    2 B
    3 C
    4 NIL
    -> NIL
    

    文字列関数
    それではすぐにいくつかの基本的な文字列関数も進みましょう.pack 与えられた引数を与えられた順序で文字列に変換します.エーNIL 引数は結果文字列には何も寄与しません.数字は桁文字列に変換され、シンボルは文字の名前を与え、リストはその要素を取ります.
    : (pack 'car " is " 1 '(" symbol " name))
    -> "car is 1 symbol name"
    
    chop 単一の文字列のリストとしてシンボルの名前を返します.
    : (chop 'car)
    -> ("c" "a" "r")
    : (chop "Hello")
    -> ("H" "e" "l" "l" "o")
    
    char Unicodeをシンボルに変換します.
    : (char 100)               # Convert unicode to symbol
    -> "d"
    : (char "d")               # Convert symbol to unicode
    -> 100 
    
    おめでとう:私たちは今、60以上の最も一般的なpicolisp機能をカバーしている!
    次のポストでは、Picolispの数学的な計算をする方法を理解するために、固定小数点演算を簡単に見てみましょう.その後、最終的に最初のPicolispスクリプトを書いて、ヘルプ機能とデバッガを使用することを学ぶことによって初心者のものを閉じます.

    ソース
  • カバーhttps://pixabay.com/de/users/erik_stein-2524241

  • https://picolisp.com/wiki/?ArrayAbstinence

  • https://picolisp.com/wiki/?Documentation

  • https://picolisp.com/wiki/?RosettaCodeAnalysis