DeclarativeCOS-宣言的なCachéプログラミング

DeclarativeCOSプロジェクトは、COSプログラミングのトピックに関する魂の叫びです。



プロジェクトの目標は、COSの内部コアの改善にコミュニティの注意を引くことです。



プロジェクトのアイデアは、ループとコレクションを操作するときに簡潔な構文をサポートすることです。



画像






それで、私は何を簡潔に思いつきましたか? 例へようこそ!





プロジェクトの重要な概念は宣言的アプローチです。 使用するものと方法を示す必要があります。



個人的には、コレクションを必要な形式で表示するために、COSターミナルには単純な演算子/コマンド/スペルが常にありませんでした。 そして今、 zforeach$ zjoinの 2つの素晴らしいことがあります!



>s words = ##class(%ListOfDataTypes).%New() >d words.Insert(“Hello”) >d words.Insert(“World!”) >zforeach $zbind(words, “io:println”) Hello World!
      
      





ここでは、 $ zbind関数について詳しく説明する価値があります。 まず、コマンドと機能を使用してCOSを拡張できます。これについては、開発者コミュニティポータルの関連ドキュメント記事で詳しく説明できます。



この関数は、 バインダークラスのインスタンスを作成します。 そのタスクは、コレクションと、コレクションの各要素に適用する必要がある関数を接続することです。 この場合、 DeclarativeCOSの 「io:println」と呼ばれる標準関数が使用されます 。これは、指定された値に対して値が単純なコマンドを実行します。



 >w value,!
      
      





zforeachチームは、Binderクラスのインスタンスを使用して、コレクションを順番に処理し、各要素に関数を適用します。



$ zjoin-コレクションから文字列を作成し、指定されたセパレータが追加される要素を結合します。



例:セパレーター「/」を使用して、日、月、年に基づいて日付を作成します。
 >s numbers = ##class(%ListOfDataTypes).%New() >d numbers.Insert(“04”) >d numbers.Insert(“03”) >d numbers.Inset(“2017”) >w $zjoin(numbers, “ / ”) 04 / 03 / 2017
      
      







$ zmap-元のコレクションの要素から、指定された関数が適用される各要素への新しいコレクションを作成します。



例:各数値を16進数に変換します。
 >set numbers = ##class(%ListOfDataTypes).%New() >do numbers.Insert($random(100)) >do numbers.Insert($random(100)) >do numbers.Insert($random(100)) >write "[" _ $zjoin(numbers, ", ") _ "]" [82, 12, 27] >set hexNumbers = $zmap(numbers, "examples:toHex") >write "[" _ $zjoin(hexNumbers, ", ") _ “]” [52, C, 1B]
      
      







$ zfind-指定された関数が$$$ YESを返すコレクションの最初の要素を検索します。 それ以外の場合は、ヌル文字列を返します。



例:素数を見つけます。
 >set numbers = ##class(%ListOfDataTypes).%New() >do numbers.Insert($random(100)) >do numbers.Insert($random(100)) >do numbers.Insert($random(100)) >set primeNumber = $zfind(numbers, "examples:isPrime") >write "[" _ $zjoin(numbers, ", ") _ "]" [69, 41, 68] >write "Prime number: " _ $select(primeNumber="":"<not found>", 1:primeNumber) Prime number: 41
      
      







$ zfilter-元のコレクションに基づいて新しいコレクションを作成しますが、指定された関数が$$$ YESを返す要素のみを取得します。 そのような要素がない場合、空のコレクションを返します。



例:奇数を選択します。
 >set numbers = ##class(%ListOfDataTypes).%New() >do numbers.Insert($random(100)) >do numbers.Insert($random(100)) >do numbers.Insert($random(100)) >set filteredNumbers = $zfilter(numbers, "examples:isOdd") >write "[" _ $zjoin(numbers, ", ") _ "]" [22, 71, 31] >write "[" _ $zjoin(filteredNumbers, ", ") _ "]" [71, 31]
      
      







$ zexists-コレクションに、指定された関数が$$$ YESを返す要素が少なくとも1つあることを確認します。



例:コレクションに偶数があることを確認します。
 >set numbers = ##class(%ListOfDataTypes).%New() >do numbers.Insert($random(100)) >do numbers.Insert($random(100)) >do numbers.Insert($random(100)) >set hasEvenNumbers = $zexists(numbers, "examples:isEven") >write "[" _ $zjoin(numbers, ", ") _ "]" [51, 56, 53] >write "Collection has" _ $case(hasEvenNumbers, 1:" ", 0:" no ") _ "even numbers" Collection has even numbers
      
      







$ zcount-指定された関数が$$$ YESを返すコレクション内の要素の数をカウントします。



例:回文の数を数えます。
 >set numbers = ##class(%ListOfDataTypes).%New() >do numbers.Insert($random(1000)) >do numbers.Insert($random(1000)) >do numbers.Insert($random(1000)) >set palindromicNumbersCount = $zcount(numbers, "examples:isPalindromic") >write "[" _ $zjoin(numbers, ", ") _ "]" [715, 202, 898] >write "Count of palindromic numbers: " _ palindromicNumbersCount Count of palindromic numbers: 2
      
      







設置



DeclarativeCOSをインストールするには、プロジェクトの公式GitHub リポジトリから2つのファイルをダウンロードするだけです



  1. install.base.xmlは単なるクラスです。 Z関数なし。
  2. install.advanced.xml -Z関数を追加する%ZLANGルーチン。


使い方



  1. DeclarativeCOS.DeclarativeProviderからクラスを継承します。
  2. クラスメソッドを実装します。
  3. このメソッドを@Declarativeアノテーションでマークします。
  4. DeclarativeCOSのz関数を使用します。
  5. 幸せを感じてください。


詳細な説明



手順1. DeclarativeCOS.DeclarativeProviderからクラスを継承します。
 Class MyPackage.IO extends DeclarativeProvider { }
      
      





ステップ2.クラスメソッドを実装します。
 Class MyPackage.IO extends DeclarativeProvider { ClassMethod println(value As %String) { w value,! } }
      
      





ステップ3.このメソッドに@Declarativeアノテーションを付けます。
 Class MyPackage.IO extends DeclarativeProvider { /// @Declarative("myIO:myPrintln") ClassMethod println(value As %String) { w value,! } }
      
      





ステップ4. DeclarativeCOSのz関数を使用します。
 >s words = ##class(%Library.ListOfDataTypes).%New() >d words.Insert("Welcome") >d words.Insert("to") >d words.Insert("DeclarativeCOS!") >zforeach $zbind(words, "myIO:println")
      
      





ステップ5.幸せを感じてください!
 Welcome to DeclarativeCOS!
      
      







仕組み



DeclarativeCOSプロジェクトは、 ^ DeclarativeCOSグローバルを使用して、@ Declarative(declarativeName)アノテーションでマークされたメソッドに関する情報を保存します。



そのような各メソッドは、次のようにグローバルに保存されます。



 set ^DeclarativeCOS(declarativeName) = $lb(className, classMethod)
      
      





たとえば、 io:println関数の場合:



 set ^DeclarativeCOS(“io:println”) = $lb(“DeclarativeCOS.IO”, “println”)
      
      





io:println関数が使用されるたびに、グローバル検索が実行され、その後$ classmethod関数が指定された値で元のメソッド(DeclarativeCOS.IO#println)を呼び出します。



おわりに



DeclarativeCOSは、新しいCachéObjectScriptへの貢献です。 開発者がプロ​​グラムをすばやく、簡潔に、簡単かつ確実に書くのに本当に役立つ言語で。 この投稿の下にあるコメントの批判、支持、意見へようこそ!)



免責事項: この記事とそれに関する私のコメントは私の意見であり、InterSystems Corporationの公式な立場とは関係ありません。




All Articles