Wikifunctions wikifunctionswiki https://www.wikifunctions.org/wiki/Wikifunctions:Main_Page MediaWiki 1.47.0-wmf.24 first-letter Media Special Talk User User talk Wikifunctions Wikifunctions talk File File talk MediaWiki MediaWiki talk Template Template talk Help Help talk Category Category talk TimedText TimedText talk Module Module talk Translations Translations talk Event Event talk Wikifunctions:How to create implementations 4 1180 331074 327008 2026-10-23T08:22:51Z Ameisenigel 44 translate tags 331074 wikitext text/x-wiki <languages/> <translate> <!--T:1--> This page provides a more detailed guide to '''creating implementations''', beyond the overview at <tvar name="1">{{ll|Wikifunctions:Introduction}}</tvar>. == Types of Implementations == <!--T:47--> <!--T:48--> In Wikifunctions, an '''implementation''' can take one of two main forms: '''code''' or '''composition'''. A code implementation directly expresses the function’s logic in any of the available programming languages (currently, Python3 or JavaScript). It’s most useful when the function’s behavior can’t easily be built from existing Wikifunctions, or when precise control over data processing is needed. <!--T:49--> A composition implementation, on the other hand, defines the function entirely by combining other existing functions, without writing code. Compositions are easier to understand, reuse, and translate into other languages automatically, but they depend on suitable building blocks already being available and often are less performant. In general, start by checking whether your goal can be achieved through composition; if it can’t, or if performance or fine-grained logic matters, choose a code implementation instead. <!--T:50--> There's a third type of implementation: '''built-ins'''. These are run by system-built code, and are not editable. Most likely all pre-defined functions will have a built-in implementation. In such cases, when opening the implementation page, you will see a message stating ''"<tvar name="1">{{int|wikilambda-implementation-selector-none}}</tvar>"'' == Practice Test-Driven Development == <!--T:51--> <!--T:52--> '''Test-Driven Development''', or '''TDD''', is a way of creating software where you write tests before you write the actual code. Tests are just a way of understanding what your function is supposed to do by listing examples and how they should work. <!--T:53--> In Wikifunctions, writing tests first offers significant benefits. If you are working on an implementation, you can run your code against the existing tests to check that it behaves as expected. This makes it easier to catch errors early before even publishing your implementation. Tests are also a powerful way to describe the function you need. By writing tests, '''you clearly communicate the expected behavior''', and the community can step in and help with the implementation, or create alternative implementations. <!--T:54--> Imagine you want to implement a Function that combines two strings with a space in between. A basic test for this might look like: </translate> <syntaxhighlight lang="prolog"> join_with_space( "Hello", "world" ) => "Hello world" </syntaxhighlight> <translate> <!--T:55--> Once you have defined the basic behavior, it's important to '''think about edge cases'''—situations where the inputs are such that you might need some special behavior. <!--T:56--> For example, what if your first string ends in a space, or your second string starts with a space? Should the function keep all existing spaces and add another one, or should it return a neatly spaced result with just a single space between the words? Depending on your requirements, you should build a test for such a case. For example, a test for this edge case could be either one of these — but not both!: </translate> <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> <translate> <!--T:57--> or ... </translate> <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> <translate> <!--T:58--> Make sure that all possible special cases are covered by your tests, and once you have them, make sure that they are all connected to the Function by selecting them and clicking "Connect". == Code implementations == <!--T:59--> </translate> [[File:Code implementation.png|thumb|alt=<translate><!--T:60--> Wikifunctions code editor initialized with a function template</translate>|<translate><!--T:61--> When adding a new code implementation, the function template is initialized with the function and argument names</translate>]] <translate> <!--T:62--> When creating an implementation using code, the Wikifunctions UI will set up a code editor with the selected language activated for syntax highlighting and validation. When the function to implement and the programming language are selected, this editor will be set with the correct function template: '''do not remove or edit this'''! Keep your code inside this function signature: if you need auxiliary functions, you can simply declare them inside your top-level function declaration. === Using input types in your code === <!--T:63--> <!--T:64--> Wikifunctions types <tvar name="1">{{Z|Z6}}</tvar> and <tvar name="2">{{Z|Z40}}</tvar> can be used as if they were native types in both JavaScript and Python3. For example, a String input can be concatenated or a Boolean be directly used in a logical expression. To use other types in your code implementations, you will have to look deeper into the type, figure out if it has a conversion to a native equivalent, and treat it accordingly. <!--T:65--> For example, let's say we want to write some Python code that handles an input of type <tvar name="1">{{Z|Z20420}}</tvar>. In the page for this type, let's look at its "type converters to code" and search for a Python one. The converter <tvar name="2">{{Z|Z20424}}</tvar> will be applied to our date input before our code, so looking at "native type" we know that our input will be a Python ''dict'' and looking at the implementation we can see the keys we can expect: </translate> <syntaxhighlight lang="python3"> return { 'K1': year, 'K2': month, 'K3': day } </syntaxhighlight> <translate> <!--T:66--> When a type doesn't have a converter, you'll have to access its parts directly using its keys. For example, let's assume that your function <tvar name="1"><code>Z30000</code></tvar> has one input <tvar name="2"><code>Z30000K1</code></tvar> of type <tvar name="3">{{Z|Z11}}</tvar>. This type has two keys: <tvar name="4"><code>Z11K1</code></tvar> for the language (itself an object of type <tvar name="5">{{Z|Z60}}</tvar>), and <tvar name="6"><code>Z11K2</code></tvar> for the string value. Similarly, the language object has a key <tvar name="7"><code>Z60K1</code></tvar> for the language code. So, to get a string with the language code and the text, you can write: </translate> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1 ) { // <translate nowrap><!--T:308--> e.g. "en: some text"</translate> return Z30000K1.Z11K1.Z60K1 + ": " + Z30000K1.Z11K2; } </syntaxhighlight> <translate> <!--T:67--> For a quick reference of the available type conversions visit [[<tvar name="1">Special:MyLanguage/Wikifunctions:Execution targets#Default type conversion</tvar>|the default type conversion table]]. === Returning the right outputs === <!--T:68--> <!--T:69--> Similarly to the way you treat inputs, outputs need to match the type specified in the function definition. Some can be treated as simply as native types, so any string output will be converted into a Wikifunctions <tvar name="1">{{Z|Z6}}</tvar> object and any native boolean returned by your implementation will be converted into a Wikifunctions <tvar name="2">{{Z|Z40}}</tvar> object. <!--T:70--> Those types that have "type converters from code" will apply the appropriate function to the output, in order to build the required type. Following the example of <tvar name="1">{{Z|Z20420}}</tvar>, the <tvar name="2">{{Z|Z20443}}</tvar> will transform the output from your implementation–a dict with K1, K2 and K3 keys–into its correct ZObject representation. <!--T:71--> For types that don't have converters from code, you can carefully build and return the output objects. For example, imagine that our function <tvar name="1"><code>Z30000</code></tvar> takes two string inputs: language code and text, and should return a <tvar name="2">{{Z|Z11}}</tvar> object. You can do this in Python by using the <tvar name="3"><code>ZObject</code></tvar> constructor: </translate> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): lang_object = ZObject( {"Z1K1": "Z9", "Z9K1": "Z60"}, Z60K1 = Z30000K1 ) return ZObject( {"Z1K1": "Z9", "Z9K1": "Z11"}, Z11K1 = lang_object, Z11K2 = Z30000K2 ) </syntaxhighlight> <translate> <!--T:72--> Or in JavaScript: </translate> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { const langObject = new ZObject( new Map( [ [ "Z60K1", Z30000K1 ] ] ), { "Z1K1": "Z9", "Z9K1": "Z60" } ); const monolingualKeys = new Map( [ [ "Z11K1", langObject ], [ "Z11K2", Z30000K2 ] ] ); return new ZObject( monolingualKeys, { "Z1K1": "Z9", "Z9K1": "Z11" } ); } </syntaxhighlight> <translate> <!--T:73--> You can learn more about the <tvar name="1"><code>ZObject</code></tvar> class and other useful constructors in <tvar name="2">{{ll|Wikifunctions:Execution_targets#Custom_and_non-built-in_type_conversion}}</tvar> </translate>{{phab|T392750}}<translate> <!--T:317--> As of 2026-05, trying to return a list of lists may fail, so you're not able to implement such functions in code. === Code in Python === <!--T:74--> <!--T:3--> In this section, we give a concrete example on how to create an implementation in the form of Code in Python. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is Z30000. <!--T:5--> The implementation is defined using the ZID of the function. So are the arguments of the function. So in the case of the function Z30000 with its two arguments, the function template should look like this: </translate> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): </syntaxhighlight> <translate> <!--T:75--> As we described before, we know that the arguments (<tvar name="1"><code>Z30000K1</code></tvar> and <tvar name="2"><code>Z30000K2</code></tvar>) are Strings, so we can treat them as simply as we use native strings in Python. Also, the function should return a String. For our example, we simply return the two arguments concatenated with a space in between: </translate> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <translate> <!--T:9--> Since this is Python, do not forget to indent this line. <!--T:76--> If you have followed our advice to [[<tvar name="1">#Practice Test-Driven Development</tvar>|practice TDD]], you will already have a set of tests that you know should work. If that's the case, while building your implementation you can click on the circular arrow in the Tests panel, and see if your implementation passes all of them. <!--T:11--> Remember that the runtime has no state. Don’t assume values for global or static variables. If you have further questions about what you can and cannot do in Python, ask on <tvar name="1">[[Wikifunctions:Python implementations]]</tvar>. === Code in JavaScript === <!--T:77--> <!--T:13--> In this section, we give a concrete example on how to create an implementation in the form of Code in JavaScript. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is <tvar name="1"><code>Z30000</code></tvar>. <!--T:15--> The implementation is defined using the ZID of the function. So are the arguments of the function. So in the case of the function <tvar name="1"><code>Z30000</code></tvar> with its two arguments, the function template should look like this: </translate> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { } </syntaxhighlight> <translate> <!--T:78--> We know that the arguments (<tvar name="1"><code>Z30000K1</code></tvar> and <tvar name="2"><code>Z30000K2</code></tvar>) are Strings, so we can treat them as native strings in JavaScript. Also, the function should return a String. To complete our function, you can then add a line concatenating the input strings, like this: </translate> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <translate> <!--T:79--> If you have tests as recommended in the [[<tvar name="1">#Practice Test-Driven Development</tvar>|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes all of them. <!--T:21--> Remember that the runtime has no state. Don’t assume values for global or static variables. If you have further questions about what you can and cannot do in JavaScript, ask on <tvar name="1">[[Wikifunctions:JavaScript implementations]]</tvar>. === Calling another Wikifunctions function === A code implementation can call certain other Wikifunctions functions, receive the output of the call, and use that output in further processing. We refer to such calls as callbacks. At present, due to security and performance concerns, only the following built-in Wikidata fetch and search functions can be called in this way: <tvar name="1">{{Z|Z6820}}</tvar>, <tvar name="2">{{Z|Z6821}}</tvar>, <tvar name="3">{{Z|Z6822}}</tvar>, <tvar name="4">{{Z|Z6824}}</tvar>, <tvar name="5">{{Z|Z6825}}</tvar>, <tvar name="6">{{Z|Z6826}}</tvar>, <tvar name="7">{{Z|Z6830}}</tvar>, and <tvar name="8">{{Z|Z6831}}</tvar>. This capability is in an initial stage of deployment; we hope to allow calls to a broader range of functions in the future. Let’s look at a JavaScript implementation containing a callback. This implementation fetches an item from Wikidata, extracts the label of that item in a given language, and returns the label string. The item to fetch is given by argument <tvar name="1"><code>Z400K1</code></tvar>, and the language is given by <tvar name="2"><code>Z400K2</code></tvar>. </translate> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const item = Wikifunctions.Call('Z6821', Z400K1); for (const label of item.Z6001K2.Z12K1) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <translate> A callback is made by calling <tvar name="1"><code>Wikifunctions.Call</code></tvar>, as shown in the example. The first argument to <tvar name="1"><code>Wikifunctions.Call</code></tvar> is always the ZID of the function to be called – in this case, <tvar name="2">{{Z|Z6821}}</tvar>, which takes a single argument. Following that, the arguments to be passed to that function are listed, separated by commas. Here, that argument, <tvar name="3"><code>Z400K1</code></tvar>, is the same value that was passed to the function <tvar name="4"><code>Z400</code></tvar>. This is a common pattern of argument passing to callbacks, but their arguments can also be built using the <tvar name="5"><code>ZObject</code></tvar> constructor (as explained above), or obtained in other ways. The value of <tvar name="1"><code>Z400K1</code></tvar> would be an instance of <tvar name="2">{{Z|Z6091}}</tvar>, containing the QID of the item to be fetched. Line 2 of the example calls <tvar name="3"><code>Z6821</code></tvar> to fetch that item from Wikidata and assigns the resulting ZObject to the const <tvar name="4"><code>item</code></tvar>. The remaining code iterates over the item’s labels until it finds the one matching the language given by <tvar name="5"><code>Z400K2</code></tvar>. For the first example above, we have used <tvar name="1"><code>Z6821</code></tvar> for simplicity. However - unless an entire entity is needed by the implementation, it is strongly recommended to use <tvar name="2"><code>Z6820</code></tvar> to retrieve Wikidata items, which can be quite large. Although a call to <tvar name="2"><code>Z6820</code></tvar> is a bit more complex, its parameters allow for fetching selected portions of a Wikidata item, which can greatly improve performance and avoid some errors, by reducing the network bandwidth and processing time that are needed. (<tvar name="2"><code>Z6820</code></tvar> can also be used in place of <tvar name="3"><code>Z6822</code></tvar>, <tvar name="4"><code>Z6824</code></tvar>, <tvar name="5"><code>Z6825</code></tvar>, and <tvar name="6"><code>Z6826</code></tvar>, to get similar bandwidth-reduction benefits.) Just below we show how <tvar name="1"><code>Z6820</code></tvar> can be used, in <tvar name="2"><code>Wikifunctions.Call</code></tvar>, to implement the same behavior as above. Note that we use the second argument passed to <tvar name="1"><code>Z6820</code></tvar>, <tvar name="3"><code>[labelsPart]</code></tvar>, to say “Just return the item’s labels”, and we use the third argument, <tvar name="4"><code>[Z400K2]</code></tvar>, to say “Just return labels in the given language”. (This argument would also apply to aliases and descriptions, if they were included in the result.) </translate> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const labelsPart = new ZObject( new Map( [ ['Z6030K1', new ZReference('Z6033')] ] ), {Z1K1: 'Z9', Z9K1: 'Z6030'} ); const entities = Wikifunctions.Call( 'Z6820', [Z400K1], [labelsPart], [Z400K2], []); const item = entities.get(Z400K1.Z6091K1); const labels = item.Z6001K2.Z12K1; for (const label of labels) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <translate> Other things to note: </translate> * <translate>Even though code implementations are now able to fetch Wikidata entities, it is recommended that they not be written to return ''entire'' entities. This is because of current limitations on the size of the value returned from a code implementation. To fetch and return an entire large entity, it’s better to call the fetch function from a composition.</translate> * <translate>Only one callback can execute at a time. For security reasons, it is not possible to use the concurrency features of JavaScript or Python to execute multiple callbacks in parallel.</translate> ** <translate>Keep in mind, however, that you can fetch multiple entities at once using Z6820.</translate> * <translate>There is currently a 3 MiB limit on the size of Wikidata content that can be returned to a code implementation, by a single callback. The same limit applies to the size of the result returned from a code implementation.</translate> <translate> == Compositions == <!--T:22--> <!--T:23--> In this section, we give a concrete example on how to create an implementation in the form of a composition. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is <tvar name="1"><code>Z30000</code></tvar>. <!--T:24--> It is usually a good idea to first think about how to combine existing functions in order to create the desired output. Sometimes this might be trivial, and you can just go ahead with composing functions, but in many cases it is worthwhile to note the desired composition down. <!--T:25--> For example, for the given Function, we could use the existing Function <tvar name="1">{{Z|Z10000}}</tvar>. That Function takes two strings and makes one string out of them. But we need to add a space in between. So we first concatenate a space to the end of the first string, and then concatenate the second string to the result of that first concatenation. So our composition could be noted down like this: </translate> <syntaxhighlight lang="prolog"> join_strings( join_strings( Z30000K1, " " ), Z30000K2 ) </syntaxhighlight> <translate> <!--T:80--> There are multiple ways to write a composition: notice that the same thing could be accomplished with: </translate> <syntaxhighlight lang="prolog"> join_strings( Z30000K1, join_strings( " ", Z30000K2 ) ) </syntaxhighlight> <translate> <!--T:81--> An alternative implementation could also use the existing Function <tvar name="1">{{Z|Z15175}}</tvar>, so your composition could be: </translate> <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> <translate> <!--T:82--> As you can see, there are multiple ways to accomplish this, so take your time and explore the existing functions available in the <tvar name="1">{{ll|Wikifunctions:Catalogue}}</tvar>. <!--T:83--> Let's try to create the second example, <tvar name="1"><code>join_strings(Z30000K1, join_strings(" ", Z30000K2))</code></tvar>. <!--T:84--> In order to create this: </translate> # <translate><!--T:85--> Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page.</translate> # <translate><!--T:86--> Make sure that the option "composition" under "Implementation" is selected.</translate> # <translate><!--T:87--> Click on the "›" icon or click the "Select Function" link to expand the function details.</translate> # <translate><!--T:88--> Under "function" search for the name of the outermost function you want to use, which in this example is "join two strings". Then, select the wanted function from the dropdown list.</translate> # <translate><!--T:89--> You will see two new fields, one for each of the arguments needed for the selected function.</translate> # <translate><!--T:90--> For the first argument, we want to select the first input to our function:</translate> ## <translate><!--T:91--> Next to "first string", click on the "…" button and select "Argument reference".</translate> ## <translate><!--T:92--> Under "key id" you can now select the first string of your function from the dropdown, which contains all available inputs.</translate> # <translate><!--T:93--> For the second argument, we want to use the result of another call to "join two strings":</translate> ## <translate><!--T:94--> Next to "second string", click on the "…" button and select "Function call".</translate> ## <translate><!--T:95--> Under "function", search and select the function you want to call, which is again "join two strings".</translate> ## <translate><!--T:96--> For this inner function call, configure the "first string" by simply typing a white space in the text field, and configure the "second string" as you did for step 6: change it using the "…" button to "Argument reference", and then select the second argument in the dropdown.</translate> <translate> <!--T:97--> Your composition is now complete! <!--T:98--> You can expand and collapse the details using the chevron buttons to see how it looks. If you already have Tests as recommended in the [[<tvar name="1">#Practice Test-Driven Development</tvar>|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes the tests. Once your composition passes the tests, go ahead and publish it. </translate> [[File:Composition implementation expanded.png|frame|center|alt=<translate><!--T:99--> A Wikifunctions composition implementation in its expanded view</translate>|<translate><!--T:100--> A Wikifunctions composition implementation in its expanded view</translate>]] [[File:Composition implementation collapsed.png|frame|center|alt=<translate><!--T:101--> A Wikifunctions composition implementation in its collapsed view</translate>|<translate><!--T:102--> A Wikifunctions composition implementation in its collapsed view</translate>]] <translate> == Wikifunctions error handling == <!--T:103--> <!--T:104--> As a Wikifunctions function creator, you might want to warn the user calling your function when something goes wrong in the code, or when their inputs do not fit a certain criteria. For example, if your Function expects a string input to contain a name, you might want to check that the name is not empty and, if it is, show an error message that the person using your Function can understand. <!--T:105--> For this purpose, you can use <tvar name="1"><code>Wikifunctions.Error()</code></tvar> from your code implementations or the function <tvar name="2">{{Z|Z851}}</tvar> from your compositions. <!--T:106--> In this section you will learn: </translate> * <translate><!--T:107--> How to throw errors from both code and composition implementations,</translate> * <translate><!--T:108--> how to write tests for error cases, and</translate> * <translate><!--T:109--> how to catch and handle errors thrown by functions that you are using in your compositions.</translate> <translate> === Throwing errors from code implementations === <!--T:110--> <!--T:111--> When writing code, both from JavaScript and Python, you can use <tvar name="1"><code>Wikifunctions.Error()</code></tvar> to end the execution with a wanted error. <!--T:112--> <tvar name="1"><code>Wikifunctions.Error()</code></tvar> has two parameters: </translate> # <translate><!--T:113--> Error type: a string containing the ZID of the error type you want to return.</translate> # <translate><!--T:114--> Error arguments: a list of string arguments to build the error.</translate> <translate> <!--T:115--> Let's go one by one: ==== Error type ==== <!--T:116--> <!--T:117--> An error type is an object that describes a kind of error that could happen in the system. There are a number of built-in error types but you can also build other error types that are more suited to your use case. When using errors, the best idea is to browse through the available error types, which can be explored in [[<tvar name="1">Special:ListObjectsByType/Z50</tvar>|this list]]. <!--T:118--> If there are no errors that fit your case, create a new one by going to the create page, and selecting "Error type" in the type selector. Then, set the necessary fields: </translate> [[File:Error type.png|thumb|alt=<translate><!--T:119--> Error type creation in Wikifunctions</translate>|<translate><!--T:120--> To create new Error type (Z50), edit the label and add the necessary keys.</translate>]] * <translate><!--T:121--> '''Label''' – This is the main title of the error, which should contain a short but descriptive message. Set the error label on the right-side box titled "About".</translate> * <translate><!--T:122--> '''Keys''' – Keys contain additional information about what caused the error. For example, if an input had the wrong format, you might want to inform the user of what was the input content when raising the error. To use them in your implementations, keys should be strings. To create a key, click on the "[+]" icon below "keys", select "String" under "value type", and add a label that describes it appropriately, for example "current input". Once you have all the necessary keys, you can Publish your error type and keep the ID of the newly created object.</translate> * <translate>'''Error message''' – Error types can contain a multilingual array of HTML parametrized error messages. The parameter notation is $1, $2, etc., where the digit corresponds to the error type key. For example, when creating an error type with one string key "current input", the error message can use the positional parameter "$1", which will be replaced with the value of the "current input" key at the time of rendering the error. To add HTML messages, click on the "[+]" icon below "html fragments", select a language and input the HTML string.</translate> <translate> ==== Error arguments ==== <!--T:123--> <!--T:124--> Error arguments correspond to the keys of the Error type, and they should provide additional information to understand the error. Error arguments should always be Strings. ==== Using Wikifunctions.Error() ==== <!--T:125--> <!--T:126--> Say that you want an error to be thrown when either your first or your second input are empty. You have already created the error type, and the assigned ZID was <tvar name="1"><code>Z30005</code></tvar>. Your error type has two string keys: </translate> * <translate><!--T:127--> Input key: contains the key of the failing input</translate> * <translate><!--T:128--> Input value: contains the current value of the failing input</translate> <translate> <!--T:129--> To raise an error in your JavaScript implementation you should do something like this: </translate> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { // <translate nowrap><!--T:309--> If the first input is empty, raise error <tvar name="1">Z30005</tvar></translate> // <translate nowrap><!--T:310--> with two string args: [ first input key, first input value ]</translate> Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { // <translate nowrap><!--T:311--> If the second input is empty, raise error <tvar name="1">Z30005</tvar></translate> // <translate nowrap><!--T:312--> with two string args: [ second input key, second input value ]</translate> Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <translate> <!--T:130--> To raise an error in your Python implementation you should do something like this: </translate> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": # <translate nowrap><!--T:313--> If the first input is empty, raise error <tvar name="1">Z30005</tvar></translate> # <translate nowrap><!--T:314--> with two string args: [ first input key, first input value ]</translate> Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": # <translate nowrap><!--T:315--> If the second input is empty, raise error <tvar name="1">Z30005</tvar></translate> # <translate nowrap><!--T:316--> with two string args: [ first input key, first input value ]</translate> Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <translate> <!--T:131--> Remember that calling <tvar name="1"><code>Wikifunctions.Error()</code></tvar> ends the execution! === Throwing errors from compositions === <!--T:132--> <!--T:133--> If you are creating a composition implementation, you can throw an error by calling the special function <tvar name="1">{{Z|Z851}}</tvar>. ==== Throw Error function (Z851) ==== <!--T:134--> <!--T:135--> The <tvar name="1">{{Z|Z851}}</tvar> function is similar to the <tvar name="2"><code>Wikifunctions.Error()</code></tvar> method and takes two arguments: </translate> * <translate><!--T:136--> '''Error type''' – A reference to the Error type you want to raise</translate> * <translate><!--T:137--> '''Error parameters''' – A list with the arguments to create your Error, which should also be Strings.</translate> <translate> ==== Using Throw Error ==== <!--T:138--> <!--T:139--> Say you want to modify your composition so that it first checks that the arguments are not empty, and raises an error when it finds an empty one. Then, if none of them are empty, it runs the original composition, which is: </translate> <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> <translate> <!--T:140--> To do this, you need to create conditional paths, for which you can use the <tvar name="1">{{Z|Z802}}</tvar> function. Think of it like this: </translate> * <translate><!--T:141--> If the first argument is empty, throw an error for the first argument</translate> * <translate><!--T:142--> Else, proceed to check the second argument</translate> * <translate><!--T:143--> If the second argument is empty, throw an error for the second argument</translate> * <translate><!--T:144--> Else, proceed with the success path and return the joint strings with the space separator</translate> <translate> <!--T:145--> Or in functional pseudo code: </translate> <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), throw_error( Z30005, [ "Z30000K1", Z30000K1 ] ), if( is_empty_string( Z30000K2 ), throw_error( Z30005, [ "Z30000K2", Z30000K2 ] ), join_with_separator( Z30000K1, Z30000K2, " " ) ) ) </syntaxhighlight> <translate> <!--T:146--> Let's create this step by step: </translate> # <translate><!--T:147--> Start adding an implementation by clicking on the "+” button in the "Implementations" table from your Function page.</translate> # <translate><!--T:148--> Make sure that the option "composition" under "Implementation" is selected.</translate> # <translate><!--T:149--> Click on the "›” icon or click the "Select Function" link to expand the function details.</translate> # <translate><!--T:150--> Under "function" search and select the outermost function you want to use, which in this case is "if".</translate> # <translate><!--T:151--> Check the validity of the first argument:</translate> ## <translate><!--T:152--> Next to "condition", click on the "…" button and select "function call"</translate> ## <translate><!--T:153--> Under "function", search and select the function "is empty string"</translate> ## <translate><!--T:154--> Next to "input", click on the "…" button and select "argument reference"</translate> ## <translate><!--T:155--> Under "key id", select the first input (e.g. "first string")</translate> ## <translate><!--T:156--> You can now collapse the "condition" function call if you want, by clicking on the down-chevron next to "condition". You should see something like "f(x) is empty string( → first string )"</translate> # <translate><!--T:157--> Throw error if the condition is true:</translate> ## <translate><!--T:158--> Next to "then", click on the "…" button and select "function call"</translate> ## <translate><!--T:159--> Under "function", search and select the function "Throw Error"</translate> ## <translate><!--T:160--> Under "error type", search and select your error type (you can directly input the error ID if you know it, e.g. Z30005)</translate> ## <translate><!--T:161--> Under "error parameters", add two items by clicking on the "+" button</translate> ## <translate><!--T:162--> For "Item 1" (offending argument key), set its type to "String" and write the argument identifier (e.g. "first input", or "Z30000K1")</translate> ## <translate><!--T:163--> For "Item 2" (offending argument value), click on the "…" next to "Item 2" and select "argument reference"</translate> ## <translate><!--T:164--> Under "key id", select the first input (e.g. "first string")</translate> ## <translate><!--T:165--> You can now collapse the "then" function call if you want, by clicking on the down-chevron next to "then". You should see something like "f(x) Throw Error( Input was the wrong format, Typed list( Object, "first input", → first string ) )"</translate> # <translate><!--T:166--> Continue to check the second argument if the first was good:</translate> ## <translate><!--T:167--> Next to "else", click on the "…" button and select "function call"</translate> ## <translate><!--T:168--> Under "function", search and select the function "if"</translate> ## <translate><!--T:169--> Set up "condition" to check the validity of the second argument by following the same process as described in step 5.</translate> ## <translate><!--T:170--> Set up "then" to throw an error for the second argument by following the same process as described in step 6.</translate> # <translate><!--T:171--> Finally, set up the success path:</translate> ## <translate><!--T:172--> Next to the nested "else", click on the "…" button and select "function call"</translate> ## <translate><!--T:173--> Under "function", search and select the successful function, which in this case can be "join strings with separator"</translate> ## <translate><!--T:174--> Next to "first string", click on the "…" button and set it to "argument reference", then select "first string"</translate> ## <translate><!--T:175--> Next to "second string", click on the "…" button and set it to "argument reference", then select "second string"</translate> ## <translate><!--T:176--> Under "separator" add a space into the text field</translate> <translate> <!--T:177--> The resulting function call should look like this: </translate> [[File:Throw error expanded.png|frame|center|alt=<translate><!--T:178--> Wikifunctions composition using Throw Error function</translate>|<translate><!--T:179--> Wikifunctions composition using Throw Error function</translate>]] [[File:Throw error collapsed.png|frame|center|alt=<translate><!--T:180--> Wikifunctions composition using Throw Error function, in its collapsed view</translate>|<translate><!--T:181--> Wikifunctions composition using Throw Error function, in its collapsed view</translate>]] <translate> === Handling errors in compositions === <!--T:182--> <!--T:183--> While it is useful to allow functions to raise expected errors, it is crucial to be able to handle errors in your compositions in order to safely use these functions. <!--T:184--> Say you want to create a new function "full name of a person" – we will refer to it with the ZID <tvar name="1"><code>Z30010</code></tvar>. This function should return the full name of a person given a first and last names, but if any of the two fields are empty, it should return the text "Unknown" instead. <!--T:185--> You could create a composition using our example function "Join two strings with a space" or <tvar name="1"><code>Z30000</code></tvar> to generate the name. If any of the inputs are empty, you know that <tvar name="1"><code>Z30000</code></tvar> will throw an error of type <tvar name="2"><code>Z30005</code></tvar>. Using the function <tvar name="3">{{Z|Z850}}</tvar> as a wrapper, you can attempt the join operation and intercept a possible error to simply return "Unknown" whenever it occurs. ==== Try-Catch function (Z850) ==== <!--T:186--> <!--T:187--> The <tvar name="1">{{Z|Z850}}</tvar> function is built-in with ZID <tvar name="2"><code>Z850</code></tvar> and takes three arguments: </translate> * <translate><!--T:188--> '''Function call''' – The initial function call to run. If nothing goes wrong, the response will be the result of this function call.</translate> * <translate><!--T:189--> '''Error type''' – An error type to catch in case it is thrown during the execution of the first function call.</translate> * <translate><!--T:190--> '''Error handler''' – A function call that will be run in case the error specified above is caught during the execution of the initial function call. If that happens, the result of the error handler will be the value returned.</translate> <translate> ==== Using Try-Catch ==== <!--T:191--> <!--T:192--> Once we have all the functions for our composition, we can craft it like this: </translate> <syntaxhighlight lang="prolog"> try_catch( join_with_space( Z30010K1, Z30010K2 ), Z30005, echo( "Unknown" ) ) </syntaxhighlight> <translate> <!--T:193--> This means that: </translate> * <translate><!--T:194--> The "Join two strings with a space" function will be tried with the two inputs and, if everything goes well, the output of this function will be returned</translate> * <translate><!--T:195--> If any of the inputs are blank, "Join two strings with a space" with raise an error of type <tvar name="1"><code>Z30005</code></tvar></translate> * <translate><!--T:196--> Our <tvar name="1">{{Z|Z850}}</tvar> will then detect this error and run the <tvar name="2">{{Z|Z801}}</tvar> function to return "Unknown"</translate> <translate> <!--T:197--> Let's create this step by step: </translate> # <translate><!--T:198--> Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page.</translate> # <translate><!--T:199--> Make sure that the option "composition" under "Implementation" is selected.</translate> # <translate><!--T:200--> Click on the "›” icon or click the "Select Function" link to expand the function details.</translate> # <translate><!--T:201--> Under "function" search and select the outermost function you want to use, which in this case is "Try-Catch".</translate> # <translate><!--T:202--> Set the main function call:</translate> ## <translate><!--T:203--> Under the field where the "Try-Catch" function is selected, next to the "function call" key, click on the "…" button and select "function call"</translate> ## <translate><!--T:204--> Under "function" search and select the function "join two strings with space"</translate> ## <translate><!--T:205--> Next to "first string", click on the "…" button and select "argument reference", then select the "first name" argument from the dropdown.</translate> ## <translate><!--T:206--> Next to "second string", click on the "…" button and select "argument reference", then select the "second name" argument from the dropdown.</translate> # <translate><!--T:207--> Select the error to catch:</translate> ## <translate><!--T:208--> Under "error type", search and select "bad string input" – you can search directly by its ZID <tvar name="1"><code>Z30005</code></tvar></translate> # <translate><!--T:209--> Set the error handler function call:</translate> ## <translate><!--T:210--> Next to "error handler", click on the "…" button and select "function call"</translate> ## <translate><!--T:211--> Under "function", search and select the function "echo"</translate> ## <translate><!--T:212--> Under "input" and "type", search and select the type "String"</translate> ## <translate><!--T:213--> Now, under "input", type "Unknown" in the text field</translate> <translate> <!--T:214--> The resulting function should look like this: </translate> [[File:Try catch expanded.png|frame|center|alt=<translate><!--T:215--> Wikifunctions composition using Try-catch function, in expanded mode</translate>|<translate><!--T:216--> Wikifunctions composition using Try-catch function, in expanded mode</translate>]] [[File:Try catch collapsed.png|frame|center|alt=<translate><!--T:217--> Wikifunctions composition using Try-catch function, in collapsed mode</translate>|<translate><!--T:218--> Wikifunctions composition using Try-catch function, in collapsed mode</translate>]] <translate> === Testing your failure use cases === <!--T:219--> <!--T:220--> As we introduced in the above section about [[<tvar name="1">#Practice Test-Driven Development</tvar>|practicing TDD]], it's important to test not only the most common paths, but also the possible edge cases. It is equally important to test failure behavior. In this section we will give you the tools necessary to test that your function fails with a given set of inputs, and that the error thrown is the expected one. <!--T:221--> To do that, you will need other two system functions: ==== Is error type (Z852) ==== <!--T:222--> <!--T:223--> The <tvar name="1">{{Z|Z852}}</tvar> function is built-in with ZID <tvar name="2"><code>Z852</code></tvar> and takes two arguments: </translate> * <translate><!--T:224--> '''Error''' – An <tvar name="1">{{Z|Z5}}</tvar> object, which can be thrown by a failing call. An error instance has a type and a value.</translate> * <translate><!--T:225--> '''Error type''' – A reference to an <tvar name="1">{{Z|Z50}}</tvar> which will be compared to the type of the Error passed as a first argument. If that's the case, the function will return true.</translate> <translate> ==== Get error thrown by function call (Z853) ==== <!--T:226--> <!--T:227--> The <tvar name="1">{{Z|Z853}}</tvar> function is built-in with ZID <tvar name="2"><code>Z853</code></tvar> and takes one argument: </translate> * <translate><!--T:228--> '''Function call''' – A function call which can either return a successful value of any type, or throw an error.</translate> <translate> <!--T:229--> This function returns a <tvar name="1">{{Z|Z882}}</tvar> with a <tvar name="2">{{Z|Z40}}</tvar> in first place and an <tvar name="3">{{Z|Z1}}</tvar> in the second: </translate> * <translate><!--T:230--> If the Function call runs successfully and hence does not throw any error, the returned pair will contain False in the first place, and void in the second.</translate> * <translate><!--T:231--> If the Function call throws an error, the returned pair will contain True in the first place, and the caught error in the second.</translate> <translate> <!--T:232--> To use this function in your compositions, you might need to use the additional functions: </translate> * <translate><!--T:233--> <tvar name="1">{{Z|Z821}}</tvar>, and</translate> * {{Z|Z822}} <translate> ==== Testing errors ==== <!--T:234--> <!--T:235--> Say our target function, "Join two strings with a space" or <tvar name="1"><code>Z30000</code></tvar>, throws an error of type <tvar name="2"><code>Z30005</code></tvar> and we want to test this behavior. To do that we need to: </translate> * <translate><!--T:236--> Throw a failing function call</translate> * <translate><!--T:237--> Get the error using the function <tvar name="1">{{Z|Z853}}</tvar></translate> * <translate><!--T:238--> Check that the error is the right type with <tvar name="1">{{Z|Z852}}</tvar></translate> <translate> <!--T:239--> Tests have two fields: </translate> * <translate><!--T:240--> '''Call''' – A function call that will produce an output with the inputs you want to test. This call will return a value.</translate> * <translate><!--T:241--> '''Result validation''' – A function call that will validate that the value returned by the call above is the expected one. The first argument of this function call will be automatically assigned to take the return value of the first call.</translate> <translate> <!--T:242--> For step-by-step instructions on how to create tests, see <tvar name="1">{{ll|Wikifunctions:Introduction#Create_tests}}</tvar>. <!--T:243--> In our example, we can structure it like this — but this is not the only way! <!--T:244--> The call, which will return an <tvar name="1">{{Z|Z5}}</tvar> object: </translate> <syntaxhighlight lang="prolog"> error = get_second_element_of_typed_list( get_error_thrown_by( join_strings_by_whitespace( "", "not empty" ) ) ) </syntaxhighlight> <translate> <!--T:245--> And the result validation, which will take the <tvar name="1">{{Z|Z5}}</tvar> object as its first argument: </translate> <syntaxhighlight lang="prolog"> is_error_type( error, Z30005 ) </syntaxhighlight> <translate> <!--T:246--> Let's do this step by step: </translate> # <translate><!--T:247--> Start adding a test by clicking on the "+" button in the "Tests" table from your Function page. The "call" and "result validation" fields already have some functions pre-set, but to test the errors we will need to change them.</translate> # <translate><!--T:248--> First, let's set the call:</translate> ## <translate><!--T:249--> Under "call", click the "›" chevron button to expand the function call.</translate> ## <translate><!--T:250--> Under "function", edit the field and search and select the function "Get second element of a typed pair"</translate> ## <translate><!--T:251--> Once selected, next to "Typed pair", click on the "…" button and select "function call"</translate> ## <translate><!--T:252--> Under "function", search and select the function "Get error thrown by function call"</translate> ## <translate><!--T:253--> Next to "function call", click on the "…" button and select "function call"</translate> ## <translate><!--T:254--> Under "function", search and select the function "Join two strings with a space" (or by ZID <tvar name="1"><code>Z30000</code></tvar>)</translate> ## <translate><!--T:255--> Now set the inputs so that they cause a failure: at least one of them should be empty.</translate> ## <translate><!--T:256--> You can now collapse your "call" by clicking again on the down-chevron button if you want!</translate> # <translate><!--T:257--> Next, let's set the result validation:</translate> ## <translate><!--T:258--> Under "result validation", click the "›" chevron button to expand the function call.</translate> ## <translate><!--T:259--> Under "function", edit the field and search and select the function "Is error type"</translate> ## <translate><!--T:260--> Now you will only be asked to configure the second argument. Under "error type", search and select your <tvar name="1"><code>Z30005</code></tvar> error type.</translate> # <translate><!--T:261--> And you are done! You can now click the circular arrow in the "Implementations" box and you should see green checks.</translate> <translate> <!--T:262--> If everything went right, you can now save your test. It should look like this: </translate> [[File:Get error expanded.png|frame|center|alt=<translate><!--T:263--> Testing a failure using Get error and Is error type functions, in expanded mode</translate>|<translate><!--T:264--> Testing a failure using Get error and Is error type functions, in expanded mode</translate>]] [[File:Get error collapsed.png|frame|center|alt=<translate><!--T:265--> Testing a failure using Get error and Is error type functions, in collapsed mode</translate>|<translate><!--T:266--> Testing a failure using Get error and Is error type functions, in collapsed mode</translate>]] <translate> === Creating actionable error messages === As described above, Error Types have an optional key <tvar name="1"><code>Z50K3</code></tvar> which contains a multilingual list of HTML strings. When rendering information about an error, the messages stored in the error type can help create a clear, precise, informative, translatable and actionable error message. For that purpose, error messages can contain parameters like <tvar name="1"><code>$1</code></tvar>, <tvar name="2"><code>$2</code></tvar>, etc., where the digit corresponds to the error type argument and its value in the error instance. These error messages are rendered in Wikifunctions inside the "Details" dialog window after executing a function call. Additionally, these error messages are surfaced in other client interfaces, like Abstract Wikipedia, to provide better guidance to Abstract Content editors. </translate> [[File:Wikifunctions actionable error message example in the Details dialog.png|thumb|<translate>The error message is rendered using the HTML message of the error type and the error argument values.</translate>]] [[File:Wikifunctions actionable error message example in Abstract Wikipedia.png|thumb|<translate>When available, the HTML error message is rendered in the Abstract Wikipedia preview section.</translate>]] <translate> Let's use a real example to understand the benefits of HTML error messages: The function <tvar name="1">{{Z|Z37847}}</tvar> returns the first Lexeme reference given a Wikidata Item reference and a language. When there is no Lexeme for this Item-Language combination, it throws an error of type <tvar name="2">{{Z|Z28248}}</tvar>, which has three keys: </translate> * <translate>'''<tvar name="1">Z28248K1</tvar>''' is the input Wikidata item QID</translate> * <translate>'''<tvar name="1">Z28248K2</tvar>''' is the connecting property, in this case <code>P5137/item for this sense</code></translate> * <translate>'''<tvar name="1">Z28248K3</tvar>''' is the language code</translate> <translate> When calling this function for a Wikidata lexeme that doesn't exist, the call will throw an error instance like this: </translate> <syntaxhighlight lang="json" highlight="10,12"> { "Z1K1": "Z5", "Z5K1": "Z28248", "Z5K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z885", "Z885K1": "Z28248" }, "Z28248K1": "Q319", "Z28248K2": "P5137", "Z28248K3": "ast" } } </syntaxhighlight> <translate> While the error type label indicates: <code>No matching lexeme for item in language</code>, a better error message should indicate: </translate> * <translate>which is the failing item,</translate> * <translate>which is the language missing, and</translate> * <translate>what are the possible ways to fix it.</translate> <translate> The error message <tvar name="1"><code>Z50K3</code></tvar> field can provide this functionality. Whenever an Error Type has an error message for the user language (or any of its fallbacks), the error message shown will be rendered by: </translate> # <translate>First, replacing the message parameters with the values of the keys. In our example, any <tvar name="1"><code>$1</code></tvar> will be replaced with the value of <tvar name="2"><code>Z28248K1</code></tvar> ("Q319"), <tvar name="3"><code>$2</code></tvar> with "P5137", and <tvar name="4"><code>$3</code></tvar> with "ast",</translate> # <translate>Last, sanitizing and rendering the HTML message.</translate> <translate> So a HTML message like: </translate> <syntaxhighlight lang="html"> There is no matching lexeme for the item $1 in "$3".<br> <a href="http://wikidata.org/wiki/$1">Edit in Wikidata</a> </syntaxhighlight> <translate> Will become: </translate> : There is no matching lexeme for the item Q319 in "ast" : [[d:Q319|Edit in Wikidata]] <translate> == Debugging your implementations == <!--T:267--> <!--T:268--> Sometimes things can go wrong. A function might behave differently than expected or a value might not look quite right. Sometimes implementations are really complex and, because they are run in a sandboxed environment, it can seem really difficult to debug. To help understand what's going on inside a function call, Wikifunctions includes a small set of debugging tools. <!--T:269--> These tools don't change the result of a function, but will add extra information to the returned metadata, which you can observe after running the function. You can use <tvar name="1"><code>Wikifunctions.Debug()</code></tvar> from your code implementations or the function <tvar name="2">{{Z|Z854}}</tvar> from your compositions. <!--T:270--> In this section you will learn: </translate> * <translate><!--T:271--> How to add debug messages from both code and composition implementations,</translate> * <translate><!--T:272--> how to inspect the metadata manually or via the UI to inspect these logs.</translate> <translate> === Debugging your code implementations === <!--T:273--> <!--T:274--> When writing code, both from JavaScript and Python3, you can use <tvar name="1"><code>Wikifunctions.Debug()</code></tvar> to add a message to your debugging log and continue the execution. </translate> {{phab|T441028}} <translate> <!--T:275--> <tvar name="1"><code>Wikifunctions.Debug()</code></tvar> has one parameter, which is generally expected to be a string. However, any other object passed as parameter will get directly converted into a string. <!--T:276--> If we want to add debug logs to our code implementations for our "Join two strings with a space" example function, we can do, in JavaScript: </translate> <syntaxhighlight lang="JavaScript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { Wikifunctions.Debug( `first input is empty "${ Z30000K1 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { Wikifunctions.Debug( `second input is empty "${ Z30000K2 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } Wikifunctions.Debug( "both inputs are fine" ); return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <translate> <!--T:277--> And the same in your Python3 implementation will be: </translate> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": Wikifunctions.Debug( 'first input is empty "'+Z30000K1+'"' ) Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": Wikifunctions.Debug( 'second input is empty "'+Z30000K2+'"' ) Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) Wikifunctions.Debug( 'both inputs are fine' ) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <translate> <!--T:278--> This way, no matter what happens, we will be adding one message to your debugging logs: </translate> * <translate><!--T:279--> If the function call fails when checking on the first or second input, the result of the execution will be a failure, but it will contain one informative log about what branch caused the failure.</translate> * <translate><!--T:280--> If the function call succeeds—because both inputs are valid—the function call will return the joined string, but the returned metadata will also contain a debug log.</translate> <translate> === Debugging your compositions === <!--T:281--> <!--T:282--> To support debugging compositions, Wikifunctions provides the built-in function <tvar name="1">{{Z|Z854}}</tvar>. This function allows you to attach debug messages to the execution of any function call that generates the final output. The debug logs collected during the evaluation are returned as part of the execution metadata, under the <tvar name="2"><code>executorDebugLogs</code></tvar> key. ==== Add debug log to function call (Z854) ==== <!--T:283--> <!--T:284--> The <tvar name="1">{{Z|Z854}}</tvar> function is built-in with ZID <tvar name="2"><code>Z854</code></tvar> and takes two arguments: </translate> * <translate><!--T:285--> '''Function call''' – Any composition you want to execute.</translate> * <translate><!--T:286--> '''Debug log''' – A string message that will be recorded if the given function call is evaluated.</translate> <translate> <!--T:287--> When the wrapped function call runs, the provided message is added to the execution logs. If that function call is not executed, or its execution is not part of the final output, its debug log will not appear in the final result metadata. <!--T:288--> You will benefit from this built-in if you want to observe: </translate> * <translate><!--T:289--> Which branch of a conditional was executed, or</translate> * <translate><!--T:290--> the order of evaluation in a composition.</translate> <translate> ==== Using Add debug log to function call ==== <!--T:291--> <!--T:292--> Say that you want to add debug logs to our example function "Join two strings with a space" or <tvar name="1"><code>Z30000</code></tvar>, so that different messages are added to the different possible outcomes. You could use our debugging builtin like this: </translate> <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), add_debug_log( throw_error( Z30005, ... ), 'failed on first input' ) if( is_empty_string( Z30000K2 ), add_debug_log( throw_error( Z30005, ... ), 'failed on second input' ), add_debug_log( join_with_separator( Z30000K1, Z30000K2, " " ), 'both inputs are ok!' ) ) ) </syntaxhighlight> <translate> <!--T:293--> This way, </translate> * <translate><!--T:294--> when called with an empty first input, the function will return a failed response, and the metadata will contain an <tvar name="1"><code>executorDebugLogs</code></tvar> entry with the "failed on first input" log.</translate> * <translate><!--T:295--> When called with an empty second input, the call will also fail, but the logged message will be "failed on second input"</translate> * <translate><!--T:296--> When called with valid inputs, the function will return a successful response, and additionally the metadata will contain "both inputs are ok" in its <tvar name="1"><code>executorDebugLogs</code></tvar> key.</translate> <translate> <!--T:297--> This is the way this composition would look: </translate> [[File:Add debug log expanded.png|frame|center|alt=<translate><!--T:298--> Composition implementation using Add debug logs to log all possible execution paths</translate>|<translate><!--T:299--> Composition implementation using Add debug logs to log all possible execution paths</translate>]] <translate> === Accessing execution debug logs === <!--T:300--> <!--T:301--> Whether your execution logs are added via <tvar name="1"><code>Wikifunctions.Debug()</code></tvar> or via the <tvar name="2">{{Z|Z854}}</tvar> built-in function, they are returned as part of the response metadata. To see the logs, once you run your function, click on the "Details" button that appears at the bottom of the "Result" section. <!--T:302--> The error and debug information will appear at the top of the "Details" dialog. <!--T:303--> This is what you would see when running the composition from our previous example with valid and invalid inputs: </translate> {| class="wikitable" | [[File:Execution logs success.png|frameless|center|alt=<translate><!--T:304--> Function metadata dialog for a successful execution with debug logs</translate>]] | [[File:Execution logs failure.png|frameless|center|alt=<translate><!--T:305--> Function metadata dialog for a failed execution with debug logs</translate>]] |- | <translate><!--T:306--> Function metadata dialog for a successful execution: shows no errors, but displays the successful execution log: ''"both inputs are ok!"''</translate> | <translate><!--T:307--> Function metadata dialog for a failed execution: shows the error information, and the additional execution log for the first failure branch: ''"failed on first input"''</translate> |} [[Category:How to create implementations| {{#translation:}}]] lucy0h1romw13nrpmwoupkdf0g47epk 331075 331074 2026-10-23T08:23:07Z Ameisenigel 44 Marked this version for translation 331075 wikitext text/x-wiki <languages/> <translate> <!--T:1--> This page provides a more detailed guide to '''creating implementations''', beyond the overview at <tvar name="1">{{ll|Wikifunctions:Introduction}}</tvar>. == Types of Implementations == <!--T:47--> <!--T:48--> In Wikifunctions, an '''implementation''' can take one of two main forms: '''code''' or '''composition'''. A code implementation directly expresses the function’s logic in any of the available programming languages (currently, Python3 or JavaScript). It’s most useful when the function’s behavior can’t easily be built from existing Wikifunctions, or when precise control over data processing is needed. <!--T:49--> A composition implementation, on the other hand, defines the function entirely by combining other existing functions, without writing code. Compositions are easier to understand, reuse, and translate into other languages automatically, but they depend on suitable building blocks already being available and often are less performant. In general, start by checking whether your goal can be achieved through composition; if it can’t, or if performance or fine-grained logic matters, choose a code implementation instead. <!--T:50--> There's a third type of implementation: '''built-ins'''. These are run by system-built code, and are not editable. Most likely all pre-defined functions will have a built-in implementation. In such cases, when opening the implementation page, you will see a message stating ''"<tvar name="1">{{int|wikilambda-implementation-selector-none}}</tvar>"'' == Practice Test-Driven Development == <!--T:51--> <!--T:52--> '''Test-Driven Development''', or '''TDD''', is a way of creating software where you write tests before you write the actual code. Tests are just a way of understanding what your function is supposed to do by listing examples and how they should work. <!--T:53--> In Wikifunctions, writing tests first offers significant benefits. If you are working on an implementation, you can run your code against the existing tests to check that it behaves as expected. This makes it easier to catch errors early before even publishing your implementation. Tests are also a powerful way to describe the function you need. By writing tests, '''you clearly communicate the expected behavior''', and the community can step in and help with the implementation, or create alternative implementations. <!--T:54--> Imagine you want to implement a Function that combines two strings with a space in between. A basic test for this might look like: </translate> <syntaxhighlight lang="prolog"> join_with_space( "Hello", "world" ) => "Hello world" </syntaxhighlight> <translate> <!--T:55--> Once you have defined the basic behavior, it's important to '''think about edge cases'''—situations where the inputs are such that you might need some special behavior. <!--T:56--> For example, what if your first string ends in a space, or your second string starts with a space? Should the function keep all existing spaces and add another one, or should it return a neatly spaced result with just a single space between the words? Depending on your requirements, you should build a test for such a case. For example, a test for this edge case could be either one of these — but not both!: </translate> <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> <translate> <!--T:57--> or ... </translate> <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> <translate> <!--T:58--> Make sure that all possible special cases are covered by your tests, and once you have them, make sure that they are all connected to the Function by selecting them and clicking "Connect". == Code implementations == <!--T:59--> </translate> [[File:Code implementation.png|thumb|alt=<translate><!--T:60--> Wikifunctions code editor initialized with a function template</translate>|<translate><!--T:61--> When adding a new code implementation, the function template is initialized with the function and argument names</translate>]] <translate> <!--T:62--> When creating an implementation using code, the Wikifunctions UI will set up a code editor with the selected language activated for syntax highlighting and validation. When the function to implement and the programming language are selected, this editor will be set with the correct function template: '''do not remove or edit this'''! Keep your code inside this function signature: if you need auxiliary functions, you can simply declare them inside your top-level function declaration. === Using input types in your code === <!--T:63--> <!--T:64--> Wikifunctions types <tvar name="1">{{Z|Z6}}</tvar> and <tvar name="2">{{Z|Z40}}</tvar> can be used as if they were native types in both JavaScript and Python3. For example, a String input can be concatenated or a Boolean be directly used in a logical expression. To use other types in your code implementations, you will have to look deeper into the type, figure out if it has a conversion to a native equivalent, and treat it accordingly. <!--T:65--> For example, let's say we want to write some Python code that handles an input of type <tvar name="1">{{Z|Z20420}}</tvar>. In the page for this type, let's look at its "type converters to code" and search for a Python one. The converter <tvar name="2">{{Z|Z20424}}</tvar> will be applied to our date input before our code, so looking at "native type" we know that our input will be a Python ''dict'' and looking at the implementation we can see the keys we can expect: </translate> <syntaxhighlight lang="python3"> return { 'K1': year, 'K2': month, 'K3': day } </syntaxhighlight> <translate> <!--T:66--> When a type doesn't have a converter, you'll have to access its parts directly using its keys. For example, let's assume that your function <tvar name="1"><code>Z30000</code></tvar> has one input <tvar name="2"><code>Z30000K1</code></tvar> of type <tvar name="3">{{Z|Z11}}</tvar>. This type has two keys: <tvar name="4"><code>Z11K1</code></tvar> for the language (itself an object of type <tvar name="5">{{Z|Z60}}</tvar>), and <tvar name="6"><code>Z11K2</code></tvar> for the string value. Similarly, the language object has a key <tvar name="7"><code>Z60K1</code></tvar> for the language code. So, to get a string with the language code and the text, you can write: </translate> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1 ) { // <translate nowrap><!--T:308--> e.g. "en: some text"</translate> return Z30000K1.Z11K1.Z60K1 + ": " + Z30000K1.Z11K2; } </syntaxhighlight> <translate> <!--T:67--> For a quick reference of the available type conversions visit [[<tvar name="1">Special:MyLanguage/Wikifunctions:Execution targets#Default type conversion</tvar>|the default type conversion table]]. === Returning the right outputs === <!--T:68--> <!--T:69--> Similarly to the way you treat inputs, outputs need to match the type specified in the function definition. Some can be treated as simply as native types, so any string output will be converted into a Wikifunctions <tvar name="1">{{Z|Z6}}</tvar> object and any native boolean returned by your implementation will be converted into a Wikifunctions <tvar name="2">{{Z|Z40}}</tvar> object. <!--T:70--> Those types that have "type converters from code" will apply the appropriate function to the output, in order to build the required type. Following the example of <tvar name="1">{{Z|Z20420}}</tvar>, the <tvar name="2">{{Z|Z20443}}</tvar> will transform the output from your implementation–a dict with K1, K2 and K3 keys–into its correct ZObject representation. <!--T:71--> For types that don't have converters from code, you can carefully build and return the output objects. For example, imagine that our function <tvar name="1"><code>Z30000</code></tvar> takes two string inputs: language code and text, and should return a <tvar name="2">{{Z|Z11}}</tvar> object. You can do this in Python by using the <tvar name="3"><code>ZObject</code></tvar> constructor: </translate> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): lang_object = ZObject( {"Z1K1": "Z9", "Z9K1": "Z60"}, Z60K1 = Z30000K1 ) return ZObject( {"Z1K1": "Z9", "Z9K1": "Z11"}, Z11K1 = lang_object, Z11K2 = Z30000K2 ) </syntaxhighlight> <translate> <!--T:72--> Or in JavaScript: </translate> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { const langObject = new ZObject( new Map( [ [ "Z60K1", Z30000K1 ] ] ), { "Z1K1": "Z9", "Z9K1": "Z60" } ); const monolingualKeys = new Map( [ [ "Z11K1", langObject ], [ "Z11K2", Z30000K2 ] ] ); return new ZObject( monolingualKeys, { "Z1K1": "Z9", "Z9K1": "Z11" } ); } </syntaxhighlight> <translate> <!--T:73--> You can learn more about the <tvar name="1"><code>ZObject</code></tvar> class and other useful constructors in <tvar name="2">{{ll|Wikifunctions:Execution_targets#Custom_and_non-built-in_type_conversion}}</tvar> </translate>{{phab|T392750}}<translate> <!--T:317--> As of 2026-05, trying to return a list of lists may fail, so you're not able to implement such functions in code. === Code in Python === <!--T:74--> <!--T:3--> In this section, we give a concrete example on how to create an implementation in the form of Code in Python. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is Z30000. <!--T:5--> The implementation is defined using the ZID of the function. So are the arguments of the function. So in the case of the function Z30000 with its two arguments, the function template should look like this: </translate> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): </syntaxhighlight> <translate> <!--T:75--> As we described before, we know that the arguments (<tvar name="1"><code>Z30000K1</code></tvar> and <tvar name="2"><code>Z30000K2</code></tvar>) are Strings, so we can treat them as simply as we use native strings in Python. Also, the function should return a String. For our example, we simply return the two arguments concatenated with a space in between: </translate> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <translate> <!--T:9--> Since this is Python, do not forget to indent this line. <!--T:76--> If you have followed our advice to [[<tvar name="1">#Practice Test-Driven Development</tvar>|practice TDD]], you will already have a set of tests that you know should work. If that's the case, while building your implementation you can click on the circular arrow in the Tests panel, and see if your implementation passes all of them. <!--T:11--> Remember that the runtime has no state. Don’t assume values for global or static variables. If you have further questions about what you can and cannot do in Python, ask on <tvar name="1">[[Wikifunctions:Python implementations]]</tvar>. === Code in JavaScript === <!--T:77--> <!--T:13--> In this section, we give a concrete example on how to create an implementation in the form of Code in JavaScript. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is <tvar name="1"><code>Z30000</code></tvar>. <!--T:15--> The implementation is defined using the ZID of the function. So are the arguments of the function. So in the case of the function <tvar name="1"><code>Z30000</code></tvar> with its two arguments, the function template should look like this: </translate> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { } </syntaxhighlight> <translate> <!--T:78--> We know that the arguments (<tvar name="1"><code>Z30000K1</code></tvar> and <tvar name="2"><code>Z30000K2</code></tvar>) are Strings, so we can treat them as native strings in JavaScript. Also, the function should return a String. To complete our function, you can then add a line concatenating the input strings, like this: </translate> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <translate> <!--T:79--> If you have tests as recommended in the [[<tvar name="1">#Practice Test-Driven Development</tvar>|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes all of them. <!--T:21--> Remember that the runtime has no state. Don’t assume values for global or static variables. If you have further questions about what you can and cannot do in JavaScript, ask on <tvar name="1">[[Wikifunctions:JavaScript implementations]]</tvar>. === Calling another Wikifunctions function === <!--T:318--> <!--T:319--> A code implementation can call certain other Wikifunctions functions, receive the output of the call, and use that output in further processing. We refer to such calls as callbacks. At present, due to security and performance concerns, only the following built-in Wikidata fetch and search functions can be called in this way: <tvar name="1">{{Z|Z6820}}</tvar>, <tvar name="2">{{Z|Z6821}}</tvar>, <tvar name="3">{{Z|Z6822}}</tvar>, <tvar name="4">{{Z|Z6824}}</tvar>, <tvar name="5">{{Z|Z6825}}</tvar>, <tvar name="6">{{Z|Z6826}}</tvar>, <tvar name="7">{{Z|Z6830}}</tvar>, and <tvar name="8">{{Z|Z6831}}</tvar>. This capability is in an initial stage of deployment; we hope to allow calls to a broader range of functions in the future. <!--T:320--> Let’s look at a JavaScript implementation containing a callback. This implementation fetches an item from Wikidata, extracts the label of that item in a given language, and returns the label string. The item to fetch is given by argument <tvar name="1"><code>Z400K1</code></tvar>, and the language is given by <tvar name="2"><code>Z400K2</code></tvar>. </translate> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const item = Wikifunctions.Call('Z6821', Z400K1); for (const label of item.Z6001K2.Z12K1) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <translate> <!--T:321--> A callback is made by calling <tvar name="1"><code>Wikifunctions.Call</code></tvar>, as shown in the example. The first argument to <tvar name="1"><code>Wikifunctions.Call</code></tvar> is always the ZID of the function to be called – in this case, <tvar name="2">{{Z|Z6821}}</tvar>, which takes a single argument. Following that, the arguments to be passed to that function are listed, separated by commas. Here, that argument, <tvar name="3"><code>Z400K1</code></tvar>, is the same value that was passed to the function <tvar name="4"><code>Z400</code></tvar>. This is a common pattern of argument passing to callbacks, but their arguments can also be built using the <tvar name="5"><code>ZObject</code></tvar> constructor (as explained above), or obtained in other ways. <!--T:322--> The value of <tvar name="1"><code>Z400K1</code></tvar> would be an instance of <tvar name="2">{{Z|Z6091}}</tvar>, containing the QID of the item to be fetched. Line 2 of the example calls <tvar name="3"><code>Z6821</code></tvar> to fetch that item from Wikidata and assigns the resulting ZObject to the const <tvar name="4"><code>item</code></tvar>. The remaining code iterates over the item’s labels until it finds the one matching the language given by <tvar name="5"><code>Z400K2</code></tvar>. <!--T:323--> For the first example above, we have used <tvar name="1"><code>Z6821</code></tvar> for simplicity. However - unless an entire entity is needed by the implementation, it is strongly recommended to use <tvar name="2"><code>Z6820</code></tvar> to retrieve Wikidata items, which can be quite large. Although a call to <tvar name="2"><code>Z6820</code></tvar> is a bit more complex, its parameters allow for fetching selected portions of a Wikidata item, which can greatly improve performance and avoid some errors, by reducing the network bandwidth and processing time that are needed. (<tvar name="2"><code>Z6820</code></tvar> can also be used in place of <tvar name="3"><code>Z6822</code></tvar>, <tvar name="4"><code>Z6824</code></tvar>, <tvar name="5"><code>Z6825</code></tvar>, and <tvar name="6"><code>Z6826</code></tvar>, to get similar bandwidth-reduction benefits.) <!--T:324--> Just below we show how <tvar name="1"><code>Z6820</code></tvar> can be used, in <tvar name="2"><code>Wikifunctions.Call</code></tvar>, to implement the same behavior as above. Note that we use the second argument passed to <tvar name="1"><code>Z6820</code></tvar>, <tvar name="3"><code>[labelsPart]</code></tvar>, to say “Just return the item’s labels”, and we use the third argument, <tvar name="4"><code>[Z400K2]</code></tvar>, to say “Just return labels in the given language”. (This argument would also apply to aliases and descriptions, if they were included in the result.) </translate> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const labelsPart = new ZObject( new Map( [ ['Z6030K1', new ZReference('Z6033')] ] ), {Z1K1: 'Z9', Z9K1: 'Z6030'} ); const entities = Wikifunctions.Call( 'Z6820', [Z400K1], [labelsPart], [Z400K2], []); const item = entities.get(Z400K1.Z6091K1); const labels = item.Z6001K2.Z12K1; for (const label of labels) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <translate> <!--T:325--> Other things to note: </translate> * <translate><!--T:326--> Even though code implementations are now able to fetch Wikidata entities, it is recommended that they not be written to return ''entire'' entities. This is because of current limitations on the size of the value returned from a code implementation. To fetch and return an entire large entity, it’s better to call the fetch function from a composition.</translate> * <translate><!--T:327--> Only one callback can execute at a time. For security reasons, it is not possible to use the concurrency features of JavaScript or Python to execute multiple callbacks in parallel.</translate> ** <translate><!--T:328--> Keep in mind, however, that you can fetch multiple entities at once using Z6820.</translate> * <translate><!--T:329--> There is currently a 3 MiB limit on the size of Wikidata content that can be returned to a code implementation, by a single callback. The same limit applies to the size of the result returned from a code implementation.</translate> <translate> == Compositions == <!--T:22--> <!--T:23--> In this section, we give a concrete example on how to create an implementation in the form of a composition. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is <tvar name="1"><code>Z30000</code></tvar>. <!--T:24--> It is usually a good idea to first think about how to combine existing functions in order to create the desired output. Sometimes this might be trivial, and you can just go ahead with composing functions, but in many cases it is worthwhile to note the desired composition down. <!--T:25--> For example, for the given Function, we could use the existing Function <tvar name="1">{{Z|Z10000}}</tvar>. That Function takes two strings and makes one string out of them. But we need to add a space in between. So we first concatenate a space to the end of the first string, and then concatenate the second string to the result of that first concatenation. So our composition could be noted down like this: </translate> <syntaxhighlight lang="prolog"> join_strings( join_strings( Z30000K1, " " ), Z30000K2 ) </syntaxhighlight> <translate> <!--T:80--> There are multiple ways to write a composition: notice that the same thing could be accomplished with: </translate> <syntaxhighlight lang="prolog"> join_strings( Z30000K1, join_strings( " ", Z30000K2 ) ) </syntaxhighlight> <translate> <!--T:81--> An alternative implementation could also use the existing Function <tvar name="1">{{Z|Z15175}}</tvar>, so your composition could be: </translate> <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> <translate> <!--T:82--> As you can see, there are multiple ways to accomplish this, so take your time and explore the existing functions available in the <tvar name="1">{{ll|Wikifunctions:Catalogue}}</tvar>. <!--T:83--> Let's try to create the second example, <tvar name="1"><code>join_strings(Z30000K1, join_strings(" ", Z30000K2))</code></tvar>. <!--T:84--> In order to create this: </translate> # <translate><!--T:85--> Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page.</translate> # <translate><!--T:86--> Make sure that the option "composition" under "Implementation" is selected.</translate> # <translate><!--T:87--> Click on the "›" icon or click the "Select Function" link to expand the function details.</translate> # <translate><!--T:88--> Under "function" search for the name of the outermost function you want to use, which in this example is "join two strings". Then, select the wanted function from the dropdown list.</translate> # <translate><!--T:89--> You will see two new fields, one for each of the arguments needed for the selected function.</translate> # <translate><!--T:90--> For the first argument, we want to select the first input to our function:</translate> ## <translate><!--T:91--> Next to "first string", click on the "…" button and select "Argument reference".</translate> ## <translate><!--T:92--> Under "key id" you can now select the first string of your function from the dropdown, which contains all available inputs.</translate> # <translate><!--T:93--> For the second argument, we want to use the result of another call to "join two strings":</translate> ## <translate><!--T:94--> Next to "second string", click on the "…" button and select "Function call".</translate> ## <translate><!--T:95--> Under "function", search and select the function you want to call, which is again "join two strings".</translate> ## <translate><!--T:96--> For this inner function call, configure the "first string" by simply typing a white space in the text field, and configure the "second string" as you did for step 6: change it using the "…" button to "Argument reference", and then select the second argument in the dropdown.</translate> <translate> <!--T:97--> Your composition is now complete! <!--T:98--> You can expand and collapse the details using the chevron buttons to see how it looks. If you already have Tests as recommended in the [[<tvar name="1">#Practice Test-Driven Development</tvar>|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes the tests. Once your composition passes the tests, go ahead and publish it. </translate> [[File:Composition implementation expanded.png|frame|center|alt=<translate><!--T:99--> A Wikifunctions composition implementation in its expanded view</translate>|<translate><!--T:100--> A Wikifunctions composition implementation in its expanded view</translate>]] [[File:Composition implementation collapsed.png|frame|center|alt=<translate><!--T:101--> A Wikifunctions composition implementation in its collapsed view</translate>|<translate><!--T:102--> A Wikifunctions composition implementation in its collapsed view</translate>]] <translate> == Wikifunctions error handling == <!--T:103--> <!--T:104--> As a Wikifunctions function creator, you might want to warn the user calling your function when something goes wrong in the code, or when their inputs do not fit a certain criteria. For example, if your Function expects a string input to contain a name, you might want to check that the name is not empty and, if it is, show an error message that the person using your Function can understand. <!--T:105--> For this purpose, you can use <tvar name="1"><code>Wikifunctions.Error()</code></tvar> from your code implementations or the function <tvar name="2">{{Z|Z851}}</tvar> from your compositions. <!--T:106--> In this section you will learn: </translate> * <translate><!--T:107--> How to throw errors from both code and composition implementations,</translate> * <translate><!--T:108--> how to write tests for error cases, and</translate> * <translate><!--T:109--> how to catch and handle errors thrown by functions that you are using in your compositions.</translate> <translate> === Throwing errors from code implementations === <!--T:110--> <!--T:111--> When writing code, both from JavaScript and Python, you can use <tvar name="1"><code>Wikifunctions.Error()</code></tvar> to end the execution with a wanted error. <!--T:112--> <tvar name="1"><code>Wikifunctions.Error()</code></tvar> has two parameters: </translate> # <translate><!--T:113--> Error type: a string containing the ZID of the error type you want to return.</translate> # <translate><!--T:114--> Error arguments: a list of string arguments to build the error.</translate> <translate> <!--T:115--> Let's go one by one: ==== Error type ==== <!--T:116--> <!--T:117--> An error type is an object that describes a kind of error that could happen in the system. There are a number of built-in error types but you can also build other error types that are more suited to your use case. When using errors, the best idea is to browse through the available error types, which can be explored in [[<tvar name="1">Special:ListObjectsByType/Z50</tvar>|this list]]. <!--T:118--> If there are no errors that fit your case, create a new one by going to the create page, and selecting "Error type" in the type selector. Then, set the necessary fields: </translate> [[File:Error type.png|thumb|alt=<translate><!--T:119--> Error type creation in Wikifunctions</translate>|<translate><!--T:120--> To create new Error type (Z50), edit the label and add the necessary keys.</translate>]] * <translate><!--T:121--> '''Label''' – This is the main title of the error, which should contain a short but descriptive message. Set the error label on the right-side box titled "About".</translate> * <translate><!--T:122--> '''Keys''' – Keys contain additional information about what caused the error. For example, if an input had the wrong format, you might want to inform the user of what was the input content when raising the error. To use them in your implementations, keys should be strings. To create a key, click on the "[+]" icon below "keys", select "String" under "value type", and add a label that describes it appropriately, for example "current input". Once you have all the necessary keys, you can Publish your error type and keep the ID of the newly created object.</translate> * <translate><!--T:330--> '''Error message''' – Error types can contain a multilingual array of HTML parametrized error messages. The parameter notation is $1, $2, etc., where the digit corresponds to the error type key. For example, when creating an error type with one string key "current input", the error message can use the positional parameter "$1", which will be replaced with the value of the "current input" key at the time of rendering the error. To add HTML messages, click on the "[+]" icon below "html fragments", select a language and input the HTML string.</translate> <translate> ==== Error arguments ==== <!--T:123--> <!--T:124--> Error arguments correspond to the keys of the Error type, and they should provide additional information to understand the error. Error arguments should always be Strings. ==== Using Wikifunctions.Error() ==== <!--T:125--> <!--T:126--> Say that you want an error to be thrown when either your first or your second input are empty. You have already created the error type, and the assigned ZID was <tvar name="1"><code>Z30005</code></tvar>. Your error type has two string keys: </translate> * <translate><!--T:127--> Input key: contains the key of the failing input</translate> * <translate><!--T:128--> Input value: contains the current value of the failing input</translate> <translate> <!--T:129--> To raise an error in your JavaScript implementation you should do something like this: </translate> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { // <translate nowrap><!--T:309--> If the first input is empty, raise error <tvar name="1">Z30005</tvar></translate> // <translate nowrap><!--T:310--> with two string args: [ first input key, first input value ]</translate> Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { // <translate nowrap><!--T:311--> If the second input is empty, raise error <tvar name="1">Z30005</tvar></translate> // <translate nowrap><!--T:312--> with two string args: [ second input key, second input value ]</translate> Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <translate> <!--T:130--> To raise an error in your Python implementation you should do something like this: </translate> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": # <translate nowrap><!--T:313--> If the first input is empty, raise error <tvar name="1">Z30005</tvar></translate> # <translate nowrap><!--T:314--> with two string args: [ first input key, first input value ]</translate> Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": # <translate nowrap><!--T:315--> If the second input is empty, raise error <tvar name="1">Z30005</tvar></translate> # <translate nowrap><!--T:316--> with two string args: [ first input key, first input value ]</translate> Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <translate> <!--T:131--> Remember that calling <tvar name="1"><code>Wikifunctions.Error()</code></tvar> ends the execution! === Throwing errors from compositions === <!--T:132--> <!--T:133--> If you are creating a composition implementation, you can throw an error by calling the special function <tvar name="1">{{Z|Z851}}</tvar>. ==== Throw Error function (Z851) ==== <!--T:134--> <!--T:135--> The <tvar name="1">{{Z|Z851}}</tvar> function is similar to the <tvar name="2"><code>Wikifunctions.Error()</code></tvar> method and takes two arguments: </translate> * <translate><!--T:136--> '''Error type''' – A reference to the Error type you want to raise</translate> * <translate><!--T:137--> '''Error parameters''' – A list with the arguments to create your Error, which should also be Strings.</translate> <translate> ==== Using Throw Error ==== <!--T:138--> <!--T:139--> Say you want to modify your composition so that it first checks that the arguments are not empty, and raises an error when it finds an empty one. Then, if none of them are empty, it runs the original composition, which is: </translate> <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> <translate> <!--T:140--> To do this, you need to create conditional paths, for which you can use the <tvar name="1">{{Z|Z802}}</tvar> function. Think of it like this: </translate> * <translate><!--T:141--> If the first argument is empty, throw an error for the first argument</translate> * <translate><!--T:142--> Else, proceed to check the second argument</translate> * <translate><!--T:143--> If the second argument is empty, throw an error for the second argument</translate> * <translate><!--T:144--> Else, proceed with the success path and return the joint strings with the space separator</translate> <translate> <!--T:145--> Or in functional pseudo code: </translate> <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), throw_error( Z30005, [ "Z30000K1", Z30000K1 ] ), if( is_empty_string( Z30000K2 ), throw_error( Z30005, [ "Z30000K2", Z30000K2 ] ), join_with_separator( Z30000K1, Z30000K2, " " ) ) ) </syntaxhighlight> <translate> <!--T:146--> Let's create this step by step: </translate> # <translate><!--T:147--> Start adding an implementation by clicking on the "+” button in the "Implementations" table from your Function page.</translate> # <translate><!--T:148--> Make sure that the option "composition" under "Implementation" is selected.</translate> # <translate><!--T:149--> Click on the "›” icon or click the "Select Function" link to expand the function details.</translate> # <translate><!--T:150--> Under "function" search and select the outermost function you want to use, which in this case is "if".</translate> # <translate><!--T:151--> Check the validity of the first argument:</translate> ## <translate><!--T:152--> Next to "condition", click on the "…" button and select "function call"</translate> ## <translate><!--T:153--> Under "function", search and select the function "is empty string"</translate> ## <translate><!--T:154--> Next to "input", click on the "…" button and select "argument reference"</translate> ## <translate><!--T:155--> Under "key id", select the first input (e.g. "first string")</translate> ## <translate><!--T:156--> You can now collapse the "condition" function call if you want, by clicking on the down-chevron next to "condition". You should see something like "f(x) is empty string( → first string )"</translate> # <translate><!--T:157--> Throw error if the condition is true:</translate> ## <translate><!--T:158--> Next to "then", click on the "…" button and select "function call"</translate> ## <translate><!--T:159--> Under "function", search and select the function "Throw Error"</translate> ## <translate><!--T:160--> Under "error type", search and select your error type (you can directly input the error ID if you know it, e.g. Z30005)</translate> ## <translate><!--T:161--> Under "error parameters", add two items by clicking on the "+" button</translate> ## <translate><!--T:162--> For "Item 1" (offending argument key), set its type to "String" and write the argument identifier (e.g. "first input", or "Z30000K1")</translate> ## <translate><!--T:163--> For "Item 2" (offending argument value), click on the "…" next to "Item 2" and select "argument reference"</translate> ## <translate><!--T:164--> Under "key id", select the first input (e.g. "first string")</translate> ## <translate><!--T:165--> You can now collapse the "then" function call if you want, by clicking on the down-chevron next to "then". You should see something like "f(x) Throw Error( Input was the wrong format, Typed list( Object, "first input", → first string ) )"</translate> # <translate><!--T:166--> Continue to check the second argument if the first was good:</translate> ## <translate><!--T:167--> Next to "else", click on the "…" button and select "function call"</translate> ## <translate><!--T:168--> Under "function", search and select the function "if"</translate> ## <translate><!--T:169--> Set up "condition" to check the validity of the second argument by following the same process as described in step 5.</translate> ## <translate><!--T:170--> Set up "then" to throw an error for the second argument by following the same process as described in step 6.</translate> # <translate><!--T:171--> Finally, set up the success path:</translate> ## <translate><!--T:172--> Next to the nested "else", click on the "…" button and select "function call"</translate> ## <translate><!--T:173--> Under "function", search and select the successful function, which in this case can be "join strings with separator"</translate> ## <translate><!--T:174--> Next to "first string", click on the "…" button and set it to "argument reference", then select "first string"</translate> ## <translate><!--T:175--> Next to "second string", click on the "…" button and set it to "argument reference", then select "second string"</translate> ## <translate><!--T:176--> Under "separator" add a space into the text field</translate> <translate> <!--T:177--> The resulting function call should look like this: </translate> [[File:Throw error expanded.png|frame|center|alt=<translate><!--T:178--> Wikifunctions composition using Throw Error function</translate>|<translate><!--T:179--> Wikifunctions composition using Throw Error function</translate>]] [[File:Throw error collapsed.png|frame|center|alt=<translate><!--T:180--> Wikifunctions composition using Throw Error function, in its collapsed view</translate>|<translate><!--T:181--> Wikifunctions composition using Throw Error function, in its collapsed view</translate>]] <translate> === Handling errors in compositions === <!--T:182--> <!--T:183--> While it is useful to allow functions to raise expected errors, it is crucial to be able to handle errors in your compositions in order to safely use these functions. <!--T:184--> Say you want to create a new function "full name of a person" – we will refer to it with the ZID <tvar name="1"><code>Z30010</code></tvar>. This function should return the full name of a person given a first and last names, but if any of the two fields are empty, it should return the text "Unknown" instead. <!--T:185--> You could create a composition using our example function "Join two strings with a space" or <tvar name="1"><code>Z30000</code></tvar> to generate the name. If any of the inputs are empty, you know that <tvar name="1"><code>Z30000</code></tvar> will throw an error of type <tvar name="2"><code>Z30005</code></tvar>. Using the function <tvar name="3">{{Z|Z850}}</tvar> as a wrapper, you can attempt the join operation and intercept a possible error to simply return "Unknown" whenever it occurs. ==== Try-Catch function (Z850) ==== <!--T:186--> <!--T:187--> The <tvar name="1">{{Z|Z850}}</tvar> function is built-in with ZID <tvar name="2"><code>Z850</code></tvar> and takes three arguments: </translate> * <translate><!--T:188--> '''Function call''' – The initial function call to run. If nothing goes wrong, the response will be the result of this function call.</translate> * <translate><!--T:189--> '''Error type''' – An error type to catch in case it is thrown during the execution of the first function call.</translate> * <translate><!--T:190--> '''Error handler''' – A function call that will be run in case the error specified above is caught during the execution of the initial function call. If that happens, the result of the error handler will be the value returned.</translate> <translate> ==== Using Try-Catch ==== <!--T:191--> <!--T:192--> Once we have all the functions for our composition, we can craft it like this: </translate> <syntaxhighlight lang="prolog"> try_catch( join_with_space( Z30010K1, Z30010K2 ), Z30005, echo( "Unknown" ) ) </syntaxhighlight> <translate> <!--T:193--> This means that: </translate> * <translate><!--T:194--> The "Join two strings with a space" function will be tried with the two inputs and, if everything goes well, the output of this function will be returned</translate> * <translate><!--T:195--> If any of the inputs are blank, "Join two strings with a space" with raise an error of type <tvar name="1"><code>Z30005</code></tvar></translate> * <translate><!--T:196--> Our <tvar name="1">{{Z|Z850}}</tvar> will then detect this error and run the <tvar name="2">{{Z|Z801}}</tvar> function to return "Unknown"</translate> <translate> <!--T:197--> Let's create this step by step: </translate> # <translate><!--T:198--> Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page.</translate> # <translate><!--T:199--> Make sure that the option "composition" under "Implementation" is selected.</translate> # <translate><!--T:200--> Click on the "›” icon or click the "Select Function" link to expand the function details.</translate> # <translate><!--T:201--> Under "function" search and select the outermost function you want to use, which in this case is "Try-Catch".</translate> # <translate><!--T:202--> Set the main function call:</translate> ## <translate><!--T:203--> Under the field where the "Try-Catch" function is selected, next to the "function call" key, click on the "…" button and select "function call"</translate> ## <translate><!--T:204--> Under "function" search and select the function "join two strings with space"</translate> ## <translate><!--T:205--> Next to "first string", click on the "…" button and select "argument reference", then select the "first name" argument from the dropdown.</translate> ## <translate><!--T:206--> Next to "second string", click on the "…" button and select "argument reference", then select the "second name" argument from the dropdown.</translate> # <translate><!--T:207--> Select the error to catch:</translate> ## <translate><!--T:208--> Under "error type", search and select "bad string input" – you can search directly by its ZID <tvar name="1"><code>Z30005</code></tvar></translate> # <translate><!--T:209--> Set the error handler function call:</translate> ## <translate><!--T:210--> Next to "error handler", click on the "…" button and select "function call"</translate> ## <translate><!--T:211--> Under "function", search and select the function "echo"</translate> ## <translate><!--T:212--> Under "input" and "type", search and select the type "String"</translate> ## <translate><!--T:213--> Now, under "input", type "Unknown" in the text field</translate> <translate> <!--T:214--> The resulting function should look like this: </translate> [[File:Try catch expanded.png|frame|center|alt=<translate><!--T:215--> Wikifunctions composition using Try-catch function, in expanded mode</translate>|<translate><!--T:216--> Wikifunctions composition using Try-catch function, in expanded mode</translate>]] [[File:Try catch collapsed.png|frame|center|alt=<translate><!--T:217--> Wikifunctions composition using Try-catch function, in collapsed mode</translate>|<translate><!--T:218--> Wikifunctions composition using Try-catch function, in collapsed mode</translate>]] <translate> === Testing your failure use cases === <!--T:219--> <!--T:220--> As we introduced in the above section about [[<tvar name="1">#Practice Test-Driven Development</tvar>|practicing TDD]], it's important to test not only the most common paths, but also the possible edge cases. It is equally important to test failure behavior. In this section we will give you the tools necessary to test that your function fails with a given set of inputs, and that the error thrown is the expected one. <!--T:221--> To do that, you will need other two system functions: ==== Is error type (Z852) ==== <!--T:222--> <!--T:223--> The <tvar name="1">{{Z|Z852}}</tvar> function is built-in with ZID <tvar name="2"><code>Z852</code></tvar> and takes two arguments: </translate> * <translate><!--T:224--> '''Error''' – An <tvar name="1">{{Z|Z5}}</tvar> object, which can be thrown by a failing call. An error instance has a type and a value.</translate> * <translate><!--T:225--> '''Error type''' – A reference to an <tvar name="1">{{Z|Z50}}</tvar> which will be compared to the type of the Error passed as a first argument. If that's the case, the function will return true.</translate> <translate> ==== Get error thrown by function call (Z853) ==== <!--T:226--> <!--T:227--> The <tvar name="1">{{Z|Z853}}</tvar> function is built-in with ZID <tvar name="2"><code>Z853</code></tvar> and takes one argument: </translate> * <translate><!--T:228--> '''Function call''' – A function call which can either return a successful value of any type, or throw an error.</translate> <translate> <!--T:229--> This function returns a <tvar name="1">{{Z|Z882}}</tvar> with a <tvar name="2">{{Z|Z40}}</tvar> in first place and an <tvar name="3">{{Z|Z1}}</tvar> in the second: </translate> * <translate><!--T:230--> If the Function call runs successfully and hence does not throw any error, the returned pair will contain False in the first place, and void in the second.</translate> * <translate><!--T:231--> If the Function call throws an error, the returned pair will contain True in the first place, and the caught error in the second.</translate> <translate> <!--T:232--> To use this function in your compositions, you might need to use the additional functions: </translate> * <translate><!--T:233--> <tvar name="1">{{Z|Z821}}</tvar>, and</translate> * {{Z|Z822}} <translate> ==== Testing errors ==== <!--T:234--> <!--T:235--> Say our target function, "Join two strings with a space" or <tvar name="1"><code>Z30000</code></tvar>, throws an error of type <tvar name="2"><code>Z30005</code></tvar> and we want to test this behavior. To do that we need to: </translate> * <translate><!--T:236--> Throw a failing function call</translate> * <translate><!--T:237--> Get the error using the function <tvar name="1">{{Z|Z853}}</tvar></translate> * <translate><!--T:238--> Check that the error is the right type with <tvar name="1">{{Z|Z852}}</tvar></translate> <translate> <!--T:239--> Tests have two fields: </translate> * <translate><!--T:240--> '''Call''' – A function call that will produce an output with the inputs you want to test. This call will return a value.</translate> * <translate><!--T:241--> '''Result validation''' – A function call that will validate that the value returned by the call above is the expected one. The first argument of this function call will be automatically assigned to take the return value of the first call.</translate> <translate> <!--T:242--> For step-by-step instructions on how to create tests, see <tvar name="1">{{ll|Wikifunctions:Introduction#Create_tests}}</tvar>. <!--T:243--> In our example, we can structure it like this — but this is not the only way! <!--T:244--> The call, which will return an <tvar name="1">{{Z|Z5}}</tvar> object: </translate> <syntaxhighlight lang="prolog"> error = get_second_element_of_typed_list( get_error_thrown_by( join_strings_by_whitespace( "", "not empty" ) ) ) </syntaxhighlight> <translate> <!--T:245--> And the result validation, which will take the <tvar name="1">{{Z|Z5}}</tvar> object as its first argument: </translate> <syntaxhighlight lang="prolog"> is_error_type( error, Z30005 ) </syntaxhighlight> <translate> <!--T:246--> Let's do this step by step: </translate> # <translate><!--T:247--> Start adding a test by clicking on the "+" button in the "Tests" table from your Function page. The "call" and "result validation" fields already have some functions pre-set, but to test the errors we will need to change them.</translate> # <translate><!--T:248--> First, let's set the call:</translate> ## <translate><!--T:249--> Under "call", click the "›" chevron button to expand the function call.</translate> ## <translate><!--T:250--> Under "function", edit the field and search and select the function "Get second element of a typed pair"</translate> ## <translate><!--T:251--> Once selected, next to "Typed pair", click on the "…" button and select "function call"</translate> ## <translate><!--T:252--> Under "function", search and select the function "Get error thrown by function call"</translate> ## <translate><!--T:253--> Next to "function call", click on the "…" button and select "function call"</translate> ## <translate><!--T:254--> Under "function", search and select the function "Join two strings with a space" (or by ZID <tvar name="1"><code>Z30000</code></tvar>)</translate> ## <translate><!--T:255--> Now set the inputs so that they cause a failure: at least one of them should be empty.</translate> ## <translate><!--T:256--> You can now collapse your "call" by clicking again on the down-chevron button if you want!</translate> # <translate><!--T:257--> Next, let's set the result validation:</translate> ## <translate><!--T:258--> Under "result validation", click the "›" chevron button to expand the function call.</translate> ## <translate><!--T:259--> Under "function", edit the field and search and select the function "Is error type"</translate> ## <translate><!--T:260--> Now you will only be asked to configure the second argument. Under "error type", search and select your <tvar name="1"><code>Z30005</code></tvar> error type.</translate> # <translate><!--T:261--> And you are done! You can now click the circular arrow in the "Implementations" box and you should see green checks.</translate> <translate> <!--T:262--> If everything went right, you can now save your test. It should look like this: </translate> [[File:Get error expanded.png|frame|center|alt=<translate><!--T:263--> Testing a failure using Get error and Is error type functions, in expanded mode</translate>|<translate><!--T:264--> Testing a failure using Get error and Is error type functions, in expanded mode</translate>]] [[File:Get error collapsed.png|frame|center|alt=<translate><!--T:265--> Testing a failure using Get error and Is error type functions, in collapsed mode</translate>|<translate><!--T:266--> Testing a failure using Get error and Is error type functions, in collapsed mode</translate>]] <translate> === Creating actionable error messages === <!--T:331--> <!--T:332--> As described above, Error Types have an optional key <tvar name="1"><code>Z50K3</code></tvar> which contains a multilingual list of HTML strings. When rendering information about an error, the messages stored in the error type can help create a clear, precise, informative, translatable and actionable error message. <!--T:333--> For that purpose, error messages can contain parameters like <tvar name="1"><code>$1</code></tvar>, <tvar name="2"><code>$2</code></tvar>, etc., where the digit corresponds to the error type argument and its value in the error instance. These error messages are rendered in Wikifunctions inside the "Details" dialog window after executing a function call. Additionally, these error messages are surfaced in other client interfaces, like Abstract Wikipedia, to provide better guidance to Abstract Content editors. </translate> [[File:Wikifunctions actionable error message example in the Details dialog.png|thumb|<translate><!--T:334--> The error message is rendered using the HTML message of the error type and the error argument values.</translate>]] [[File:Wikifunctions actionable error message example in Abstract Wikipedia.png|thumb|<translate><!--T:335--> When available, the HTML error message is rendered in the Abstract Wikipedia preview section.</translate>]] <translate> <!--T:336--> Let's use a real example to understand the benefits of HTML error messages: <!--T:337--> The function <tvar name="1">{{Z|Z37847}}</tvar> returns the first Lexeme reference given a Wikidata Item reference and a language. When there is no Lexeme for this Item-Language combination, it throws an error of type <tvar name="2">{{Z|Z28248}}</tvar>, which has three keys: </translate> * <translate><!--T:338--> '''<tvar name="1">Z28248K1</tvar>''' is the input Wikidata item QID</translate> * <translate><!--T:339--> '''<tvar name="1">Z28248K2</tvar>''' is the connecting property, in this case <code>P5137/item for this sense</code></translate> * <translate><!--T:340--> '''<tvar name="1">Z28248K3</tvar>''' is the language code</translate> <translate> <!--T:341--> When calling this function for a Wikidata lexeme that doesn't exist, the call will throw an error instance like this: </translate> <syntaxhighlight lang="json" highlight="10,12"> { "Z1K1": "Z5", "Z5K1": "Z28248", "Z5K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z885", "Z885K1": "Z28248" }, "Z28248K1": "Q319", "Z28248K2": "P5137", "Z28248K3": "ast" } } </syntaxhighlight> <translate> <!--T:342--> While the error type label indicates: <code>No matching lexeme for item in language</code>, a better error message should indicate: </translate> * <translate><!--T:343--> which is the failing item,</translate> * <translate><!--T:344--> which is the language missing, and</translate> * <translate><!--T:345--> what are the possible ways to fix it.</translate> <translate> <!--T:346--> The error message <tvar name="1"><code>Z50K3</code></tvar> field can provide this functionality. Whenever an Error Type has an error message for the user language (or any of its fallbacks), the error message shown will be rendered by: </translate> # <translate><!--T:347--> First, replacing the message parameters with the values of the keys. In our example, any <tvar name="1"><code>$1</code></tvar> will be replaced with the value of <tvar name="2"><code>Z28248K1</code></tvar> ("Q319"), <tvar name="3"><code>$2</code></tvar> with "P5137", and <tvar name="4"><code>$3</code></tvar> with "ast",</translate> # <translate><!--T:348--> Last, sanitizing and rendering the HTML message.</translate> <translate> <!--T:349--> So a HTML message like: </translate> <syntaxhighlight lang="html"> There is no matching lexeme for the item $1 in "$3".<br> <a href="http://wikidata.org/wiki/$1">Edit in Wikidata</a> </syntaxhighlight> <translate> <!--T:350--> Will become: </translate> : There is no matching lexeme for the item Q319 in "ast" : [[d:Q319|Edit in Wikidata]] <translate> == Debugging your implementations == <!--T:267--> <!--T:268--> Sometimes things can go wrong. A function might behave differently than expected or a value might not look quite right. Sometimes implementations are really complex and, because they are run in a sandboxed environment, it can seem really difficult to debug. To help understand what's going on inside a function call, Wikifunctions includes a small set of debugging tools. <!--T:269--> These tools don't change the result of a function, but will add extra information to the returned metadata, which you can observe after running the function. You can use <tvar name="1"><code>Wikifunctions.Debug()</code></tvar> from your code implementations or the function <tvar name="2">{{Z|Z854}}</tvar> from your compositions. <!--T:270--> In this section you will learn: </translate> * <translate><!--T:271--> How to add debug messages from both code and composition implementations,</translate> * <translate><!--T:272--> how to inspect the metadata manually or via the UI to inspect these logs.</translate> <translate> === Debugging your code implementations === <!--T:273--> <!--T:274--> When writing code, both from JavaScript and Python3, you can use <tvar name="1"><code>Wikifunctions.Debug()</code></tvar> to add a message to your debugging log and continue the execution. </translate> {{phab|T441028}} <translate> <!--T:275--> <tvar name="1"><code>Wikifunctions.Debug()</code></tvar> has one parameter, which is generally expected to be a string. However, any other object passed as parameter will get directly converted into a string. <!--T:276--> If we want to add debug logs to our code implementations for our "Join two strings with a space" example function, we can do, in JavaScript: </translate> <syntaxhighlight lang="JavaScript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { Wikifunctions.Debug( `first input is empty "${ Z30000K1 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { Wikifunctions.Debug( `second input is empty "${ Z30000K2 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } Wikifunctions.Debug( "both inputs are fine" ); return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <translate> <!--T:277--> And the same in your Python3 implementation will be: </translate> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": Wikifunctions.Debug( 'first input is empty "'+Z30000K1+'"' ) Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": Wikifunctions.Debug( 'second input is empty "'+Z30000K2+'"' ) Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) Wikifunctions.Debug( 'both inputs are fine' ) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <translate> <!--T:278--> This way, no matter what happens, we will be adding one message to your debugging logs: </translate> * <translate><!--T:279--> If the function call fails when checking on the first or second input, the result of the execution will be a failure, but it will contain one informative log about what branch caused the failure.</translate> * <translate><!--T:280--> If the function call succeeds—because both inputs are valid—the function call will return the joined string, but the returned metadata will also contain a debug log.</translate> <translate> === Debugging your compositions === <!--T:281--> <!--T:282--> To support debugging compositions, Wikifunctions provides the built-in function <tvar name="1">{{Z|Z854}}</tvar>. This function allows you to attach debug messages to the execution of any function call that generates the final output. The debug logs collected during the evaluation are returned as part of the execution metadata, under the <tvar name="2"><code>executorDebugLogs</code></tvar> key. ==== Add debug log to function call (Z854) ==== <!--T:283--> <!--T:284--> The <tvar name="1">{{Z|Z854}}</tvar> function is built-in with ZID <tvar name="2"><code>Z854</code></tvar> and takes two arguments: </translate> * <translate><!--T:285--> '''Function call''' – Any composition you want to execute.</translate> * <translate><!--T:286--> '''Debug log''' – A string message that will be recorded if the given function call is evaluated.</translate> <translate> <!--T:287--> When the wrapped function call runs, the provided message is added to the execution logs. If that function call is not executed, or its execution is not part of the final output, its debug log will not appear in the final result metadata. <!--T:288--> You will benefit from this built-in if you want to observe: </translate> * <translate><!--T:289--> Which branch of a conditional was executed, or</translate> * <translate><!--T:290--> the order of evaluation in a composition.</translate> <translate> ==== Using Add debug log to function call ==== <!--T:291--> <!--T:292--> Say that you want to add debug logs to our example function "Join two strings with a space" or <tvar name="1"><code>Z30000</code></tvar>, so that different messages are added to the different possible outcomes. You could use our debugging builtin like this: </translate> <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), add_debug_log( throw_error( Z30005, ... ), 'failed on first input' ) if( is_empty_string( Z30000K2 ), add_debug_log( throw_error( Z30005, ... ), 'failed on second input' ), add_debug_log( join_with_separator( Z30000K1, Z30000K2, " " ), 'both inputs are ok!' ) ) ) </syntaxhighlight> <translate> <!--T:293--> This way, </translate> * <translate><!--T:294--> when called with an empty first input, the function will return a failed response, and the metadata will contain an <tvar name="1"><code>executorDebugLogs</code></tvar> entry with the "failed on first input" log.</translate> * <translate><!--T:295--> When called with an empty second input, the call will also fail, but the logged message will be "failed on second input"</translate> * <translate><!--T:296--> When called with valid inputs, the function will return a successful response, and additionally the metadata will contain "both inputs are ok" in its <tvar name="1"><code>executorDebugLogs</code></tvar> key.</translate> <translate> <!--T:297--> This is the way this composition would look: </translate> [[File:Add debug log expanded.png|frame|center|alt=<translate><!--T:298--> Composition implementation using Add debug logs to log all possible execution paths</translate>|<translate><!--T:299--> Composition implementation using Add debug logs to log all possible execution paths</translate>]] <translate> === Accessing execution debug logs === <!--T:300--> <!--T:301--> Whether your execution logs are added via <tvar name="1"><code>Wikifunctions.Debug()</code></tvar> or via the <tvar name="2">{{Z|Z854}}</tvar> built-in function, they are returned as part of the response metadata. To see the logs, once you run your function, click on the "Details" button that appears at the bottom of the "Result" section. <!--T:302--> The error and debug information will appear at the top of the "Details" dialog. <!--T:303--> This is what you would see when running the composition from our previous example with valid and invalid inputs: </translate> {| class="wikitable" | [[File:Execution logs success.png|frameless|center|alt=<translate><!--T:304--> Function metadata dialog for a successful execution with debug logs</translate>]] | [[File:Execution logs failure.png|frameless|center|alt=<translate><!--T:305--> Function metadata dialog for a failed execution with debug logs</translate>]] |- | <translate><!--T:306--> Function metadata dialog for a successful execution: shows no errors, but displays the successful execution log: ''"both inputs are ok!"''</translate> | <translate><!--T:307--> Function metadata dialog for a failed execution: shows the error information, and the additional execution log for the first failure branch: ''"failed on first input"''</translate> |} [[Category:How to create implementations| {{#translation:}}]] 2oghcm542apasrzwrlkcgz2fp2fhr7a Wikifunctions:Project chat 4 1184 330894 330717 2026-10-22T14:32:03Z Abbedabb 102534 /* Translating "is a" (and similar) */ new section 330894 wikitext text/x-wiki {{shortcut|[[WF:CHAT]]|[[WF:PC]]|[[WF:VP]]}} __NEWSECTIONLINK__ [[Category:Help]] <!-- please do not remove this line --> Welcome to the Project chat, a place to discuss any and all aspects of Wikifunctions: the project itself, policy and proposals, individual data items, technical issues, etc. Other places to find help: * [[Wikifunctions:Administrators' noticeboard]] * [[Wikifunctions:Report a technical problem]] * [[Wikifunctions:FAQ]] {{Autoarchive resolved section |age = 1 |archive = ((FULLPAGENAME))/Archive/((year))/((month:##)) |timeout=30 }} {{Archives|{{#tag:div|<br />{{Flatlist|{{Special:PrefixIndex/WF:Project chat/Archive/|stripprefix=1|hideredirects=1}} |class=mw-collapsible-content|style=font-size:92%;}}|class="mw-collapsible mw-collapsible-toggle mw-collapsed"}} |prefix=WF:Project chat/Archive/ }} == Draft policy for language fallback strategies == [[Help:Language fallback]]<br>I'd appreciate any comments, but I'm particularly seeking approval for this planned mass edit: * '[[Z25065|limited]]' in all [[:Category:Display functions]] * '[[Z14310|none]]' in all [[:Category:Reading functions]] * '[[Z25065|limited]]' in all [[:Category:Abstract description functions]] * NEW STRATEGY '[[Z40583|insistent]]' in all [[:Category:Semantic fragment functions]] (including the ones I haven't categorised yet) * '[[Z40583|insistent]]' in all [[:Category:Hatnote functions]] * '[[Z40583|insistent]]' in all [[:Category:Multilingual captioned image functions]] * '[[Z14310|none]]' in all [[:Category:Conjugation tables]] * '[[Z14310|none]]' in all {{Z|36462}}-producing functions? {{ping|Denny|p=}} * '[[Z25065|limited]]' in everything else: punctuation helpers, lexeme and inflection helpers, partial sentence functions... [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 01:52, 21 October 2026 (UTC) :I am happy that see that you want to structure the language fallback strategies. I can't oversee the consequences, but I trust you in this plan. [[User:HenkvD|HenkvD]] ([[User talk:HenkvD|talk]]) 11:46, 30 August 2026 (UTC) ::At first read, the policy looks great (even if a person speaking fr-CA will probably be angry with that example, despite being largely true). I also approve the planned mass edit so far, it's good to test that. Thanks for the work! [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 16:20, 30 August 2026 (UTC) :::It would also be very great to have a schema and more examples so the policy could be more understandable for newcomers. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 16:22, 30 August 2026 (UTC) :None for the Syntactic tables is a good idea, I think that one will go from experimental right to deprecated anyway. I am not sure yet about the Semantic fragment functions, and would like to see the effect once we have a few more. --[[User:Denny|Denny]] ([[User talk:Denny|talk]]) 11:48, 3 September 2026 (UTC) :Can you provide some examples of things that will change? --[[User:99of9|99of9]] ([[User talk:99of9|talk]]) 04:52, 11 September 2026 (UTC) ::'None' &rarr; 'Limited': {{Z|20780}} will use the Dutch implementation when Afrikaans is requested, instead of the ISO 8601 fallback.<br>'None' &rarr; 'Insistent': {{Z|36083}} will use the English implementation when German is requested, instead of the fallback that's just an arrow.<br>Improvements are very much dependent on how the fallback language lists are configured. And the [[Z14294]]s themselves&mdash;yesterday I went through and replaced hardcoded [ en, en-GB ] with {{Z|33034}}, but in a world where I hadn't, the 'Limited' strategy would be helpful in routing the dialects to en. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 17:13, 11 September 2026 (UTC) :::I'm a bit conflicted here (and I've flipped around in the past too, so don't expect consistency sorry!). In the main articles example, I feel like the default is better than displaying English for German. Main articles doesn't really need words. Certainly En-dialects should get English, but as you say, we have other ways of ensuring that. I don't know enough about Afrikaans to comment on that one. --[[User:99of9|99of9]] ([[User talk:99of9|talk]]) 03:58, 17 September 2026 (UTC) == i can create my own function? == i need enable my implementation for my function Z38065 [[User:Spider077|Spider077]] ([[User talk:Spider077|talk]]) 05:40, 6 September 2026 (UTC) :Please request connections at [[Wikifunctions:Requests for connection and disconnection]]. :I do not think this particular implementation should be connected. :# The function has no test cases, so its intended purpose is not entirely clear. :# The function appears to be a duplicate of {{Z|Z11602}}. :# The implementation will return an error because <code>Text</code> is undefined. :# In any event, <code>print()</code> returns the value <code>None</code>, so the implementation would end up returning {{Z|Z24}}. :Please feel free to reply here if you need any help. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 10:24, 6 September 2026 (UTC) ::I fixed[[File:The Quantum Code.png]] [[User:Spider077|Spider077]] ([[User talk:Spider077|talk]]) 14:30, 29 September 2026 (UTC) == Technical limitations or something on my side? == Hi there, I'm experimenting with different ways to improve NLG in French (many things to do). I experiment some limitations, I don't if they come from the software or something I did: # I tried to create a typed list in {{Z|Z42597}}, similarly to {{Z|Z38002}}, but impossible to add this type (I'm blocked with an empty content box). The Edit Raw JSON script also fails on publication. # I tried to find if an item is a subclass of another in {{Z|Z41641}} and {{Z|Z41649}}, but I only get the error "WASM interpreter aborted (unreachable executed)". Is it me? Or some current limitations? Are there workarounds? Any help appreciated! Cheers. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 14:38, 19 September 2026 (UTC) :1. Z42957 is a {{Z|Z6}}. It is possible to create a typed list of {{Z|Z6091}}, if that’s what you have in mind. :2. Yes, that’s a tricky one. I don’t have time right now, but I should be able to look at it in a few hours or tomorrow morning. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 18:24, 19 September 2026 (UTC) ::Thank you! For some reason I couldn't create a typed list earlier, but it looks fixed now (I was able to create {{Z|Z42639}}). The interface could still be a bit clearer... {{Z|Z42597}} can be deleted, btw. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 19:39, 19 September 2026 (UTC) :::Good. I agree, the interface for type specification is a little peculiar for “generic” types. :::I’ve had a little look at your second problem and I don’t have a quick fix. Theoretically, I think you want to apply the subclass test to each of the classes of which the item is an instance, having failed to establish that the item is an instance of the superclass. [https://www.wikifunctions.org/view/en/Z36572?call=%7B%22Z1K1%22%3A%22Z7%22%2C%22Z7K1%22%3A%22Z36572%22%2C%22Z36572K1%22%3A%7B%22Z1K1%22%3A%22Z7%22%2C%22Z7K1%22%3A%22Z30120%22%2C%22Z30120K1%22%3A%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q84%22%7D%2C%22Z30120K2%22%3A%5B%22Z6030%22%2C%22Z6036%22%5D%2C%22Z30120K3%22%3A%5B%22Z60%22%5D%2C%22Z30120K4%22%3A%5B%22Z6092%22%2C%7B%22Z1K1%22%3A%22Z6092%22%2C%22Z6092K1%22%3A%22P31%22%7D%5D%7D%2C%22Z36572K2%22%3A%5B%22Z6091%22%2C%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q486972%22%7D%5D%2C%22Z36572K3%22%3A%7B%22Z1K1%22%3A%22Z13518%22%2C%22Z13518K1%22%3A%223%22%7D%7D This function call] seems to work, but I would be worried about timing out, generally. It would perhaps be better to create a list of classes that are, ultimately, types of human settlement and only use the more expensive traversal for items that are not instances of any of those classes. I don’t see any such list currently, but the idea is expressed in {{Z|Z41921}}, so @[[User:Jsamwrites|Jsamwrites]] might be interested in collaborating. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 20:38, 19 September 2026 (UTC) ::::As I mentioned [[Talk:Z41920|here]], your solution is ideally correct, but because of technical limitations, I created a faster version for general French usages. [[User:Jsamwrites|John Samuel]] 21:11, 19 September 2026 (UTC) :::::Thanks @[[User:GrounderUK|GrounderUK]]! Any help or Phabricator page (or some dashboard) where we could understand what's likely to timeout? I would love to reduce the burden on the servers but I have no clue on what's causing it. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 11:41, 20 September 2026 (UTC) ::::::I’m not aware of a suitable page, but I think it would be a good idea to have one. Perhaps we should add it to [[Special:MyLanguage/Wikifunctions:How to create implementations]], which is linked to from every implementation? We should probably also have a general Phabricator task for logging errors that are hard to understand and/or impossible to translate. This might fit under [[:phab:T432195]], unless @[[User:LMorgantini-WMF|LMorgantini-WMF]] has a better suggestion. ::::::For now, I would only suggest that we: ::::::* generally avoid {{Z|Z6821}} and use either {{Z|Z6820}} or one of its wrappers, like {{Z|Z30120}} or {{Z|Z23762}} ::::::* test using smaller and fewer Wikidata items ::::::* use the same item(s) for different tests, where appropriate ::::::* avoid unnecessary variation in fetch calls. ::::::[[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 13:19, 20 September 2026 (UTC) :::::::* If a function does not need to pull labels or statements from an Item/Property/Lexeme, it should not fetch it. :::::::** When a label or statement ''is'' needed, from that point on you should only pass around the fetched Item/etc. and not its reference. Unfortunately the naming conventions and [[WF:Catalogue/Wikidata_operations/Item#Labels_and_aliases|catalogue]] aren't very helpful for finding the right label functions at the moment. :::::::* Replace {{Z|22820}} with specialised filter functions where possible to avoid having to repeat a long expression. :::::::* When implementing by composition, try to do it without recursion, at least until a non-recursive or code implementation gets connected. Recursive compositions are slower and more annoying to debug. (Code implementations can use recursion with much less overhead, but are limited in other ways ofc.) :::::::* Embedded function calls often fail, even when the same arguments work fine when used on the function's view page. Must be a separate cache. :::::::[[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 22:24, 20 September 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #266: Memoization arriving == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-09-25|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we talk about storing a function call's result in a cache for easier recalling, we analyse how quickly one particular fact propagates through different Wikipedia language editions, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 09:54, 28 September 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=30951652 --> :This memoization is at the global level, but are subexpressions repeated within a composition also memoized / is that planned? Because I've been writing compositions assuming that they would. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 09:59, 28 September 2026 (UTC) ::Memoization is working on subexpressions. It should capture repeated subcalls within a composition and even across different calls to the orchestrator, so your assumption is safe. ::HOWEVER, be aware that we're only memoizing a very short list of functions so far (<code>[ 'Z860', 'Z885', 'Z101', 'Z10047', 'Z189' ]</code>). We plan to expand this list in future. Very open to suggestions about which functions we should consider; we've based these decisions on benchmarks but would also benefit from advice from composition implementers! [[User:CMassaro (WMF)|CMassaro (WMF)]] ([[User talk:CMassaro (WMF)|talk]]) 17:10, 29 September 2026 (UTC) :::I think it’s worth distinguishing between extrinsic caching of function call results and intrinsic memoization of objects during a function call evaluation. To my mind, “subexpressions repeated within a composition” would fall into the latter category (function call or not), and I believe the Orchestrator generally realizes a repeated subexpression (identical object) only once during a single function call’s evaluation. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 00:08, 30 September 2026 (UTC) :::Good to hear. As for what to do next, I wouldn't trust my intuition over actually measuring. Maybe display functions? [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 06:18, 30 September 2026 (UTC) :::I think the community should avoid recommending functions specifically for memoization. We can highlight functions of particular concern, leaving it to the team to consider whether memoization, new builtins or something else would be the preferred solution. Top of my list is {{Z|Z14310}}, which is a critical dependency for almost all Abstract Wikipedia calls as well as our reading and display functions. This should be considered alongside [[:phab:T390226|T390226: Consider using list inputs to create variadic apply, filter, map, etc. functions]], since the selected function is always applied. :::We should also consider: :::* {{Z|Z13052}} • {{Z|Z18683}} • {{Z|Z29294}} • {{Z|Z12696}} :::* {{Z|Z13676}} • {{Z|Z17132}} • {{Z|Z19751}} (or less than, etc) :::* {{Z|Z20943}} :::* {{Z|Z12899}} (or some other string-concatenation function) :::* {{Z|Z18475}} :::I believe that none of the above functions can currently be evaluated without ultimately requiring traversal into code. The groupings reflect my belief that improving any member of the set can improve all members. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 14:08, 1 October 2026 (UTC) ::::{{TakeNote}} My previous reply prioritizing {{Z|Z14310}} was written before [[:phab:T440032|DE2.2.10: Improve language-specific function creation]]. Although that Hypothesis is presented as a usability improvement, I think the solution there should be designed to address the scaling, performance and resilience issues [[:phab:T419789#11782917|previously noted]]. @[[User:Jdforrester (WMF)|Jdforrester (WMF)]] [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 12:18, 11 October 2026 (UTC) :::Ping @[[User:CMassaro (WMF)|CMassaro (WMF)]] [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 11:40, 11 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #267: Refreshing results == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-02|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we talk about two new capabilities addressing the issues of caching and freshness of function call results, we introduce our groundwork to support the first pilot communities for Abstract Wikipedia, we discuss news in Types, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 09:31, 2 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31099195 --> == Reached rate limit in evaluator == I increasingly get errors like "Reached rate limit in evaluator" or "The rendering service is temporarily unavailable. Please, try again later". This makes it almost impossible to work. [[User:HenkvD|HenkvD]] ([[User talk:HenkvD|talk]]) 11:08, 9 October 2026 (UTC) :Tracked in [[phab:T438643]] [[User:鈴音雨|鈴音雨]] ([[User talk:鈴音雨|talk]]) 15:06, 9 October 2026 (UTC) :P.S. I have created a userscript that can mitigate this issue to some extent [[User:鈴音雨/WFSpinner]]. [[User:鈴音雨|鈴音雨]] ([[User talk:鈴音雨|talk]]) 14:12, 10 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #268: Quarterly planning == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-09|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we discuss the work we have planned for this quarter (October-December 2026), we introduce news in Types, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Also, we remind you that if you have questions or ideas to discuss, the next '''Volunteers' Corner''' will be held on '''[https://zonestamp.toolforge.org/1791826200 October 12, at 17:30 UTC]''' ([https://meet.google.com/xuy-njxh-rkw link to the meeting]). Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 15:42, 10 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31143368 --> :<q>While [Z91/Z92] were really important for having translatable HTML error messages, we believe they can also be used for a lot other things [...]</q><br>So [[Talk:Z91#Generality|that's a no]], then. I don't mean to sound ungrateful, but we still don't have consistency with the current text Types, so telling us to adopt more is only going to result in fragmentation and confusion, at least in the short term. And there isn't a way (except a message/template on the talk page) to [[WF:Type_proposals/Typed_string|distinguish]] when a {{Z|91}}, or any textual object, contains <code>$1</code> markers which need to be replaced. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 21:57, 10 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #269: Changes in evaluator representations == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-17|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we introduce our latest changes in evaluator representations, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 10:46, 17 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31162541 --> == October 2026 Wikimedia Café: legal issues on Commons, and WMF Board selection process == <div class="border-box" style="background-color: var(--background-color-warning-subtle, #f8eaba); max-width: 875px; padding: 5px; border: 1px solid black; margin: 5px; color: var(--clr-dark)"> <div class="box" style="float:left; padding-top: 10px; padding-right: 10px; padding-left: 10px; padding-bottom: 10px;">[[File:Wikimedia Café logo in plain SVG format.svg|60px|alt=The logo for the Wikimedia Café]]</div> Hello! There will be two '''[https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9 Wikimedia Café]''' discussion opportunities in October. In a change from the usual Café practice, this month's sessions will have different topics. Anyone who meets the Café attendance criteria is welcome to attend either or both sessions. Session A will happen on Saturday, 24 October 2026 at 15:00 UTC ([https://zonestamp.toolforge.org/1792854000 timestamp converter]), at a time friendly to the Americas, Africa, and Europe. This session will feature [https://meta.wikimedia.org/wiki/User:PBradley-WMF Wikimedia Foundation lawyer Phil Bradley-Schmieg]. We will discuss legal issues on Wikimedia Commons, including complexities of international law. (I am hoping that in a future month, a similar Café session will be offered at a time friendly to Asia and the Pacific.) Session B will happen on Sunday, 25 October 2026 at 03:00 UTC ([https://zonestamp.toolforge.org/1792897200 timestamp converter]), at a time friendly to Asia and the Pacific, we will discuss [https://meta.wikimedia.org/wiki/Wikimedia_Foundation_elections/2027/Proposed_eligibility_criteria proposed changes to how Wikimedia Foundation Board candidates are selected]. The latest proposals are much different from the earlier July 2026 proposals. The due date for feedback on current proposals is 27 October, and Wikimedians are welcome to participate on the [https://meta.wikimedia.org/wiki/Talk:Wikimedia_Foundation_elections/2027/Proposed_eligibility_criteria proposal talk page] regardless of Café attendance. Please see the [https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9 Café] page for more information, including [https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9#How_to_attend_the_session how to register]! To subscribe or unsubscribe for Café notices on your talk page please [https://meta.wikimedia.org/wiki/Global_message_delivery/Targets/Wikimedia_Caf%C3%A9 go here]. <br /> [[File:Buntstifte Eberhard Faber crop 64h.jpg|860px|alt=cropped image of colored pencils]]</div> <span style="white-space:nowrap;">[[User:Pine|<span style="color:#01796f; text-shadow:#00BFFF 0 0 1.0em">༄ᨒ𖠰 Pine</span>]] [[User talk:Pine|<span style="color:DeepSkyBlue">(<b style="color:#FFDF00;text-shadow:#FFDF00 0 0 1.0em">✉</b>)</span>]]</span> 06:25, 18 October 2026 (UTC) == Translating "is a" (and similar) == I am trying to learn how to use Abstract Wikipedia after being a Wikipedian for over 20 years, but it is very diffirent. When I look at an article in my own language, words like "is a" and "from" are not translated. I thought it could be a simple and helpful thing to translate those, but I cannot figure out how to do that. /[[User:abbedabb|<b style="color:#ff9c15">abbedabb</b>]][[User talk:abbedabb|<sup><small>talk</small></sup>]] 14:32, 22 October 2026 (UTC) poexzcp9gy7f80hwbbrlrgjvqf79uh6 330896 330894 2026-10-22T15:13:28Z ReXLer 39813 /* Translating "is a" (and similar) */ Reply 330896 wikitext text/x-wiki {{shortcut|[[WF:CHAT]]|[[WF:PC]]|[[WF:VP]]}} __NEWSECTIONLINK__ [[Category:Help]] <!-- please do not remove this line --> Welcome to the Project chat, a place to discuss any and all aspects of Wikifunctions: the project itself, policy and proposals, individual data items, technical issues, etc. Other places to find help: * [[Wikifunctions:Administrators' noticeboard]] * [[Wikifunctions:Report a technical problem]] * [[Wikifunctions:FAQ]] {{Autoarchive resolved section |age = 1 |archive = ((FULLPAGENAME))/Archive/((year))/((month:##)) |timeout=30 }} {{Archives|{{#tag:div|<br />{{Flatlist|{{Special:PrefixIndex/WF:Project chat/Archive/|stripprefix=1|hideredirects=1}} |class=mw-collapsible-content|style=font-size:92%;}}|class="mw-collapsible mw-collapsible-toggle mw-collapsed"}} |prefix=WF:Project chat/Archive/ }} == Draft policy for language fallback strategies == [[Help:Language fallback]]<br>I'd appreciate any comments, but I'm particularly seeking approval for this planned mass edit: * '[[Z25065|limited]]' in all [[:Category:Display functions]] * '[[Z14310|none]]' in all [[:Category:Reading functions]] * '[[Z25065|limited]]' in all [[:Category:Abstract description functions]] * NEW STRATEGY '[[Z40583|insistent]]' in all [[:Category:Semantic fragment functions]] (including the ones I haven't categorised yet) * '[[Z40583|insistent]]' in all [[:Category:Hatnote functions]] * '[[Z40583|insistent]]' in all [[:Category:Multilingual captioned image functions]] * '[[Z14310|none]]' in all [[:Category:Conjugation tables]] * '[[Z14310|none]]' in all {{Z|36462}}-producing functions? {{ping|Denny|p=}} * '[[Z25065|limited]]' in everything else: punctuation helpers, lexeme and inflection helpers, partial sentence functions... [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 01:52, 21 October 2026 (UTC) :I am happy that see that you want to structure the language fallback strategies. I can't oversee the consequences, but I trust you in this plan. [[User:HenkvD|HenkvD]] ([[User talk:HenkvD|talk]]) 11:46, 30 August 2026 (UTC) ::At first read, the policy looks great (even if a person speaking fr-CA will probably be angry with that example, despite being largely true). I also approve the planned mass edit so far, it's good to test that. Thanks for the work! [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 16:20, 30 August 2026 (UTC) :::It would also be very great to have a schema and more examples so the policy could be more understandable for newcomers. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 16:22, 30 August 2026 (UTC) :None for the Syntactic tables is a good idea, I think that one will go from experimental right to deprecated anyway. I am not sure yet about the Semantic fragment functions, and would like to see the effect once we have a few more. --[[User:Denny|Denny]] ([[User talk:Denny|talk]]) 11:48, 3 September 2026 (UTC) :Can you provide some examples of things that will change? --[[User:99of9|99of9]] ([[User talk:99of9|talk]]) 04:52, 11 September 2026 (UTC) ::'None' &rarr; 'Limited': {{Z|20780}} will use the Dutch implementation when Afrikaans is requested, instead of the ISO 8601 fallback.<br>'None' &rarr; 'Insistent': {{Z|36083}} will use the English implementation when German is requested, instead of the fallback that's just an arrow.<br>Improvements are very much dependent on how the fallback language lists are configured. And the [[Z14294]]s themselves&mdash;yesterday I went through and replaced hardcoded [ en, en-GB ] with {{Z|33034}}, but in a world where I hadn't, the 'Limited' strategy would be helpful in routing the dialects to en. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 17:13, 11 September 2026 (UTC) :::I'm a bit conflicted here (and I've flipped around in the past too, so don't expect consistency sorry!). In the main articles example, I feel like the default is better than displaying English for German. Main articles doesn't really need words. Certainly En-dialects should get English, but as you say, we have other ways of ensuring that. I don't know enough about Afrikaans to comment on that one. --[[User:99of9|99of9]] ([[User talk:99of9|talk]]) 03:58, 17 September 2026 (UTC) == i can create my own function? == i need enable my implementation for my function Z38065 [[User:Spider077|Spider077]] ([[User talk:Spider077|talk]]) 05:40, 6 September 2026 (UTC) :Please request connections at [[Wikifunctions:Requests for connection and disconnection]]. :I do not think this particular implementation should be connected. :# The function has no test cases, so its intended purpose is not entirely clear. :# The function appears to be a duplicate of {{Z|Z11602}}. :# The implementation will return an error because <code>Text</code> is undefined. :# In any event, <code>print()</code> returns the value <code>None</code>, so the implementation would end up returning {{Z|Z24}}. :Please feel free to reply here if you need any help. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 10:24, 6 September 2026 (UTC) ::I fixed[[File:The Quantum Code.png]] [[User:Spider077|Spider077]] ([[User talk:Spider077|talk]]) 14:30, 29 September 2026 (UTC) == Technical limitations or something on my side? == Hi there, I'm experimenting with different ways to improve NLG in French (many things to do). I experiment some limitations, I don't if they come from the software or something I did: # I tried to create a typed list in {{Z|Z42597}}, similarly to {{Z|Z38002}}, but impossible to add this type (I'm blocked with an empty content box). The Edit Raw JSON script also fails on publication. # I tried to find if an item is a subclass of another in {{Z|Z41641}} and {{Z|Z41649}}, but I only get the error "WASM interpreter aborted (unreachable executed)". Is it me? Or some current limitations? Are there workarounds? Any help appreciated! Cheers. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 14:38, 19 September 2026 (UTC) :1. Z42957 is a {{Z|Z6}}. It is possible to create a typed list of {{Z|Z6091}}, if that’s what you have in mind. :2. Yes, that’s a tricky one. I don’t have time right now, but I should be able to look at it in a few hours or tomorrow morning. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 18:24, 19 September 2026 (UTC) ::Thank you! For some reason I couldn't create a typed list earlier, but it looks fixed now (I was able to create {{Z|Z42639}}). The interface could still be a bit clearer... {{Z|Z42597}} can be deleted, btw. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 19:39, 19 September 2026 (UTC) :::Good. I agree, the interface for type specification is a little peculiar for “generic” types. :::I’ve had a little look at your second problem and I don’t have a quick fix. Theoretically, I think you want to apply the subclass test to each of the classes of which the item is an instance, having failed to establish that the item is an instance of the superclass. [https://www.wikifunctions.org/view/en/Z36572?call=%7B%22Z1K1%22%3A%22Z7%22%2C%22Z7K1%22%3A%22Z36572%22%2C%22Z36572K1%22%3A%7B%22Z1K1%22%3A%22Z7%22%2C%22Z7K1%22%3A%22Z30120%22%2C%22Z30120K1%22%3A%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q84%22%7D%2C%22Z30120K2%22%3A%5B%22Z6030%22%2C%22Z6036%22%5D%2C%22Z30120K3%22%3A%5B%22Z60%22%5D%2C%22Z30120K4%22%3A%5B%22Z6092%22%2C%7B%22Z1K1%22%3A%22Z6092%22%2C%22Z6092K1%22%3A%22P31%22%7D%5D%7D%2C%22Z36572K2%22%3A%5B%22Z6091%22%2C%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q486972%22%7D%5D%2C%22Z36572K3%22%3A%7B%22Z1K1%22%3A%22Z13518%22%2C%22Z13518K1%22%3A%223%22%7D%7D This function call] seems to work, but I would be worried about timing out, generally. It would perhaps be better to create a list of classes that are, ultimately, types of human settlement and only use the more expensive traversal for items that are not instances of any of those classes. I don’t see any such list currently, but the idea is expressed in {{Z|Z41921}}, so @[[User:Jsamwrites|Jsamwrites]] might be interested in collaborating. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 20:38, 19 September 2026 (UTC) ::::As I mentioned [[Talk:Z41920|here]], your solution is ideally correct, but because of technical limitations, I created a faster version for general French usages. [[User:Jsamwrites|John Samuel]] 21:11, 19 September 2026 (UTC) :::::Thanks @[[User:GrounderUK|GrounderUK]]! Any help or Phabricator page (or some dashboard) where we could understand what's likely to timeout? I would love to reduce the burden on the servers but I have no clue on what's causing it. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 11:41, 20 September 2026 (UTC) ::::::I’m not aware of a suitable page, but I think it would be a good idea to have one. Perhaps we should add it to [[Special:MyLanguage/Wikifunctions:How to create implementations]], which is linked to from every implementation? We should probably also have a general Phabricator task for logging errors that are hard to understand and/or impossible to translate. This might fit under [[:phab:T432195]], unless @[[User:LMorgantini-WMF|LMorgantini-WMF]] has a better suggestion. ::::::For now, I would only suggest that we: ::::::* generally avoid {{Z|Z6821}} and use either {{Z|Z6820}} or one of its wrappers, like {{Z|Z30120}} or {{Z|Z23762}} ::::::* test using smaller and fewer Wikidata items ::::::* use the same item(s) for different tests, where appropriate ::::::* avoid unnecessary variation in fetch calls. ::::::[[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 13:19, 20 September 2026 (UTC) :::::::* If a function does not need to pull labels or statements from an Item/Property/Lexeme, it should not fetch it. :::::::** When a label or statement ''is'' needed, from that point on you should only pass around the fetched Item/etc. and not its reference. Unfortunately the naming conventions and [[WF:Catalogue/Wikidata_operations/Item#Labels_and_aliases|catalogue]] aren't very helpful for finding the right label functions at the moment. :::::::* Replace {{Z|22820}} with specialised filter functions where possible to avoid having to repeat a long expression. :::::::* When implementing by composition, try to do it without recursion, at least until a non-recursive or code implementation gets connected. Recursive compositions are slower and more annoying to debug. (Code implementations can use recursion with much less overhead, but are limited in other ways ofc.) :::::::* Embedded function calls often fail, even when the same arguments work fine when used on the function's view page. Must be a separate cache. :::::::[[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 22:24, 20 September 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #266: Memoization arriving == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-09-25|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we talk about storing a function call's result in a cache for easier recalling, we analyse how quickly one particular fact propagates through different Wikipedia language editions, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 09:54, 28 September 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=30951652 --> :This memoization is at the global level, but are subexpressions repeated within a composition also memoized / is that planned? Because I've been writing compositions assuming that they would. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 09:59, 28 September 2026 (UTC) ::Memoization is working on subexpressions. It should capture repeated subcalls within a composition and even across different calls to the orchestrator, so your assumption is safe. ::HOWEVER, be aware that we're only memoizing a very short list of functions so far (<code>[ 'Z860', 'Z885', 'Z101', 'Z10047', 'Z189' ]</code>). We plan to expand this list in future. Very open to suggestions about which functions we should consider; we've based these decisions on benchmarks but would also benefit from advice from composition implementers! [[User:CMassaro (WMF)|CMassaro (WMF)]] ([[User talk:CMassaro (WMF)|talk]]) 17:10, 29 September 2026 (UTC) :::I think it’s worth distinguishing between extrinsic caching of function call results and intrinsic memoization of objects during a function call evaluation. To my mind, “subexpressions repeated within a composition” would fall into the latter category (function call or not), and I believe the Orchestrator generally realizes a repeated subexpression (identical object) only once during a single function call’s evaluation. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 00:08, 30 September 2026 (UTC) :::Good to hear. As for what to do next, I wouldn't trust my intuition over actually measuring. Maybe display functions? [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 06:18, 30 September 2026 (UTC) :::I think the community should avoid recommending functions specifically for memoization. We can highlight functions of particular concern, leaving it to the team to consider whether memoization, new builtins or something else would be the preferred solution. Top of my list is {{Z|Z14310}}, which is a critical dependency for almost all Abstract Wikipedia calls as well as our reading and display functions. This should be considered alongside [[:phab:T390226|T390226: Consider using list inputs to create variadic apply, filter, map, etc. functions]], since the selected function is always applied. :::We should also consider: :::* {{Z|Z13052}} • {{Z|Z18683}} • {{Z|Z29294}} • {{Z|Z12696}} :::* {{Z|Z13676}} • {{Z|Z17132}} • {{Z|Z19751}} (or less than, etc) :::* {{Z|Z20943}} :::* {{Z|Z12899}} (or some other string-concatenation function) :::* {{Z|Z18475}} :::I believe that none of the above functions can currently be evaluated without ultimately requiring traversal into code. The groupings reflect my belief that improving any member of the set can improve all members. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 14:08, 1 October 2026 (UTC) ::::{{TakeNote}} My previous reply prioritizing {{Z|Z14310}} was written before [[:phab:T440032|DE2.2.10: Improve language-specific function creation]]. Although that Hypothesis is presented as a usability improvement, I think the solution there should be designed to address the scaling, performance and resilience issues [[:phab:T419789#11782917|previously noted]]. @[[User:Jdforrester (WMF)|Jdforrester (WMF)]] [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 12:18, 11 October 2026 (UTC) :::Ping @[[User:CMassaro (WMF)|CMassaro (WMF)]] [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 11:40, 11 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #267: Refreshing results == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-02|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we talk about two new capabilities addressing the issues of caching and freshness of function call results, we introduce our groundwork to support the first pilot communities for Abstract Wikipedia, we discuss news in Types, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 09:31, 2 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31099195 --> == Reached rate limit in evaluator == I increasingly get errors like "Reached rate limit in evaluator" or "The rendering service is temporarily unavailable. Please, try again later". This makes it almost impossible to work. [[User:HenkvD|HenkvD]] ([[User talk:HenkvD|talk]]) 11:08, 9 October 2026 (UTC) :Tracked in [[phab:T438643]] [[User:鈴音雨|鈴音雨]] ([[User talk:鈴音雨|talk]]) 15:06, 9 October 2026 (UTC) :P.S. I have created a userscript that can mitigate this issue to some extent [[User:鈴音雨/WFSpinner]]. [[User:鈴音雨|鈴音雨]] ([[User talk:鈴音雨|talk]]) 14:12, 10 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #268: Quarterly planning == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-09|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we discuss the work we have planned for this quarter (October-December 2026), we introduce news in Types, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Also, we remind you that if you have questions or ideas to discuss, the next '''Volunteers' Corner''' will be held on '''[https://zonestamp.toolforge.org/1791826200 October 12, at 17:30 UTC]''' ([https://meet.google.com/xuy-njxh-rkw link to the meeting]). Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 15:42, 10 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31143368 --> :<q>While [Z91/Z92] were really important for having translatable HTML error messages, we believe they can also be used for a lot other things [...]</q><br>So [[Talk:Z91#Generality|that's a no]], then. I don't mean to sound ungrateful, but we still don't have consistency with the current text Types, so telling us to adopt more is only going to result in fragmentation and confusion, at least in the short term. And there isn't a way (except a message/template on the talk page) to [[WF:Type_proposals/Typed_string|distinguish]] when a {{Z|91}}, or any textual object, contains <code>$1</code> markers which need to be replaced. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 21:57, 10 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #269: Changes in evaluator representations == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-17|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we introduce our latest changes in evaluator representations, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 10:46, 17 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31162541 --> == October 2026 Wikimedia Café: legal issues on Commons, and WMF Board selection process == <div class="border-box" style="background-color: var(--background-color-warning-subtle, #f8eaba); max-width: 875px; padding: 5px; border: 1px solid black; margin: 5px; color: var(--clr-dark)"> <div class="box" style="float:left; padding-top: 10px; padding-right: 10px; padding-left: 10px; padding-bottom: 10px;">[[File:Wikimedia Café logo in plain SVG format.svg|60px|alt=The logo for the Wikimedia Café]]</div> Hello! There will be two '''[https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9 Wikimedia Café]''' discussion opportunities in October. In a change from the usual Café practice, this month's sessions will have different topics. Anyone who meets the Café attendance criteria is welcome to attend either or both sessions. Session A will happen on Saturday, 24 October 2026 at 15:00 UTC ([https://zonestamp.toolforge.org/1792854000 timestamp converter]), at a time friendly to the Americas, Africa, and Europe. This session will feature [https://meta.wikimedia.org/wiki/User:PBradley-WMF Wikimedia Foundation lawyer Phil Bradley-Schmieg]. We will discuss legal issues on Wikimedia Commons, including complexities of international law. (I am hoping that in a future month, a similar Café session will be offered at a time friendly to Asia and the Pacific.) Session B will happen on Sunday, 25 October 2026 at 03:00 UTC ([https://zonestamp.toolforge.org/1792897200 timestamp converter]), at a time friendly to Asia and the Pacific, we will discuss [https://meta.wikimedia.org/wiki/Wikimedia_Foundation_elections/2027/Proposed_eligibility_criteria proposed changes to how Wikimedia Foundation Board candidates are selected]. The latest proposals are much different from the earlier July 2026 proposals. The due date for feedback on current proposals is 27 October, and Wikimedians are welcome to participate on the [https://meta.wikimedia.org/wiki/Talk:Wikimedia_Foundation_elections/2027/Proposed_eligibility_criteria proposal talk page] regardless of Café attendance. Please see the [https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9 Café] page for more information, including [https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9#How_to_attend_the_session how to register]! To subscribe or unsubscribe for Café notices on your talk page please [https://meta.wikimedia.org/wiki/Global_message_delivery/Targets/Wikimedia_Caf%C3%A9 go here]. <br /> [[File:Buntstifte Eberhard Faber crop 64h.jpg|860px|alt=cropped image of colored pencils]]</div> <span style="white-space:nowrap;">[[User:Pine|<span style="color:#01796f; text-shadow:#00BFFF 0 0 1.0em">༄ᨒ𖠰 Pine</span>]] [[User talk:Pine|<span style="color:DeepSkyBlue">(<b style="color:#FFDF00;text-shadow:#FFDF00 0 0 1.0em">✉</b>)</span>]]</span> 06:25, 18 October 2026 (UTC) == Translating "is a" (and similar) == I am trying to learn how to use Abstract Wikipedia after being a Wikipedian for over 20 years, but it is very diffirent. When I look at an article in my own language, words like "is a" and "from" are not translated. I thought it could be a simple and helpful thing to translate those, but I cannot figure out how to do that. /[[User:abbedabb|<b style="color:#ff9c15">abbedabb</b>]][[User talk:abbedabb|<sup><small>talk</small></sup>]] 14:32, 22 October 2026 (UTC) :Try changing the language in the language input to the right side of "Generated text" to Swedish. [[User:ReXLer|ReXLer]] ([[User talk:ReXLer|talk]]) 15:13, 22 October 2026 (UTC) 0ezr5iozrprywu3lm9ovkhkjol635l0 330897 330896 2026-10-22T15:13:39Z ReXLer 39813 /* Translating "is a" (and similar) */ 330897 wikitext text/x-wiki {{shortcut|[[WF:CHAT]]|[[WF:PC]]|[[WF:VP]]}} __NEWSECTIONLINK__ [[Category:Help]] <!-- please do not remove this line --> Welcome to the Project chat, a place to discuss any and all aspects of Wikifunctions: the project itself, policy and proposals, individual data items, technical issues, etc. Other places to find help: * [[Wikifunctions:Administrators' noticeboard]] * [[Wikifunctions:Report a technical problem]] * [[Wikifunctions:FAQ]] {{Autoarchive resolved section |age = 1 |archive = ((FULLPAGENAME))/Archive/((year))/((month:##)) |timeout=30 }} {{Archives|{{#tag:div|<br />{{Flatlist|{{Special:PrefixIndex/WF:Project chat/Archive/|stripprefix=1|hideredirects=1}} |class=mw-collapsible-content|style=font-size:92%;}}|class="mw-collapsible mw-collapsible-toggle mw-collapsed"}} |prefix=WF:Project chat/Archive/ }} == Draft policy for language fallback strategies == [[Help:Language fallback]]<br>I'd appreciate any comments, but I'm particularly seeking approval for this planned mass edit: * '[[Z25065|limited]]' in all [[:Category:Display functions]] * '[[Z14310|none]]' in all [[:Category:Reading functions]] * '[[Z25065|limited]]' in all [[:Category:Abstract description functions]] * NEW STRATEGY '[[Z40583|insistent]]' in all [[:Category:Semantic fragment functions]] (including the ones I haven't categorised yet) * '[[Z40583|insistent]]' in all [[:Category:Hatnote functions]] * '[[Z40583|insistent]]' in all [[:Category:Multilingual captioned image functions]] * '[[Z14310|none]]' in all [[:Category:Conjugation tables]] * '[[Z14310|none]]' in all {{Z|36462}}-producing functions? {{ping|Denny|p=}} * '[[Z25065|limited]]' in everything else: punctuation helpers, lexeme and inflection helpers, partial sentence functions... [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 01:52, 21 October 2026 (UTC) :I am happy that see that you want to structure the language fallback strategies. I can't oversee the consequences, but I trust you in this plan. [[User:HenkvD|HenkvD]] ([[User talk:HenkvD|talk]]) 11:46, 30 August 2026 (UTC) ::At first read, the policy looks great (even if a person speaking fr-CA will probably be angry with that example, despite being largely true). I also approve the planned mass edit so far, it's good to test that. Thanks for the work! [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 16:20, 30 August 2026 (UTC) :::It would also be very great to have a schema and more examples so the policy could be more understandable for newcomers. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 16:22, 30 August 2026 (UTC) :None for the Syntactic tables is a good idea, I think that one will go from experimental right to deprecated anyway. I am not sure yet about the Semantic fragment functions, and would like to see the effect once we have a few more. --[[User:Denny|Denny]] ([[User talk:Denny|talk]]) 11:48, 3 September 2026 (UTC) :Can you provide some examples of things that will change? --[[User:99of9|99of9]] ([[User talk:99of9|talk]]) 04:52, 11 September 2026 (UTC) ::'None' &rarr; 'Limited': {{Z|20780}} will use the Dutch implementation when Afrikaans is requested, instead of the ISO 8601 fallback.<br>'None' &rarr; 'Insistent': {{Z|36083}} will use the English implementation when German is requested, instead of the fallback that's just an arrow.<br>Improvements are very much dependent on how the fallback language lists are configured. And the [[Z14294]]s themselves&mdash;yesterday I went through and replaced hardcoded [ en, en-GB ] with {{Z|33034}}, but in a world where I hadn't, the 'Limited' strategy would be helpful in routing the dialects to en. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 17:13, 11 September 2026 (UTC) :::I'm a bit conflicted here (and I've flipped around in the past too, so don't expect consistency sorry!). In the main articles example, I feel like the default is better than displaying English for German. Main articles doesn't really need words. Certainly En-dialects should get English, but as you say, we have other ways of ensuring that. I don't know enough about Afrikaans to comment on that one. --[[User:99of9|99of9]] ([[User talk:99of9|talk]]) 03:58, 17 September 2026 (UTC) == i can create my own function? == i need enable my implementation for my function Z38065 [[User:Spider077|Spider077]] ([[User talk:Spider077|talk]]) 05:40, 6 September 2026 (UTC) :Please request connections at [[Wikifunctions:Requests for connection and disconnection]]. :I do not think this particular implementation should be connected. :# The function has no test cases, so its intended purpose is not entirely clear. :# The function appears to be a duplicate of {{Z|Z11602}}. :# The implementation will return an error because <code>Text</code> is undefined. :# In any event, <code>print()</code> returns the value <code>None</code>, so the implementation would end up returning {{Z|Z24}}. :Please feel free to reply here if you need any help. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 10:24, 6 September 2026 (UTC) ::I fixed[[File:The Quantum Code.png]] [[User:Spider077|Spider077]] ([[User talk:Spider077|talk]]) 14:30, 29 September 2026 (UTC) == Technical limitations or something on my side? == Hi there, I'm experimenting with different ways to improve NLG in French (many things to do). I experiment some limitations, I don't if they come from the software or something I did: # I tried to create a typed list in {{Z|Z42597}}, similarly to {{Z|Z38002}}, but impossible to add this type (I'm blocked with an empty content box). The Edit Raw JSON script also fails on publication. # I tried to find if an item is a subclass of another in {{Z|Z41641}} and {{Z|Z41649}}, but I only get the error "WASM interpreter aborted (unreachable executed)". Is it me? Or some current limitations? Are there workarounds? Any help appreciated! Cheers. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 14:38, 19 September 2026 (UTC) :1. Z42957 is a {{Z|Z6}}. It is possible to create a typed list of {{Z|Z6091}}, if that’s what you have in mind. :2. Yes, that’s a tricky one. I don’t have time right now, but I should be able to look at it in a few hours or tomorrow morning. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 18:24, 19 September 2026 (UTC) ::Thank you! For some reason I couldn't create a typed list earlier, but it looks fixed now (I was able to create {{Z|Z42639}}). The interface could still be a bit clearer... {{Z|Z42597}} can be deleted, btw. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 19:39, 19 September 2026 (UTC) :::Good. I agree, the interface for type specification is a little peculiar for “generic” types. :::I’ve had a little look at your second problem and I don’t have a quick fix. Theoretically, I think you want to apply the subclass test to each of the classes of which the item is an instance, having failed to establish that the item is an instance of the superclass. [https://www.wikifunctions.org/view/en/Z36572?call=%7B%22Z1K1%22%3A%22Z7%22%2C%22Z7K1%22%3A%22Z36572%22%2C%22Z36572K1%22%3A%7B%22Z1K1%22%3A%22Z7%22%2C%22Z7K1%22%3A%22Z30120%22%2C%22Z30120K1%22%3A%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q84%22%7D%2C%22Z30120K2%22%3A%5B%22Z6030%22%2C%22Z6036%22%5D%2C%22Z30120K3%22%3A%5B%22Z60%22%5D%2C%22Z30120K4%22%3A%5B%22Z6092%22%2C%7B%22Z1K1%22%3A%22Z6092%22%2C%22Z6092K1%22%3A%22P31%22%7D%5D%7D%2C%22Z36572K2%22%3A%5B%22Z6091%22%2C%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q486972%22%7D%5D%2C%22Z36572K3%22%3A%7B%22Z1K1%22%3A%22Z13518%22%2C%22Z13518K1%22%3A%223%22%7D%7D This function call] seems to work, but I would be worried about timing out, generally. It would perhaps be better to create a list of classes that are, ultimately, types of human settlement and only use the more expensive traversal for items that are not instances of any of those classes. I don’t see any such list currently, but the idea is expressed in {{Z|Z41921}}, so @[[User:Jsamwrites|Jsamwrites]] might be interested in collaborating. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 20:38, 19 September 2026 (UTC) ::::As I mentioned [[Talk:Z41920|here]], your solution is ideally correct, but because of technical limitations, I created a faster version for general French usages. [[User:Jsamwrites|John Samuel]] 21:11, 19 September 2026 (UTC) :::::Thanks @[[User:GrounderUK|GrounderUK]]! Any help or Phabricator page (or some dashboard) where we could understand what's likely to timeout? I would love to reduce the burden on the servers but I have no clue on what's causing it. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 11:41, 20 September 2026 (UTC) ::::::I’m not aware of a suitable page, but I think it would be a good idea to have one. Perhaps we should add it to [[Special:MyLanguage/Wikifunctions:How to create implementations]], which is linked to from every implementation? We should probably also have a general Phabricator task for logging errors that are hard to understand and/or impossible to translate. This might fit under [[:phab:T432195]], unless @[[User:LMorgantini-WMF|LMorgantini-WMF]] has a better suggestion. ::::::For now, I would only suggest that we: ::::::* generally avoid {{Z|Z6821}} and use either {{Z|Z6820}} or one of its wrappers, like {{Z|Z30120}} or {{Z|Z23762}} ::::::* test using smaller and fewer Wikidata items ::::::* use the same item(s) for different tests, where appropriate ::::::* avoid unnecessary variation in fetch calls. ::::::[[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 13:19, 20 September 2026 (UTC) :::::::* If a function does not need to pull labels or statements from an Item/Property/Lexeme, it should not fetch it. :::::::** When a label or statement ''is'' needed, from that point on you should only pass around the fetched Item/etc. and not its reference. Unfortunately the naming conventions and [[WF:Catalogue/Wikidata_operations/Item#Labels_and_aliases|catalogue]] aren't very helpful for finding the right label functions at the moment. :::::::* Replace {{Z|22820}} with specialised filter functions where possible to avoid having to repeat a long expression. :::::::* When implementing by composition, try to do it without recursion, at least until a non-recursive or code implementation gets connected. Recursive compositions are slower and more annoying to debug. (Code implementations can use recursion with much less overhead, but are limited in other ways ofc.) :::::::* Embedded function calls often fail, even when the same arguments work fine when used on the function's view page. Must be a separate cache. :::::::[[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 22:24, 20 September 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #266: Memoization arriving == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-09-25|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we talk about storing a function call's result in a cache for easier recalling, we analyse how quickly one particular fact propagates through different Wikipedia language editions, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 09:54, 28 September 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=30951652 --> :This memoization is at the global level, but are subexpressions repeated within a composition also memoized / is that planned? Because I've been writing compositions assuming that they would. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 09:59, 28 September 2026 (UTC) ::Memoization is working on subexpressions. It should capture repeated subcalls within a composition and even across different calls to the orchestrator, so your assumption is safe. ::HOWEVER, be aware that we're only memoizing a very short list of functions so far (<code>[ 'Z860', 'Z885', 'Z101', 'Z10047', 'Z189' ]</code>). We plan to expand this list in future. Very open to suggestions about which functions we should consider; we've based these decisions on benchmarks but would also benefit from advice from composition implementers! [[User:CMassaro (WMF)|CMassaro (WMF)]] ([[User talk:CMassaro (WMF)|talk]]) 17:10, 29 September 2026 (UTC) :::I think it’s worth distinguishing between extrinsic caching of function call results and intrinsic memoization of objects during a function call evaluation. To my mind, “subexpressions repeated within a composition” would fall into the latter category (function call or not), and I believe the Orchestrator generally realizes a repeated subexpression (identical object) only once during a single function call’s evaluation. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 00:08, 30 September 2026 (UTC) :::Good to hear. As for what to do next, I wouldn't trust my intuition over actually measuring. Maybe display functions? [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 06:18, 30 September 2026 (UTC) :::I think the community should avoid recommending functions specifically for memoization. We can highlight functions of particular concern, leaving it to the team to consider whether memoization, new builtins or something else would be the preferred solution. Top of my list is {{Z|Z14310}}, which is a critical dependency for almost all Abstract Wikipedia calls as well as our reading and display functions. This should be considered alongside [[:phab:T390226|T390226: Consider using list inputs to create variadic apply, filter, map, etc. functions]], since the selected function is always applied. :::We should also consider: :::* {{Z|Z13052}} • {{Z|Z18683}} • {{Z|Z29294}} • {{Z|Z12696}} :::* {{Z|Z13676}} • {{Z|Z17132}} • {{Z|Z19751}} (or less than, etc) :::* {{Z|Z20943}} :::* {{Z|Z12899}} (or some other string-concatenation function) :::* {{Z|Z18475}} :::I believe that none of the above functions can currently be evaluated without ultimately requiring traversal into code. The groupings reflect my belief that improving any member of the set can improve all members. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 14:08, 1 October 2026 (UTC) ::::{{TakeNote}} My previous reply prioritizing {{Z|Z14310}} was written before [[:phab:T440032|DE2.2.10: Improve language-specific function creation]]. Although that Hypothesis is presented as a usability improvement, I think the solution there should be designed to address the scaling, performance and resilience issues [[:phab:T419789#11782917|previously noted]]. @[[User:Jdforrester (WMF)|Jdforrester (WMF)]] [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 12:18, 11 October 2026 (UTC) :::Ping @[[User:CMassaro (WMF)|CMassaro (WMF)]] [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 11:40, 11 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #267: Refreshing results == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-02|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we talk about two new capabilities addressing the issues of caching and freshness of function call results, we introduce our groundwork to support the first pilot communities for Abstract Wikipedia, we discuss news in Types, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 09:31, 2 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31099195 --> == Reached rate limit in evaluator == I increasingly get errors like "Reached rate limit in evaluator" or "The rendering service is temporarily unavailable. Please, try again later". This makes it almost impossible to work. [[User:HenkvD|HenkvD]] ([[User talk:HenkvD|talk]]) 11:08, 9 October 2026 (UTC) :Tracked in [[phab:T438643]] [[User:鈴音雨|鈴音雨]] ([[User talk:鈴音雨|talk]]) 15:06, 9 October 2026 (UTC) :P.S. I have created a userscript that can mitigate this issue to some extent [[User:鈴音雨/WFSpinner]]. [[User:鈴音雨|鈴音雨]] ([[User talk:鈴音雨|talk]]) 14:12, 10 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #268: Quarterly planning == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-09|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we discuss the work we have planned for this quarter (October-December 2026), we introduce news in Types, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Also, we remind you that if you have questions or ideas to discuss, the next '''Volunteers' Corner''' will be held on '''[https://zonestamp.toolforge.org/1791826200 October 12, at 17:30 UTC]''' ([https://meet.google.com/xuy-njxh-rkw link to the meeting]). Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 15:42, 10 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31143368 --> :<q>While [Z91/Z92] were really important for having translatable HTML error messages, we believe they can also be used for a lot other things [...]</q><br>So [[Talk:Z91#Generality|that's a no]], then. I don't mean to sound ungrateful, but we still don't have consistency with the current text Types, so telling us to adopt more is only going to result in fragmentation and confusion, at least in the short term. And there isn't a way (except a message/template on the talk page) to [[WF:Type_proposals/Typed_string|distinguish]] when a {{Z|91}}, or any textual object, contains <code>$1</code> markers which need to be replaced. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 21:57, 10 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #269: Changes in evaluator representations == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-17|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we introduce our latest changes in evaluator representations, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 10:46, 17 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31162541 --> == October 2026 Wikimedia Café: legal issues on Commons, and WMF Board selection process == <div class="border-box" style="background-color: var(--background-color-warning-subtle, #f8eaba); max-width: 875px; padding: 5px; border: 1px solid black; margin: 5px; color: var(--clr-dark)"> <div class="box" style="float:left; padding-top: 10px; padding-right: 10px; padding-left: 10px; padding-bottom: 10px;">[[File:Wikimedia Café logo in plain SVG format.svg|60px|alt=The logo for the Wikimedia Café]]</div> Hello! There will be two '''[https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9 Wikimedia Café]''' discussion opportunities in October. In a change from the usual Café practice, this month's sessions will have different topics. Anyone who meets the Café attendance criteria is welcome to attend either or both sessions. Session A will happen on Saturday, 24 October 2026 at 15:00 UTC ([https://zonestamp.toolforge.org/1792854000 timestamp converter]), at a time friendly to the Americas, Africa, and Europe. This session will feature [https://meta.wikimedia.org/wiki/User:PBradley-WMF Wikimedia Foundation lawyer Phil Bradley-Schmieg]. We will discuss legal issues on Wikimedia Commons, including complexities of international law. (I am hoping that in a future month, a similar Café session will be offered at a time friendly to Asia and the Pacific.) Session B will happen on Sunday, 25 October 2026 at 03:00 UTC ([https://zonestamp.toolforge.org/1792897200 timestamp converter]), at a time friendly to Asia and the Pacific, we will discuss [https://meta.wikimedia.org/wiki/Wikimedia_Foundation_elections/2027/Proposed_eligibility_criteria proposed changes to how Wikimedia Foundation Board candidates are selected]. The latest proposals are much different from the earlier July 2026 proposals. The due date for feedback on current proposals is 27 October, and Wikimedians are welcome to participate on the [https://meta.wikimedia.org/wiki/Talk:Wikimedia_Foundation_elections/2027/Proposed_eligibility_criteria proposal talk page] regardless of Café attendance. Please see the [https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9 Café] page for more information, including [https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9#How_to_attend_the_session how to register]! To subscribe or unsubscribe for Café notices on your talk page please [https://meta.wikimedia.org/wiki/Global_message_delivery/Targets/Wikimedia_Caf%C3%A9 go here]. <br /> [[File:Buntstifte Eberhard Faber crop 64h.jpg|860px|alt=cropped image of colored pencils]]</div> <span style="white-space:nowrap;">[[User:Pine|<span style="color:#01796f; text-shadow:#00BFFF 0 0 1.0em">༄ᨒ𖠰 Pine</span>]] [[User talk:Pine|<span style="color:DeepSkyBlue">(<b style="color:#FFDF00;text-shadow:#FFDF00 0 0 1.0em">✉</b>)</span>]]</span> 06:25, 18 October 2026 (UTC) == Translating "is a" (and similar) == I am trying to learn how to use Abstract Wikipedia after being a Wikipedian for over 20 years, but it is very diffirent. When I look at an article in my own language, words like "is a" and "from" are not translated. I thought it could be a simple and helpful thing to translate those, but I cannot figure out how to do that. /[[User:abbedabb|<b style="color:#ff9c15">abbedabb</b>]][[User talk:abbedabb|<sup><small>talk</small></sup>]] 14:32, 22 October 2026 (UTC) :Try changing the language in the language input to the right side of "Generated text" to Swedish in AW. [[User:ReXLer|ReXLer]] ([[User talk:ReXLer|talk]]) 15:13, 22 October 2026 (UTC) hwq6n8i0fe10emxkzrv4uitw23fk4md 330898 330897 2026-10-22T15:20:24Z Abbedabb 102534 /* Translating "is a" (and similar) */ Reply 330898 wikitext text/x-wiki {{shortcut|[[WF:CHAT]]|[[WF:PC]]|[[WF:VP]]}} __NEWSECTIONLINK__ [[Category:Help]] <!-- please do not remove this line --> Welcome to the Project chat, a place to discuss any and all aspects of Wikifunctions: the project itself, policy and proposals, individual data items, technical issues, etc. Other places to find help: * [[Wikifunctions:Administrators' noticeboard]] * [[Wikifunctions:Report a technical problem]] * [[Wikifunctions:FAQ]] {{Autoarchive resolved section |age = 1 |archive = ((FULLPAGENAME))/Archive/((year))/((month:##)) |timeout=30 }} {{Archives|{{#tag:div|<br />{{Flatlist|{{Special:PrefixIndex/WF:Project chat/Archive/|stripprefix=1|hideredirects=1}} |class=mw-collapsible-content|style=font-size:92%;}}|class="mw-collapsible mw-collapsible-toggle mw-collapsed"}} |prefix=WF:Project chat/Archive/ }} == Draft policy for language fallback strategies == [[Help:Language fallback]]<br>I'd appreciate any comments, but I'm particularly seeking approval for this planned mass edit: * '[[Z25065|limited]]' in all [[:Category:Display functions]] * '[[Z14310|none]]' in all [[:Category:Reading functions]] * '[[Z25065|limited]]' in all [[:Category:Abstract description functions]] * NEW STRATEGY '[[Z40583|insistent]]' in all [[:Category:Semantic fragment functions]] (including the ones I haven't categorised yet) * '[[Z40583|insistent]]' in all [[:Category:Hatnote functions]] * '[[Z40583|insistent]]' in all [[:Category:Multilingual captioned image functions]] * '[[Z14310|none]]' in all [[:Category:Conjugation tables]] * '[[Z14310|none]]' in all {{Z|36462}}-producing functions? {{ping|Denny|p=}} * '[[Z25065|limited]]' in everything else: punctuation helpers, lexeme and inflection helpers, partial sentence functions... [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 01:52, 21 October 2026 (UTC) :I am happy that see that you want to structure the language fallback strategies. I can't oversee the consequences, but I trust you in this plan. [[User:HenkvD|HenkvD]] ([[User talk:HenkvD|talk]]) 11:46, 30 August 2026 (UTC) ::At first read, the policy looks great (even if a person speaking fr-CA will probably be angry with that example, despite being largely true). I also approve the planned mass edit so far, it's good to test that. Thanks for the work! [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 16:20, 30 August 2026 (UTC) :::It would also be very great to have a schema and more examples so the policy could be more understandable for newcomers. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 16:22, 30 August 2026 (UTC) :None for the Syntactic tables is a good idea, I think that one will go from experimental right to deprecated anyway. I am not sure yet about the Semantic fragment functions, and would like to see the effect once we have a few more. --[[User:Denny|Denny]] ([[User talk:Denny|talk]]) 11:48, 3 September 2026 (UTC) :Can you provide some examples of things that will change? --[[User:99of9|99of9]] ([[User talk:99of9|talk]]) 04:52, 11 September 2026 (UTC) ::'None' &rarr; 'Limited': {{Z|20780}} will use the Dutch implementation when Afrikaans is requested, instead of the ISO 8601 fallback.<br>'None' &rarr; 'Insistent': {{Z|36083}} will use the English implementation when German is requested, instead of the fallback that's just an arrow.<br>Improvements are very much dependent on how the fallback language lists are configured. And the [[Z14294]]s themselves&mdash;yesterday I went through and replaced hardcoded [ en, en-GB ] with {{Z|33034}}, but in a world where I hadn't, the 'Limited' strategy would be helpful in routing the dialects to en. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 17:13, 11 September 2026 (UTC) :::I'm a bit conflicted here (and I've flipped around in the past too, so don't expect consistency sorry!). In the main articles example, I feel like the default is better than displaying English for German. Main articles doesn't really need words. Certainly En-dialects should get English, but as you say, we have other ways of ensuring that. I don't know enough about Afrikaans to comment on that one. --[[User:99of9|99of9]] ([[User talk:99of9|talk]]) 03:58, 17 September 2026 (UTC) == i can create my own function? == i need enable my implementation for my function Z38065 [[User:Spider077|Spider077]] ([[User talk:Spider077|talk]]) 05:40, 6 September 2026 (UTC) :Please request connections at [[Wikifunctions:Requests for connection and disconnection]]. :I do not think this particular implementation should be connected. :# The function has no test cases, so its intended purpose is not entirely clear. :# The function appears to be a duplicate of {{Z|Z11602}}. :# The implementation will return an error because <code>Text</code> is undefined. :# In any event, <code>print()</code> returns the value <code>None</code>, so the implementation would end up returning {{Z|Z24}}. :Please feel free to reply here if you need any help. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 10:24, 6 September 2026 (UTC) ::I fixed[[File:The Quantum Code.png]] [[User:Spider077|Spider077]] ([[User talk:Spider077|talk]]) 14:30, 29 September 2026 (UTC) == Technical limitations or something on my side? == Hi there, I'm experimenting with different ways to improve NLG in French (many things to do). I experiment some limitations, I don't if they come from the software or something I did: # I tried to create a typed list in {{Z|Z42597}}, similarly to {{Z|Z38002}}, but impossible to add this type (I'm blocked with an empty content box). The Edit Raw JSON script also fails on publication. # I tried to find if an item is a subclass of another in {{Z|Z41641}} and {{Z|Z41649}}, but I only get the error "WASM interpreter aborted (unreachable executed)". Is it me? Or some current limitations? Are there workarounds? Any help appreciated! Cheers. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 14:38, 19 September 2026 (UTC) :1. Z42957 is a {{Z|Z6}}. It is possible to create a typed list of {{Z|Z6091}}, if that’s what you have in mind. :2. Yes, that’s a tricky one. I don’t have time right now, but I should be able to look at it in a few hours or tomorrow morning. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 18:24, 19 September 2026 (UTC) ::Thank you! For some reason I couldn't create a typed list earlier, but it looks fixed now (I was able to create {{Z|Z42639}}). The interface could still be a bit clearer... {{Z|Z42597}} can be deleted, btw. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 19:39, 19 September 2026 (UTC) :::Good. I agree, the interface for type specification is a little peculiar for “generic” types. :::I’ve had a little look at your second problem and I don’t have a quick fix. Theoretically, I think you want to apply the subclass test to each of the classes of which the item is an instance, having failed to establish that the item is an instance of the superclass. [https://www.wikifunctions.org/view/en/Z36572?call=%7B%22Z1K1%22%3A%22Z7%22%2C%22Z7K1%22%3A%22Z36572%22%2C%22Z36572K1%22%3A%7B%22Z1K1%22%3A%22Z7%22%2C%22Z7K1%22%3A%22Z30120%22%2C%22Z30120K1%22%3A%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q84%22%7D%2C%22Z30120K2%22%3A%5B%22Z6030%22%2C%22Z6036%22%5D%2C%22Z30120K3%22%3A%5B%22Z60%22%5D%2C%22Z30120K4%22%3A%5B%22Z6092%22%2C%7B%22Z1K1%22%3A%22Z6092%22%2C%22Z6092K1%22%3A%22P31%22%7D%5D%7D%2C%22Z36572K2%22%3A%5B%22Z6091%22%2C%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q486972%22%7D%5D%2C%22Z36572K3%22%3A%7B%22Z1K1%22%3A%22Z13518%22%2C%22Z13518K1%22%3A%223%22%7D%7D This function call] seems to work, but I would be worried about timing out, generally. It would perhaps be better to create a list of classes that are, ultimately, types of human settlement and only use the more expensive traversal for items that are not instances of any of those classes. I don’t see any such list currently, but the idea is expressed in {{Z|Z41921}}, so @[[User:Jsamwrites|Jsamwrites]] might be interested in collaborating. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 20:38, 19 September 2026 (UTC) ::::As I mentioned [[Talk:Z41920|here]], your solution is ideally correct, but because of technical limitations, I created a faster version for general French usages. [[User:Jsamwrites|John Samuel]] 21:11, 19 September 2026 (UTC) :::::Thanks @[[User:GrounderUK|GrounderUK]]! Any help or Phabricator page (or some dashboard) where we could understand what's likely to timeout? I would love to reduce the burden on the servers but I have no clue on what's causing it. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 11:41, 20 September 2026 (UTC) ::::::I’m not aware of a suitable page, but I think it would be a good idea to have one. Perhaps we should add it to [[Special:MyLanguage/Wikifunctions:How to create implementations]], which is linked to from every implementation? We should probably also have a general Phabricator task for logging errors that are hard to understand and/or impossible to translate. This might fit under [[:phab:T432195]], unless @[[User:LMorgantini-WMF|LMorgantini-WMF]] has a better suggestion. ::::::For now, I would only suggest that we: ::::::* generally avoid {{Z|Z6821}} and use either {{Z|Z6820}} or one of its wrappers, like {{Z|Z30120}} or {{Z|Z23762}} ::::::* test using smaller and fewer Wikidata items ::::::* use the same item(s) for different tests, where appropriate ::::::* avoid unnecessary variation in fetch calls. ::::::[[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 13:19, 20 September 2026 (UTC) :::::::* If a function does not need to pull labels or statements from an Item/Property/Lexeme, it should not fetch it. :::::::** When a label or statement ''is'' needed, from that point on you should only pass around the fetched Item/etc. and not its reference. Unfortunately the naming conventions and [[WF:Catalogue/Wikidata_operations/Item#Labels_and_aliases|catalogue]] aren't very helpful for finding the right label functions at the moment. :::::::* Replace {{Z|22820}} with specialised filter functions where possible to avoid having to repeat a long expression. :::::::* When implementing by composition, try to do it without recursion, at least until a non-recursive or code implementation gets connected. Recursive compositions are slower and more annoying to debug. (Code implementations can use recursion with much less overhead, but are limited in other ways ofc.) :::::::* Embedded function calls often fail, even when the same arguments work fine when used on the function's view page. Must be a separate cache. :::::::[[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 22:24, 20 September 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #266: Memoization arriving == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-09-25|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we talk about storing a function call's result in a cache for easier recalling, we analyse how quickly one particular fact propagates through different Wikipedia language editions, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 09:54, 28 September 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=30951652 --> :This memoization is at the global level, but are subexpressions repeated within a composition also memoized / is that planned? Because I've been writing compositions assuming that they would. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 09:59, 28 September 2026 (UTC) ::Memoization is working on subexpressions. It should capture repeated subcalls within a composition and even across different calls to the orchestrator, so your assumption is safe. ::HOWEVER, be aware that we're only memoizing a very short list of functions so far (<code>[ 'Z860', 'Z885', 'Z101', 'Z10047', 'Z189' ]</code>). We plan to expand this list in future. Very open to suggestions about which functions we should consider; we've based these decisions on benchmarks but would also benefit from advice from composition implementers! [[User:CMassaro (WMF)|CMassaro (WMF)]] ([[User talk:CMassaro (WMF)|talk]]) 17:10, 29 September 2026 (UTC) :::I think it’s worth distinguishing between extrinsic caching of function call results and intrinsic memoization of objects during a function call evaluation. To my mind, “subexpressions repeated within a composition” would fall into the latter category (function call or not), and I believe the Orchestrator generally realizes a repeated subexpression (identical object) only once during a single function call’s evaluation. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 00:08, 30 September 2026 (UTC) :::Good to hear. As for what to do next, I wouldn't trust my intuition over actually measuring. Maybe display functions? [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 06:18, 30 September 2026 (UTC) :::I think the community should avoid recommending functions specifically for memoization. We can highlight functions of particular concern, leaving it to the team to consider whether memoization, new builtins or something else would be the preferred solution. Top of my list is {{Z|Z14310}}, which is a critical dependency for almost all Abstract Wikipedia calls as well as our reading and display functions. This should be considered alongside [[:phab:T390226|T390226: Consider using list inputs to create variadic apply, filter, map, etc. functions]], since the selected function is always applied. :::We should also consider: :::* {{Z|Z13052}} • {{Z|Z18683}} • {{Z|Z29294}} • {{Z|Z12696}} :::* {{Z|Z13676}} • {{Z|Z17132}} • {{Z|Z19751}} (or less than, etc) :::* {{Z|Z20943}} :::* {{Z|Z12899}} (or some other string-concatenation function) :::* {{Z|Z18475}} :::I believe that none of the above functions can currently be evaluated without ultimately requiring traversal into code. The groupings reflect my belief that improving any member of the set can improve all members. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 14:08, 1 October 2026 (UTC) ::::{{TakeNote}} My previous reply prioritizing {{Z|Z14310}} was written before [[:phab:T440032|DE2.2.10: Improve language-specific function creation]]. Although that Hypothesis is presented as a usability improvement, I think the solution there should be designed to address the scaling, performance and resilience issues [[:phab:T419789#11782917|previously noted]]. @[[User:Jdforrester (WMF)|Jdforrester (WMF)]] [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 12:18, 11 October 2026 (UTC) :::Ping @[[User:CMassaro (WMF)|CMassaro (WMF)]] [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 11:40, 11 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #267: Refreshing results == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-02|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we talk about two new capabilities addressing the issues of caching and freshness of function call results, we introduce our groundwork to support the first pilot communities for Abstract Wikipedia, we discuss news in Types, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 09:31, 2 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31099195 --> == Reached rate limit in evaluator == I increasingly get errors like "Reached rate limit in evaluator" or "The rendering service is temporarily unavailable. Please, try again later". This makes it almost impossible to work. [[User:HenkvD|HenkvD]] ([[User talk:HenkvD|talk]]) 11:08, 9 October 2026 (UTC) :Tracked in [[phab:T438643]] [[User:鈴音雨|鈴音雨]] ([[User talk:鈴音雨|talk]]) 15:06, 9 October 2026 (UTC) :P.S. I have created a userscript that can mitigate this issue to some extent [[User:鈴音雨/WFSpinner]]. [[User:鈴音雨|鈴音雨]] ([[User talk:鈴音雨|talk]]) 14:12, 10 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #268: Quarterly planning == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-09|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we discuss the work we have planned for this quarter (October-December 2026), we introduce news in Types, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Also, we remind you that if you have questions or ideas to discuss, the next '''Volunteers' Corner''' will be held on '''[https://zonestamp.toolforge.org/1791826200 October 12, at 17:30 UTC]''' ([https://meet.google.com/xuy-njxh-rkw link to the meeting]). Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 15:42, 10 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31143368 --> :<q>While [Z91/Z92] were really important for having translatable HTML error messages, we believe they can also be used for a lot other things [...]</q><br>So [[Talk:Z91#Generality|that's a no]], then. I don't mean to sound ungrateful, but we still don't have consistency with the current text Types, so telling us to adopt more is only going to result in fragmentation and confusion, at least in the short term. And there isn't a way (except a message/template on the talk page) to [[WF:Type_proposals/Typed_string|distinguish]] when a {{Z|91}}, or any textual object, contains <code>$1</code> markers which need to be replaced. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 21:57, 10 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #269: Changes in evaluator representations == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-17|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we introduce our latest changes in evaluator representations, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 10:46, 17 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31162541 --> == October 2026 Wikimedia Café: legal issues on Commons, and WMF Board selection process == <div class="border-box" style="background-color: var(--background-color-warning-subtle, #f8eaba); max-width: 875px; padding: 5px; border: 1px solid black; margin: 5px; color: var(--clr-dark)"> <div class="box" style="float:left; padding-top: 10px; padding-right: 10px; padding-left: 10px; padding-bottom: 10px;">[[File:Wikimedia Café logo in plain SVG format.svg|60px|alt=The logo for the Wikimedia Café]]</div> Hello! There will be two '''[https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9 Wikimedia Café]''' discussion opportunities in October. In a change from the usual Café practice, this month's sessions will have different topics. Anyone who meets the Café attendance criteria is welcome to attend either or both sessions. Session A will happen on Saturday, 24 October 2026 at 15:00 UTC ([https://zonestamp.toolforge.org/1792854000 timestamp converter]), at a time friendly to the Americas, Africa, and Europe. This session will feature [https://meta.wikimedia.org/wiki/User:PBradley-WMF Wikimedia Foundation lawyer Phil Bradley-Schmieg]. We will discuss legal issues on Wikimedia Commons, including complexities of international law. (I am hoping that in a future month, a similar Café session will be offered at a time friendly to Asia and the Pacific.) Session B will happen on Sunday, 25 October 2026 at 03:00 UTC ([https://zonestamp.toolforge.org/1792897200 timestamp converter]), at a time friendly to Asia and the Pacific, we will discuss [https://meta.wikimedia.org/wiki/Wikimedia_Foundation_elections/2027/Proposed_eligibility_criteria proposed changes to how Wikimedia Foundation Board candidates are selected]. The latest proposals are much different from the earlier July 2026 proposals. The due date for feedback on current proposals is 27 October, and Wikimedians are welcome to participate on the [https://meta.wikimedia.org/wiki/Talk:Wikimedia_Foundation_elections/2027/Proposed_eligibility_criteria proposal talk page] regardless of Café attendance. Please see the [https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9 Café] page for more information, including [https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9#How_to_attend_the_session how to register]! To subscribe or unsubscribe for Café notices on your talk page please [https://meta.wikimedia.org/wiki/Global_message_delivery/Targets/Wikimedia_Caf%C3%A9 go here]. <br /> [[File:Buntstifte Eberhard Faber crop 64h.jpg|860px|alt=cropped image of colored pencils]]</div> <span style="white-space:nowrap;">[[User:Pine|<span style="color:#01796f; text-shadow:#00BFFF 0 0 1.0em">༄ᨒ𖠰 Pine</span>]] [[User talk:Pine|<span style="color:DeepSkyBlue">(<b style="color:#FFDF00;text-shadow:#FFDF00 0 0 1.0em">✉</b>)</span>]]</span> 06:25, 18 October 2026 (UTC) == Translating "is a" (and similar) == I am trying to learn how to use Abstract Wikipedia after being a Wikipedian for over 20 years, but it is very diffirent. When I look at an article in my own language, words like "is a" and "from" are not translated. I thought it could be a simple and helpful thing to translate those, but I cannot figure out how to do that. /[[User:abbedabb|<b style="color:#ff9c15">abbedabb</b>]][[User talk:abbedabb|<sup><small>talk</small></sup>]] 14:32, 22 October 2026 (UTC) :Try changing the language in the language input to the right side of "Generated text" to Swedish in AW. [[User:ReXLer|ReXLer]] ([[User talk:ReXLer|talk]]) 15:13, 22 October 2026 (UTC) ::That does not answer my question. The generated text is already set to Swedish, but the result is: ::"Astrid Lindgren (is a) författare (from) Sverige." ::/[[User:abbedabb|<b style="color:#ff9c15">abbedabb</b>]][[User talk:abbedabb|<sup><small>talk</small></sup>]] 15:20, 22 October 2026 (UTC) ap58ueu2grv5m3tp8386qpti5cwugtr 330899 330898 2026-10-22T15:22:23Z Abbedabb 102534 /* Translating "is a" (and similar) */ 330899 wikitext text/x-wiki {{shortcut|[[WF:CHAT]]|[[WF:PC]]|[[WF:VP]]}} __NEWSECTIONLINK__ [[Category:Help]] <!-- please do not remove this line --> Welcome to the Project chat, a place to discuss any and all aspects of Wikifunctions: the project itself, policy and proposals, individual data items, technical issues, etc. Other places to find help: * [[Wikifunctions:Administrators' noticeboard]] * [[Wikifunctions:Report a technical problem]] * [[Wikifunctions:FAQ]] {{Autoarchive resolved section |age = 1 |archive = ((FULLPAGENAME))/Archive/((year))/((month:##)) |timeout=30 }} {{Archives|{{#tag:div|<br />{{Flatlist|{{Special:PrefixIndex/WF:Project chat/Archive/|stripprefix=1|hideredirects=1}} |class=mw-collapsible-content|style=font-size:92%;}}|class="mw-collapsible mw-collapsible-toggle mw-collapsed"}} |prefix=WF:Project chat/Archive/ }} == Draft policy for language fallback strategies == [[Help:Language fallback]]<br>I'd appreciate any comments, but I'm particularly seeking approval for this planned mass edit: * '[[Z25065|limited]]' in all [[:Category:Display functions]] * '[[Z14310|none]]' in all [[:Category:Reading functions]] * '[[Z25065|limited]]' in all [[:Category:Abstract description functions]] * NEW STRATEGY '[[Z40583|insistent]]' in all [[:Category:Semantic fragment functions]] (including the ones I haven't categorised yet) * '[[Z40583|insistent]]' in all [[:Category:Hatnote functions]] * '[[Z40583|insistent]]' in all [[:Category:Multilingual captioned image functions]] * '[[Z14310|none]]' in all [[:Category:Conjugation tables]] * '[[Z14310|none]]' in all {{Z|36462}}-producing functions? {{ping|Denny|p=}} * '[[Z25065|limited]]' in everything else: punctuation helpers, lexeme and inflection helpers, partial sentence functions... [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 01:52, 21 October 2026 (UTC) :I am happy that see that you want to structure the language fallback strategies. I can't oversee the consequences, but I trust you in this plan. [[User:HenkvD|HenkvD]] ([[User talk:HenkvD|talk]]) 11:46, 30 August 2026 (UTC) ::At first read, the policy looks great (even if a person speaking fr-CA will probably be angry with that example, despite being largely true). I also approve the planned mass edit so far, it's good to test that. Thanks for the work! [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 16:20, 30 August 2026 (UTC) :::It would also be very great to have a schema and more examples so the policy could be more understandable for newcomers. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 16:22, 30 August 2026 (UTC) :None for the Syntactic tables is a good idea, I think that one will go from experimental right to deprecated anyway. I am not sure yet about the Semantic fragment functions, and would like to see the effect once we have a few more. --[[User:Denny|Denny]] ([[User talk:Denny|talk]]) 11:48, 3 September 2026 (UTC) :Can you provide some examples of things that will change? --[[User:99of9|99of9]] ([[User talk:99of9|talk]]) 04:52, 11 September 2026 (UTC) ::'None' &rarr; 'Limited': {{Z|20780}} will use the Dutch implementation when Afrikaans is requested, instead of the ISO 8601 fallback.<br>'None' &rarr; 'Insistent': {{Z|36083}} will use the English implementation when German is requested, instead of the fallback that's just an arrow.<br>Improvements are very much dependent on how the fallback language lists are configured. And the [[Z14294]]s themselves&mdash;yesterday I went through and replaced hardcoded [ en, en-GB ] with {{Z|33034}}, but in a world where I hadn't, the 'Limited' strategy would be helpful in routing the dialects to en. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 17:13, 11 September 2026 (UTC) :::I'm a bit conflicted here (and I've flipped around in the past too, so don't expect consistency sorry!). In the main articles example, I feel like the default is better than displaying English for German. Main articles doesn't really need words. Certainly En-dialects should get English, but as you say, we have other ways of ensuring that. I don't know enough about Afrikaans to comment on that one. --[[User:99of9|99of9]] ([[User talk:99of9|talk]]) 03:58, 17 September 2026 (UTC) == i can create my own function? == i need enable my implementation for my function Z38065 [[User:Spider077|Spider077]] ([[User talk:Spider077|talk]]) 05:40, 6 September 2026 (UTC) :Please request connections at [[Wikifunctions:Requests for connection and disconnection]]. :I do not think this particular implementation should be connected. :# The function has no test cases, so its intended purpose is not entirely clear. :# The function appears to be a duplicate of {{Z|Z11602}}. :# The implementation will return an error because <code>Text</code> is undefined. :# In any event, <code>print()</code> returns the value <code>None</code>, so the implementation would end up returning {{Z|Z24}}. :Please feel free to reply here if you need any help. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 10:24, 6 September 2026 (UTC) ::I fixed[[File:The Quantum Code.png]] [[User:Spider077|Spider077]] ([[User talk:Spider077|talk]]) 14:30, 29 September 2026 (UTC) == Technical limitations or something on my side? == Hi there, I'm experimenting with different ways to improve NLG in French (many things to do). I experiment some limitations, I don't if they come from the software or something I did: # I tried to create a typed list in {{Z|Z42597}}, similarly to {{Z|Z38002}}, but impossible to add this type (I'm blocked with an empty content box). The Edit Raw JSON script also fails on publication. # I tried to find if an item is a subclass of another in {{Z|Z41641}} and {{Z|Z41649}}, but I only get the error "WASM interpreter aborted (unreachable executed)". Is it me? Or some current limitations? Are there workarounds? Any help appreciated! Cheers. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 14:38, 19 September 2026 (UTC) :1. Z42957 is a {{Z|Z6}}. It is possible to create a typed list of {{Z|Z6091}}, if that’s what you have in mind. :2. Yes, that’s a tricky one. I don’t have time right now, but I should be able to look at it in a few hours or tomorrow morning. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 18:24, 19 September 2026 (UTC) ::Thank you! For some reason I couldn't create a typed list earlier, but it looks fixed now (I was able to create {{Z|Z42639}}). The interface could still be a bit clearer... {{Z|Z42597}} can be deleted, btw. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 19:39, 19 September 2026 (UTC) :::Good. I agree, the interface for type specification is a little peculiar for “generic” types. :::I’ve had a little look at your second problem and I don’t have a quick fix. Theoretically, I think you want to apply the subclass test to each of the classes of which the item is an instance, having failed to establish that the item is an instance of the superclass. [https://www.wikifunctions.org/view/en/Z36572?call=%7B%22Z1K1%22%3A%22Z7%22%2C%22Z7K1%22%3A%22Z36572%22%2C%22Z36572K1%22%3A%7B%22Z1K1%22%3A%22Z7%22%2C%22Z7K1%22%3A%22Z30120%22%2C%22Z30120K1%22%3A%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q84%22%7D%2C%22Z30120K2%22%3A%5B%22Z6030%22%2C%22Z6036%22%5D%2C%22Z30120K3%22%3A%5B%22Z60%22%5D%2C%22Z30120K4%22%3A%5B%22Z6092%22%2C%7B%22Z1K1%22%3A%22Z6092%22%2C%22Z6092K1%22%3A%22P31%22%7D%5D%7D%2C%22Z36572K2%22%3A%5B%22Z6091%22%2C%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q486972%22%7D%5D%2C%22Z36572K3%22%3A%7B%22Z1K1%22%3A%22Z13518%22%2C%22Z13518K1%22%3A%223%22%7D%7D This function call] seems to work, but I would be worried about timing out, generally. It would perhaps be better to create a list of classes that are, ultimately, types of human settlement and only use the more expensive traversal for items that are not instances of any of those classes. I don’t see any such list currently, but the idea is expressed in {{Z|Z41921}}, so @[[User:Jsamwrites|Jsamwrites]] might be interested in collaborating. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 20:38, 19 September 2026 (UTC) ::::As I mentioned [[Talk:Z41920|here]], your solution is ideally correct, but because of technical limitations, I created a faster version for general French usages. [[User:Jsamwrites|John Samuel]] 21:11, 19 September 2026 (UTC) :::::Thanks @[[User:GrounderUK|GrounderUK]]! Any help or Phabricator page (or some dashboard) where we could understand what's likely to timeout? I would love to reduce the burden on the servers but I have no clue on what's causing it. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 11:41, 20 September 2026 (UTC) ::::::I’m not aware of a suitable page, but I think it would be a good idea to have one. Perhaps we should add it to [[Special:MyLanguage/Wikifunctions:How to create implementations]], which is linked to from every implementation? We should probably also have a general Phabricator task for logging errors that are hard to understand and/or impossible to translate. This might fit under [[:phab:T432195]], unless @[[User:LMorgantini-WMF|LMorgantini-WMF]] has a better suggestion. ::::::For now, I would only suggest that we: ::::::* generally avoid {{Z|Z6821}} and use either {{Z|Z6820}} or one of its wrappers, like {{Z|Z30120}} or {{Z|Z23762}} ::::::* test using smaller and fewer Wikidata items ::::::* use the same item(s) for different tests, where appropriate ::::::* avoid unnecessary variation in fetch calls. ::::::[[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 13:19, 20 September 2026 (UTC) :::::::* If a function does not need to pull labels or statements from an Item/Property/Lexeme, it should not fetch it. :::::::** When a label or statement ''is'' needed, from that point on you should only pass around the fetched Item/etc. and not its reference. Unfortunately the naming conventions and [[WF:Catalogue/Wikidata_operations/Item#Labels_and_aliases|catalogue]] aren't very helpful for finding the right label functions at the moment. :::::::* Replace {{Z|22820}} with specialised filter functions where possible to avoid having to repeat a long expression. :::::::* When implementing by composition, try to do it without recursion, at least until a non-recursive or code implementation gets connected. Recursive compositions are slower and more annoying to debug. (Code implementations can use recursion with much less overhead, but are limited in other ways ofc.) :::::::* Embedded function calls often fail, even when the same arguments work fine when used on the function's view page. Must be a separate cache. :::::::[[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 22:24, 20 September 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #266: Memoization arriving == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-09-25|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we talk about storing a function call's result in a cache for easier recalling, we analyse how quickly one particular fact propagates through different Wikipedia language editions, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 09:54, 28 September 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=30951652 --> :This memoization is at the global level, but are subexpressions repeated within a composition also memoized / is that planned? Because I've been writing compositions assuming that they would. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 09:59, 28 September 2026 (UTC) ::Memoization is working on subexpressions. It should capture repeated subcalls within a composition and even across different calls to the orchestrator, so your assumption is safe. ::HOWEVER, be aware that we're only memoizing a very short list of functions so far (<code>[ 'Z860', 'Z885', 'Z101', 'Z10047', 'Z189' ]</code>). We plan to expand this list in future. Very open to suggestions about which functions we should consider; we've based these decisions on benchmarks but would also benefit from advice from composition implementers! [[User:CMassaro (WMF)|CMassaro (WMF)]] ([[User talk:CMassaro (WMF)|talk]]) 17:10, 29 September 2026 (UTC) :::I think it’s worth distinguishing between extrinsic caching of function call results and intrinsic memoization of objects during a function call evaluation. To my mind, “subexpressions repeated within a composition” would fall into the latter category (function call or not), and I believe the Orchestrator generally realizes a repeated subexpression (identical object) only once during a single function call’s evaluation. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 00:08, 30 September 2026 (UTC) :::Good to hear. As for what to do next, I wouldn't trust my intuition over actually measuring. Maybe display functions? [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 06:18, 30 September 2026 (UTC) :::I think the community should avoid recommending functions specifically for memoization. We can highlight functions of particular concern, leaving it to the team to consider whether memoization, new builtins or something else would be the preferred solution. Top of my list is {{Z|Z14310}}, which is a critical dependency for almost all Abstract Wikipedia calls as well as our reading and display functions. This should be considered alongside [[:phab:T390226|T390226: Consider using list inputs to create variadic apply, filter, map, etc. functions]], since the selected function is always applied. :::We should also consider: :::* {{Z|Z13052}} • {{Z|Z18683}} • {{Z|Z29294}} • {{Z|Z12696}} :::* {{Z|Z13676}} • {{Z|Z17132}} • {{Z|Z19751}} (or less than, etc) :::* {{Z|Z20943}} :::* {{Z|Z12899}} (or some other string-concatenation function) :::* {{Z|Z18475}} :::I believe that none of the above functions can currently be evaluated without ultimately requiring traversal into code. The groupings reflect my belief that improving any member of the set can improve all members. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 14:08, 1 October 2026 (UTC) ::::{{TakeNote}} My previous reply prioritizing {{Z|Z14310}} was written before [[:phab:T440032|DE2.2.10: Improve language-specific function creation]]. Although that Hypothesis is presented as a usability improvement, I think the solution there should be designed to address the scaling, performance and resilience issues [[:phab:T419789#11782917|previously noted]]. @[[User:Jdforrester (WMF)|Jdforrester (WMF)]] [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 12:18, 11 October 2026 (UTC) :::Ping @[[User:CMassaro (WMF)|CMassaro (WMF)]] [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 11:40, 11 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #267: Refreshing results == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-02|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we talk about two new capabilities addressing the issues of caching and freshness of function call results, we introduce our groundwork to support the first pilot communities for Abstract Wikipedia, we discuss news in Types, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 09:31, 2 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31099195 --> == Reached rate limit in evaluator == I increasingly get errors like "Reached rate limit in evaluator" or "The rendering service is temporarily unavailable. Please, try again later". This makes it almost impossible to work. [[User:HenkvD|HenkvD]] ([[User talk:HenkvD|talk]]) 11:08, 9 October 2026 (UTC) :Tracked in [[phab:T438643]] [[User:鈴音雨|鈴音雨]] ([[User talk:鈴音雨|talk]]) 15:06, 9 October 2026 (UTC) :P.S. I have created a userscript that can mitigate this issue to some extent [[User:鈴音雨/WFSpinner]]. [[User:鈴音雨|鈴音雨]] ([[User talk:鈴音雨|talk]]) 14:12, 10 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #268: Quarterly planning == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-09|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we discuss the work we have planned for this quarter (October-December 2026), we introduce news in Types, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Also, we remind you that if you have questions or ideas to discuss, the next '''Volunteers' Corner''' will be held on '''[https://zonestamp.toolforge.org/1791826200 October 12, at 17:30 UTC]''' ([https://meet.google.com/xuy-njxh-rkw link to the meeting]). Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 15:42, 10 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31143368 --> :<q>While [Z91/Z92] were really important for having translatable HTML error messages, we believe they can also be used for a lot other things [...]</q><br>So [[Talk:Z91#Generality|that's a no]], then. I don't mean to sound ungrateful, but we still don't have consistency with the current text Types, so telling us to adopt more is only going to result in fragmentation and confusion, at least in the short term. And there isn't a way (except a message/template on the talk page) to [[WF:Type_proposals/Typed_string|distinguish]] when a {{Z|91}}, or any textual object, contains <code>$1</code> markers which need to be replaced. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 21:57, 10 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #269: Changes in evaluator representations == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-17|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we introduce our latest changes in evaluator representations, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 10:46, 17 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31162541 --> == October 2026 Wikimedia Café: legal issues on Commons, and WMF Board selection process == <div class="border-box" style="background-color: var(--background-color-warning-subtle, #f8eaba); max-width: 875px; padding: 5px; border: 1px solid black; margin: 5px; color: var(--clr-dark)"> <div class="box" style="float:left; padding-top: 10px; padding-right: 10px; padding-left: 10px; padding-bottom: 10px;">[[File:Wikimedia Café logo in plain SVG format.svg|60px|alt=The logo for the Wikimedia Café]]</div> Hello! There will be two '''[https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9 Wikimedia Café]''' discussion opportunities in October. In a change from the usual Café practice, this month's sessions will have different topics. Anyone who meets the Café attendance criteria is welcome to attend either or both sessions. Session A will happen on Saturday, 24 October 2026 at 15:00 UTC ([https://zonestamp.toolforge.org/1792854000 timestamp converter]), at a time friendly to the Americas, Africa, and Europe. This session will feature [https://meta.wikimedia.org/wiki/User:PBradley-WMF Wikimedia Foundation lawyer Phil Bradley-Schmieg]. We will discuss legal issues on Wikimedia Commons, including complexities of international law. (I am hoping that in a future month, a similar Café session will be offered at a time friendly to Asia and the Pacific.) Session B will happen on Sunday, 25 October 2026 at 03:00 UTC ([https://zonestamp.toolforge.org/1792897200 timestamp converter]), at a time friendly to Asia and the Pacific, we will discuss [https://meta.wikimedia.org/wiki/Wikimedia_Foundation_elections/2027/Proposed_eligibility_criteria proposed changes to how Wikimedia Foundation Board candidates are selected]. The latest proposals are much different from the earlier July 2026 proposals. The due date for feedback on current proposals is 27 October, and Wikimedians are welcome to participate on the [https://meta.wikimedia.org/wiki/Talk:Wikimedia_Foundation_elections/2027/Proposed_eligibility_criteria proposal talk page] regardless of Café attendance. Please see the [https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9 Café] page for more information, including [https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9#How_to_attend_the_session how to register]! To subscribe or unsubscribe for Café notices on your talk page please [https://meta.wikimedia.org/wiki/Global_message_delivery/Targets/Wikimedia_Caf%C3%A9 go here]. <br /> [[File:Buntstifte Eberhard Faber crop 64h.jpg|860px|alt=cropped image of colored pencils]]</div> <span style="white-space:nowrap;">[[User:Pine|<span style="color:#01796f; text-shadow:#00BFFF 0 0 1.0em">༄ᨒ𖠰 Pine</span>]] [[User talk:Pine|<span style="color:DeepSkyBlue">(<b style="color:#FFDF00;text-shadow:#FFDF00 0 0 1.0em">✉</b>)</span>]]</span> 06:25, 18 October 2026 (UTC) == Translating "is a" (and similar) == I am trying to learn how to use Abstract Wikipedia after being a Wikipedian for over 20 years, but it is very diffirent. When I look at an article in my own language, words like "is a" and "from" are not translated. I thought it could be a simple and helpful thing to translate those, but I cannot figure out how to do that. /[[User:abbedabb|<b style="color:#ff9c15">abbedabb</b>]][[User talk:abbedabb|<sup><small>talk</small></sup>]] 14:32, 22 October 2026 (UTC) :Try changing the language in the language input to the right side of "Generated text" to Swedish in AW. [[User:ReXLer|ReXLer]] ([[User talk:ReXLer|talk]]) 15:13, 22 October 2026 (UTC) ::That does not answer my question. The generated text is already set to Swedish, but the result is: ::"Astrid Lindgren (is a) författare (from) Sverige." ([https://abstract.wikipedia.org/view/sv/Q55767 link]) ::/[[User:abbedabb|<b style="color:#ff9c15">abbedabb</b>]][[User talk:abbedabb|<sup><small>talk</small></sup>]] 15:20, 22 October 2026 (UTC) 1u8do81m73bssa8pakf9ycccrogwmm8 330900 330899 2026-10-22T15:33:18Z ReXLer 39813 /* Translating "is a" (and similar) */ Reply 330900 wikitext text/x-wiki {{shortcut|[[WF:CHAT]]|[[WF:PC]]|[[WF:VP]]}} __NEWSECTIONLINK__ [[Category:Help]] <!-- please do not remove this line --> Welcome to the Project chat, a place to discuss any and all aspects of Wikifunctions: the project itself, policy and proposals, individual data items, technical issues, etc. Other places to find help: * [[Wikifunctions:Administrators' noticeboard]] * [[Wikifunctions:Report a technical problem]] * [[Wikifunctions:FAQ]] {{Autoarchive resolved section |age = 1 |archive = ((FULLPAGENAME))/Archive/((year))/((month:##)) |timeout=30 }} {{Archives|{{#tag:div|<br />{{Flatlist|{{Special:PrefixIndex/WF:Project chat/Archive/|stripprefix=1|hideredirects=1}} |class=mw-collapsible-content|style=font-size:92%;}}|class="mw-collapsible mw-collapsible-toggle mw-collapsed"}} |prefix=WF:Project chat/Archive/ }} == Draft policy for language fallback strategies == [[Help:Language fallback]]<br>I'd appreciate any comments, but I'm particularly seeking approval for this planned mass edit: * '[[Z25065|limited]]' in all [[:Category:Display functions]] * '[[Z14310|none]]' in all [[:Category:Reading functions]] * '[[Z25065|limited]]' in all [[:Category:Abstract description functions]] * NEW STRATEGY '[[Z40583|insistent]]' in all [[:Category:Semantic fragment functions]] (including the ones I haven't categorised yet) * '[[Z40583|insistent]]' in all [[:Category:Hatnote functions]] * '[[Z40583|insistent]]' in all [[:Category:Multilingual captioned image functions]] * '[[Z14310|none]]' in all [[:Category:Conjugation tables]] * '[[Z14310|none]]' in all {{Z|36462}}-producing functions? {{ping|Denny|p=}} * '[[Z25065|limited]]' in everything else: punctuation helpers, lexeme and inflection helpers, partial sentence functions... [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 01:52, 21 October 2026 (UTC) :I am happy that see that you want to structure the language fallback strategies. I can't oversee the consequences, but I trust you in this plan. [[User:HenkvD|HenkvD]] ([[User talk:HenkvD|talk]]) 11:46, 30 August 2026 (UTC) ::At first read, the policy looks great (even if a person speaking fr-CA will probably be angry with that example, despite being largely true). I also approve the planned mass edit so far, it's good to test that. Thanks for the work! [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 16:20, 30 August 2026 (UTC) :::It would also be very great to have a schema and more examples so the policy could be more understandable for newcomers. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 16:22, 30 August 2026 (UTC) :None for the Syntactic tables is a good idea, I think that one will go from experimental right to deprecated anyway. I am not sure yet about the Semantic fragment functions, and would like to see the effect once we have a few more. --[[User:Denny|Denny]] ([[User talk:Denny|talk]]) 11:48, 3 September 2026 (UTC) :Can you provide some examples of things that will change? --[[User:99of9|99of9]] ([[User talk:99of9|talk]]) 04:52, 11 September 2026 (UTC) ::'None' &rarr; 'Limited': {{Z|20780}} will use the Dutch implementation when Afrikaans is requested, instead of the ISO 8601 fallback.<br>'None' &rarr; 'Insistent': {{Z|36083}} will use the English implementation when German is requested, instead of the fallback that's just an arrow.<br>Improvements are very much dependent on how the fallback language lists are configured. And the [[Z14294]]s themselves&mdash;yesterday I went through and replaced hardcoded [ en, en-GB ] with {{Z|33034}}, but in a world where I hadn't, the 'Limited' strategy would be helpful in routing the dialects to en. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 17:13, 11 September 2026 (UTC) :::I'm a bit conflicted here (and I've flipped around in the past too, so don't expect consistency sorry!). In the main articles example, I feel like the default is better than displaying English for German. Main articles doesn't really need words. Certainly En-dialects should get English, but as you say, we have other ways of ensuring that. I don't know enough about Afrikaans to comment on that one. --[[User:99of9|99of9]] ([[User talk:99of9|talk]]) 03:58, 17 September 2026 (UTC) == i can create my own function? == i need enable my implementation for my function Z38065 [[User:Spider077|Spider077]] ([[User talk:Spider077|talk]]) 05:40, 6 September 2026 (UTC) :Please request connections at [[Wikifunctions:Requests for connection and disconnection]]. :I do not think this particular implementation should be connected. :# The function has no test cases, so its intended purpose is not entirely clear. :# The function appears to be a duplicate of {{Z|Z11602}}. :# The implementation will return an error because <code>Text</code> is undefined. :# In any event, <code>print()</code> returns the value <code>None</code>, so the implementation would end up returning {{Z|Z24}}. :Please feel free to reply here if you need any help. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 10:24, 6 September 2026 (UTC) ::I fixed[[File:The Quantum Code.png]] [[User:Spider077|Spider077]] ([[User talk:Spider077|talk]]) 14:30, 29 September 2026 (UTC) == Technical limitations or something on my side? == Hi there, I'm experimenting with different ways to improve NLG in French (many things to do). I experiment some limitations, I don't if they come from the software or something I did: # I tried to create a typed list in {{Z|Z42597}}, similarly to {{Z|Z38002}}, but impossible to add this type (I'm blocked with an empty content box). The Edit Raw JSON script also fails on publication. # I tried to find if an item is a subclass of another in {{Z|Z41641}} and {{Z|Z41649}}, but I only get the error "WASM interpreter aborted (unreachable executed)". Is it me? Or some current limitations? Are there workarounds? Any help appreciated! Cheers. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 14:38, 19 September 2026 (UTC) :1. Z42957 is a {{Z|Z6}}. It is possible to create a typed list of {{Z|Z6091}}, if that’s what you have in mind. :2. Yes, that’s a tricky one. I don’t have time right now, but I should be able to look at it in a few hours or tomorrow morning. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 18:24, 19 September 2026 (UTC) ::Thank you! For some reason I couldn't create a typed list earlier, but it looks fixed now (I was able to create {{Z|Z42639}}). The interface could still be a bit clearer... {{Z|Z42597}} can be deleted, btw. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 19:39, 19 September 2026 (UTC) :::Good. I agree, the interface for type specification is a little peculiar for “generic” types. :::I’ve had a little look at your second problem and I don’t have a quick fix. Theoretically, I think you want to apply the subclass test to each of the classes of which the item is an instance, having failed to establish that the item is an instance of the superclass. [https://www.wikifunctions.org/view/en/Z36572?call=%7B%22Z1K1%22%3A%22Z7%22%2C%22Z7K1%22%3A%22Z36572%22%2C%22Z36572K1%22%3A%7B%22Z1K1%22%3A%22Z7%22%2C%22Z7K1%22%3A%22Z30120%22%2C%22Z30120K1%22%3A%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q84%22%7D%2C%22Z30120K2%22%3A%5B%22Z6030%22%2C%22Z6036%22%5D%2C%22Z30120K3%22%3A%5B%22Z60%22%5D%2C%22Z30120K4%22%3A%5B%22Z6092%22%2C%7B%22Z1K1%22%3A%22Z6092%22%2C%22Z6092K1%22%3A%22P31%22%7D%5D%7D%2C%22Z36572K2%22%3A%5B%22Z6091%22%2C%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q486972%22%7D%5D%2C%22Z36572K3%22%3A%7B%22Z1K1%22%3A%22Z13518%22%2C%22Z13518K1%22%3A%223%22%7D%7D This function call] seems to work, but I would be worried about timing out, generally. It would perhaps be better to create a list of classes that are, ultimately, types of human settlement and only use the more expensive traversal for items that are not instances of any of those classes. I don’t see any such list currently, but the idea is expressed in {{Z|Z41921}}, so @[[User:Jsamwrites|Jsamwrites]] might be interested in collaborating. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 20:38, 19 September 2026 (UTC) ::::As I mentioned [[Talk:Z41920|here]], your solution is ideally correct, but because of technical limitations, I created a faster version for general French usages. [[User:Jsamwrites|John Samuel]] 21:11, 19 September 2026 (UTC) :::::Thanks @[[User:GrounderUK|GrounderUK]]! Any help or Phabricator page (or some dashboard) where we could understand what's likely to timeout? I would love to reduce the burden on the servers but I have no clue on what's causing it. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 11:41, 20 September 2026 (UTC) ::::::I’m not aware of a suitable page, but I think it would be a good idea to have one. Perhaps we should add it to [[Special:MyLanguage/Wikifunctions:How to create implementations]], which is linked to from every implementation? We should probably also have a general Phabricator task for logging errors that are hard to understand and/or impossible to translate. This might fit under [[:phab:T432195]], unless @[[User:LMorgantini-WMF|LMorgantini-WMF]] has a better suggestion. ::::::For now, I would only suggest that we: ::::::* generally avoid {{Z|Z6821}} and use either {{Z|Z6820}} or one of its wrappers, like {{Z|Z30120}} or {{Z|Z23762}} ::::::* test using smaller and fewer Wikidata items ::::::* use the same item(s) for different tests, where appropriate ::::::* avoid unnecessary variation in fetch calls. ::::::[[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 13:19, 20 September 2026 (UTC) :::::::* If a function does not need to pull labels or statements from an Item/Property/Lexeme, it should not fetch it. :::::::** When a label or statement ''is'' needed, from that point on you should only pass around the fetched Item/etc. and not its reference. Unfortunately the naming conventions and [[WF:Catalogue/Wikidata_operations/Item#Labels_and_aliases|catalogue]] aren't very helpful for finding the right label functions at the moment. :::::::* Replace {{Z|22820}} with specialised filter functions where possible to avoid having to repeat a long expression. :::::::* When implementing by composition, try to do it without recursion, at least until a non-recursive or code implementation gets connected. Recursive compositions are slower and more annoying to debug. (Code implementations can use recursion with much less overhead, but are limited in other ways ofc.) :::::::* Embedded function calls often fail, even when the same arguments work fine when used on the function's view page. Must be a separate cache. :::::::[[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 22:24, 20 September 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #266: Memoization arriving == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-09-25|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we talk about storing a function call's result in a cache for easier recalling, we analyse how quickly one particular fact propagates through different Wikipedia language editions, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 09:54, 28 September 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=30951652 --> :This memoization is at the global level, but are subexpressions repeated within a composition also memoized / is that planned? Because I've been writing compositions assuming that they would. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 09:59, 28 September 2026 (UTC) ::Memoization is working on subexpressions. It should capture repeated subcalls within a composition and even across different calls to the orchestrator, so your assumption is safe. ::HOWEVER, be aware that we're only memoizing a very short list of functions so far (<code>[ 'Z860', 'Z885', 'Z101', 'Z10047', 'Z189' ]</code>). We plan to expand this list in future. Very open to suggestions about which functions we should consider; we've based these decisions on benchmarks but would also benefit from advice from composition implementers! [[User:CMassaro (WMF)|CMassaro (WMF)]] ([[User talk:CMassaro (WMF)|talk]]) 17:10, 29 September 2026 (UTC) :::I think it’s worth distinguishing between extrinsic caching of function call results and intrinsic memoization of objects during a function call evaluation. To my mind, “subexpressions repeated within a composition” would fall into the latter category (function call or not), and I believe the Orchestrator generally realizes a repeated subexpression (identical object) only once during a single function call’s evaluation. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 00:08, 30 September 2026 (UTC) :::Good to hear. As for what to do next, I wouldn't trust my intuition over actually measuring. Maybe display functions? [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 06:18, 30 September 2026 (UTC) :::I think the community should avoid recommending functions specifically for memoization. We can highlight functions of particular concern, leaving it to the team to consider whether memoization, new builtins or something else would be the preferred solution. Top of my list is {{Z|Z14310}}, which is a critical dependency for almost all Abstract Wikipedia calls as well as our reading and display functions. This should be considered alongside [[:phab:T390226|T390226: Consider using list inputs to create variadic apply, filter, map, etc. functions]], since the selected function is always applied. :::We should also consider: :::* {{Z|Z13052}} • {{Z|Z18683}} • {{Z|Z29294}} • {{Z|Z12696}} :::* {{Z|Z13676}} • {{Z|Z17132}} • {{Z|Z19751}} (or less than, etc) :::* {{Z|Z20943}} :::* {{Z|Z12899}} (or some other string-concatenation function) :::* {{Z|Z18475}} :::I believe that none of the above functions can currently be evaluated without ultimately requiring traversal into code. The groupings reflect my belief that improving any member of the set can improve all members. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 14:08, 1 October 2026 (UTC) ::::{{TakeNote}} My previous reply prioritizing {{Z|Z14310}} was written before [[:phab:T440032|DE2.2.10: Improve language-specific function creation]]. Although that Hypothesis is presented as a usability improvement, I think the solution there should be designed to address the scaling, performance and resilience issues [[:phab:T419789#11782917|previously noted]]. @[[User:Jdforrester (WMF)|Jdforrester (WMF)]] [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 12:18, 11 October 2026 (UTC) :::Ping @[[User:CMassaro (WMF)|CMassaro (WMF)]] [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 11:40, 11 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #267: Refreshing results == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-02|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we talk about two new capabilities addressing the issues of caching and freshness of function call results, we introduce our groundwork to support the first pilot communities for Abstract Wikipedia, we discuss news in Types, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 09:31, 2 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31099195 --> == Reached rate limit in evaluator == I increasingly get errors like "Reached rate limit in evaluator" or "The rendering service is temporarily unavailable. Please, try again later". This makes it almost impossible to work. [[User:HenkvD|HenkvD]] ([[User talk:HenkvD|talk]]) 11:08, 9 October 2026 (UTC) :Tracked in [[phab:T438643]] [[User:鈴音雨|鈴音雨]] ([[User talk:鈴音雨|talk]]) 15:06, 9 October 2026 (UTC) :P.S. I have created a userscript that can mitigate this issue to some extent [[User:鈴音雨/WFSpinner]]. [[User:鈴音雨|鈴音雨]] ([[User talk:鈴音雨|talk]]) 14:12, 10 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #268: Quarterly planning == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-09|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we discuss the work we have planned for this quarter (October-December 2026), we introduce news in Types, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Also, we remind you that if you have questions or ideas to discuss, the next '''Volunteers' Corner''' will be held on '''[https://zonestamp.toolforge.org/1791826200 October 12, at 17:30 UTC]''' ([https://meet.google.com/xuy-njxh-rkw link to the meeting]). Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 15:42, 10 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31143368 --> :<q>While [Z91/Z92] were really important for having translatable HTML error messages, we believe they can also be used for a lot other things [...]</q><br>So [[Talk:Z91#Generality|that's a no]], then. I don't mean to sound ungrateful, but we still don't have consistency with the current text Types, so telling us to adopt more is only going to result in fragmentation and confusion, at least in the short term. And there isn't a way (except a message/template on the talk page) to [[WF:Type_proposals/Typed_string|distinguish]] when a {{Z|91}}, or any textual object, contains <code>$1</code> markers which need to be replaced. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 21:57, 10 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #269: Changes in evaluator representations == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-17|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we introduce our latest changes in evaluator representations, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 10:46, 17 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31162541 --> == October 2026 Wikimedia Café: legal issues on Commons, and WMF Board selection process == <div class="border-box" style="background-color: var(--background-color-warning-subtle, #f8eaba); max-width: 875px; padding: 5px; border: 1px solid black; margin: 5px; color: var(--clr-dark)"> <div class="box" style="float:left; padding-top: 10px; padding-right: 10px; padding-left: 10px; padding-bottom: 10px;">[[File:Wikimedia Café logo in plain SVG format.svg|60px|alt=The logo for the Wikimedia Café]]</div> Hello! There will be two '''[https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9 Wikimedia Café]''' discussion opportunities in October. In a change from the usual Café practice, this month's sessions will have different topics. Anyone who meets the Café attendance criteria is welcome to attend either or both sessions. Session A will happen on Saturday, 24 October 2026 at 15:00 UTC ([https://zonestamp.toolforge.org/1792854000 timestamp converter]), at a time friendly to the Americas, Africa, and Europe. This session will feature [https://meta.wikimedia.org/wiki/User:PBradley-WMF Wikimedia Foundation lawyer Phil Bradley-Schmieg]. We will discuss legal issues on Wikimedia Commons, including complexities of international law. (I am hoping that in a future month, a similar Café session will be offered at a time friendly to Asia and the Pacific.) Session B will happen on Sunday, 25 October 2026 at 03:00 UTC ([https://zonestamp.toolforge.org/1792897200 timestamp converter]), at a time friendly to Asia and the Pacific, we will discuss [https://meta.wikimedia.org/wiki/Wikimedia_Foundation_elections/2027/Proposed_eligibility_criteria proposed changes to how Wikimedia Foundation Board candidates are selected]. The latest proposals are much different from the earlier July 2026 proposals. The due date for feedback on current proposals is 27 October, and Wikimedians are welcome to participate on the [https://meta.wikimedia.org/wiki/Talk:Wikimedia_Foundation_elections/2027/Proposed_eligibility_criteria proposal talk page] regardless of Café attendance. Please see the [https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9 Café] page for more information, including [https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9#How_to_attend_the_session how to register]! To subscribe or unsubscribe for Café notices on your talk page please [https://meta.wikimedia.org/wiki/Global_message_delivery/Targets/Wikimedia_Caf%C3%A9 go here]. <br /> [[File:Buntstifte Eberhard Faber crop 64h.jpg|860px|alt=cropped image of colored pencils]]</div> <span style="white-space:nowrap;">[[User:Pine|<span style="color:#01796f; text-shadow:#00BFFF 0 0 1.0em">༄ᨒ𖠰 Pine</span>]] [[User talk:Pine|<span style="color:DeepSkyBlue">(<b style="color:#FFDF00;text-shadow:#FFDF00 0 0 1.0em">✉</b>)</span>]]</span> 06:25, 18 October 2026 (UTC) == Translating "is a" (and similar) == I am trying to learn how to use Abstract Wikipedia after being a Wikipedian for over 20 years, but it is very diffirent. When I look at an article in my own language, words like "is a" and "from" are not translated. I thought it could be a simple and helpful thing to translate those, but I cannot figure out how to do that. /[[User:abbedabb|<b style="color:#ff9c15">abbedabb</b>]][[User talk:abbedabb|<sup><small>talk</small></sup>]] 14:32, 22 October 2026 (UTC) :Try changing the language in the language input to the right side of "Generated text" to Swedish in AW. [[User:ReXLer|ReXLer]] ([[User talk:ReXLer|talk]]) 15:13, 22 October 2026 (UTC) ::That does not answer my question. The generated text is already set to Swedish, but the result is: ::"Astrid Lindgren (is a) författare (from) Sverige." ([https://abstract.wikipedia.org/view/sv/Q55767 link]) ::/[[User:abbedabb|<b style="color:#ff9c15">abbedabb</b>]][[User talk:abbedabb|<sup><small>talk</small></sup>]] 15:20, 22 October 2026 (UTC) :::That's a fallback when there is no version of the string in the specific language. [[User:ReXLer|ReXLer]] ([[User talk:ReXLer|talk]]) 15:33, 22 October 2026 (UTC) tbiubmyufi5s914zua5ie5mxqvnh73y 330901 330900 2026-10-22T15:33:29Z ReXLer 39813 /* Translating "is a" (and similar) */ 330901 wikitext text/x-wiki {{shortcut|[[WF:CHAT]]|[[WF:PC]]|[[WF:VP]]}} __NEWSECTIONLINK__ [[Category:Help]] <!-- please do not remove this line --> Welcome to the Project chat, a place to discuss any and all aspects of Wikifunctions: the project itself, policy and proposals, individual data items, technical issues, etc. Other places to find help: * [[Wikifunctions:Administrators' noticeboard]] * [[Wikifunctions:Report a technical problem]] * [[Wikifunctions:FAQ]] {{Autoarchive resolved section |age = 1 |archive = ((FULLPAGENAME))/Archive/((year))/((month:##)) |timeout=30 }} {{Archives|{{#tag:div|<br />{{Flatlist|{{Special:PrefixIndex/WF:Project chat/Archive/|stripprefix=1|hideredirects=1}} |class=mw-collapsible-content|style=font-size:92%;}}|class="mw-collapsible mw-collapsible-toggle mw-collapsed"}} |prefix=WF:Project chat/Archive/ }} == Draft policy for language fallback strategies == [[Help:Language fallback]]<br>I'd appreciate any comments, but I'm particularly seeking approval for this planned mass edit: * '[[Z25065|limited]]' in all [[:Category:Display functions]] * '[[Z14310|none]]' in all [[:Category:Reading functions]] * '[[Z25065|limited]]' in all [[:Category:Abstract description functions]] * NEW STRATEGY '[[Z40583|insistent]]' in all [[:Category:Semantic fragment functions]] (including the ones I haven't categorised yet) * '[[Z40583|insistent]]' in all [[:Category:Hatnote functions]] * '[[Z40583|insistent]]' in all [[:Category:Multilingual captioned image functions]] * '[[Z14310|none]]' in all [[:Category:Conjugation tables]] * '[[Z14310|none]]' in all {{Z|36462}}-producing functions? {{ping|Denny|p=}} * '[[Z25065|limited]]' in everything else: punctuation helpers, lexeme and inflection helpers, partial sentence functions... [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 01:52, 21 October 2026 (UTC) :I am happy that see that you want to structure the language fallback strategies. I can't oversee the consequences, but I trust you in this plan. [[User:HenkvD|HenkvD]] ([[User talk:HenkvD|talk]]) 11:46, 30 August 2026 (UTC) ::At first read, the policy looks great (even if a person speaking fr-CA will probably be angry with that example, despite being largely true). I also approve the planned mass edit so far, it's good to test that. Thanks for the work! [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 16:20, 30 August 2026 (UTC) :::It would also be very great to have a schema and more examples so the policy could be more understandable for newcomers. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 16:22, 30 August 2026 (UTC) :None for the Syntactic tables is a good idea, I think that one will go from experimental right to deprecated anyway. I am not sure yet about the Semantic fragment functions, and would like to see the effect once we have a few more. --[[User:Denny|Denny]] ([[User talk:Denny|talk]]) 11:48, 3 September 2026 (UTC) :Can you provide some examples of things that will change? --[[User:99of9|99of9]] ([[User talk:99of9|talk]]) 04:52, 11 September 2026 (UTC) ::'None' &rarr; 'Limited': {{Z|20780}} will use the Dutch implementation when Afrikaans is requested, instead of the ISO 8601 fallback.<br>'None' &rarr; 'Insistent': {{Z|36083}} will use the English implementation when German is requested, instead of the fallback that's just an arrow.<br>Improvements are very much dependent on how the fallback language lists are configured. And the [[Z14294]]s themselves&mdash;yesterday I went through and replaced hardcoded [ en, en-GB ] with {{Z|33034}}, but in a world where I hadn't, the 'Limited' strategy would be helpful in routing the dialects to en. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 17:13, 11 September 2026 (UTC) :::I'm a bit conflicted here (and I've flipped around in the past too, so don't expect consistency sorry!). In the main articles example, I feel like the default is better than displaying English for German. Main articles doesn't really need words. Certainly En-dialects should get English, but as you say, we have other ways of ensuring that. I don't know enough about Afrikaans to comment on that one. --[[User:99of9|99of9]] ([[User talk:99of9|talk]]) 03:58, 17 September 2026 (UTC) == i can create my own function? == i need enable my implementation for my function Z38065 [[User:Spider077|Spider077]] ([[User talk:Spider077|talk]]) 05:40, 6 September 2026 (UTC) :Please request connections at [[Wikifunctions:Requests for connection and disconnection]]. :I do not think this particular implementation should be connected. :# The function has no test cases, so its intended purpose is not entirely clear. :# The function appears to be a duplicate of {{Z|Z11602}}. :# The implementation will return an error because <code>Text</code> is undefined. :# In any event, <code>print()</code> returns the value <code>None</code>, so the implementation would end up returning {{Z|Z24}}. :Please feel free to reply here if you need any help. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 10:24, 6 September 2026 (UTC) ::I fixed[[File:The Quantum Code.png]] [[User:Spider077|Spider077]] ([[User talk:Spider077|talk]]) 14:30, 29 September 2026 (UTC) == Technical limitations or something on my side? == Hi there, I'm experimenting with different ways to improve NLG in French (many things to do). I experiment some limitations, I don't if they come from the software or something I did: # I tried to create a typed list in {{Z|Z42597}}, similarly to {{Z|Z38002}}, but impossible to add this type (I'm blocked with an empty content box). The Edit Raw JSON script also fails on publication. # I tried to find if an item is a subclass of another in {{Z|Z41641}} and {{Z|Z41649}}, but I only get the error "WASM interpreter aborted (unreachable executed)". Is it me? Or some current limitations? Are there workarounds? Any help appreciated! Cheers. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 14:38, 19 September 2026 (UTC) :1. Z42957 is a {{Z|Z6}}. It is possible to create a typed list of {{Z|Z6091}}, if that’s what you have in mind. :2. Yes, that’s a tricky one. I don’t have time right now, but I should be able to look at it in a few hours or tomorrow morning. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 18:24, 19 September 2026 (UTC) ::Thank you! For some reason I couldn't create a typed list earlier, but it looks fixed now (I was able to create {{Z|Z42639}}). The interface could still be a bit clearer... {{Z|Z42597}} can be deleted, btw. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 19:39, 19 September 2026 (UTC) :::Good. I agree, the interface for type specification is a little peculiar for “generic” types. :::I’ve had a little look at your second problem and I don’t have a quick fix. Theoretically, I think you want to apply the subclass test to each of the classes of which the item is an instance, having failed to establish that the item is an instance of the superclass. [https://www.wikifunctions.org/view/en/Z36572?call=%7B%22Z1K1%22%3A%22Z7%22%2C%22Z7K1%22%3A%22Z36572%22%2C%22Z36572K1%22%3A%7B%22Z1K1%22%3A%22Z7%22%2C%22Z7K1%22%3A%22Z30120%22%2C%22Z30120K1%22%3A%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q84%22%7D%2C%22Z30120K2%22%3A%5B%22Z6030%22%2C%22Z6036%22%5D%2C%22Z30120K3%22%3A%5B%22Z60%22%5D%2C%22Z30120K4%22%3A%5B%22Z6092%22%2C%7B%22Z1K1%22%3A%22Z6092%22%2C%22Z6092K1%22%3A%22P31%22%7D%5D%7D%2C%22Z36572K2%22%3A%5B%22Z6091%22%2C%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q486972%22%7D%5D%2C%22Z36572K3%22%3A%7B%22Z1K1%22%3A%22Z13518%22%2C%22Z13518K1%22%3A%223%22%7D%7D This function call] seems to work, but I would be worried about timing out, generally. It would perhaps be better to create a list of classes that are, ultimately, types of human settlement and only use the more expensive traversal for items that are not instances of any of those classes. I don’t see any such list currently, but the idea is expressed in {{Z|Z41921}}, so @[[User:Jsamwrites|Jsamwrites]] might be interested in collaborating. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 20:38, 19 September 2026 (UTC) ::::As I mentioned [[Talk:Z41920|here]], your solution is ideally correct, but because of technical limitations, I created a faster version for general French usages. [[User:Jsamwrites|John Samuel]] 21:11, 19 September 2026 (UTC) :::::Thanks @[[User:GrounderUK|GrounderUK]]! Any help or Phabricator page (or some dashboard) where we could understand what's likely to timeout? I would love to reduce the burden on the servers but I have no clue on what's causing it. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 11:41, 20 September 2026 (UTC) ::::::I’m not aware of a suitable page, but I think it would be a good idea to have one. Perhaps we should add it to [[Special:MyLanguage/Wikifunctions:How to create implementations]], which is linked to from every implementation? We should probably also have a general Phabricator task for logging errors that are hard to understand and/or impossible to translate. This might fit under [[:phab:T432195]], unless @[[User:LMorgantini-WMF|LMorgantini-WMF]] has a better suggestion. ::::::For now, I would only suggest that we: ::::::* generally avoid {{Z|Z6821}} and use either {{Z|Z6820}} or one of its wrappers, like {{Z|Z30120}} or {{Z|Z23762}} ::::::* test using smaller and fewer Wikidata items ::::::* use the same item(s) for different tests, where appropriate ::::::* avoid unnecessary variation in fetch calls. ::::::[[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 13:19, 20 September 2026 (UTC) :::::::* If a function does not need to pull labels or statements from an Item/Property/Lexeme, it should not fetch it. :::::::** When a label or statement ''is'' needed, from that point on you should only pass around the fetched Item/etc. and not its reference. Unfortunately the naming conventions and [[WF:Catalogue/Wikidata_operations/Item#Labels_and_aliases|catalogue]] aren't very helpful for finding the right label functions at the moment. :::::::* Replace {{Z|22820}} with specialised filter functions where possible to avoid having to repeat a long expression. :::::::* When implementing by composition, try to do it without recursion, at least until a non-recursive or code implementation gets connected. Recursive compositions are slower and more annoying to debug. (Code implementations can use recursion with much less overhead, but are limited in other ways ofc.) :::::::* Embedded function calls often fail, even when the same arguments work fine when used on the function's view page. Must be a separate cache. :::::::[[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 22:24, 20 September 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #266: Memoization arriving == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-09-25|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we talk about storing a function call's result in a cache for easier recalling, we analyse how quickly one particular fact propagates through different Wikipedia language editions, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 09:54, 28 September 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=30951652 --> :This memoization is at the global level, but are subexpressions repeated within a composition also memoized / is that planned? Because I've been writing compositions assuming that they would. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 09:59, 28 September 2026 (UTC) ::Memoization is working on subexpressions. It should capture repeated subcalls within a composition and even across different calls to the orchestrator, so your assumption is safe. ::HOWEVER, be aware that we're only memoizing a very short list of functions so far (<code>[ 'Z860', 'Z885', 'Z101', 'Z10047', 'Z189' ]</code>). We plan to expand this list in future. Very open to suggestions about which functions we should consider; we've based these decisions on benchmarks but would also benefit from advice from composition implementers! [[User:CMassaro (WMF)|CMassaro (WMF)]] ([[User talk:CMassaro (WMF)|talk]]) 17:10, 29 September 2026 (UTC) :::I think it’s worth distinguishing between extrinsic caching of function call results and intrinsic memoization of objects during a function call evaluation. To my mind, “subexpressions repeated within a composition” would fall into the latter category (function call or not), and I believe the Orchestrator generally realizes a repeated subexpression (identical object) only once during a single function call’s evaluation. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 00:08, 30 September 2026 (UTC) :::Good to hear. As for what to do next, I wouldn't trust my intuition over actually measuring. Maybe display functions? [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 06:18, 30 September 2026 (UTC) :::I think the community should avoid recommending functions specifically for memoization. We can highlight functions of particular concern, leaving it to the team to consider whether memoization, new builtins or something else would be the preferred solution. Top of my list is {{Z|Z14310}}, which is a critical dependency for almost all Abstract Wikipedia calls as well as our reading and display functions. This should be considered alongside [[:phab:T390226|T390226: Consider using list inputs to create variadic apply, filter, map, etc. functions]], since the selected function is always applied. :::We should also consider: :::* {{Z|Z13052}} • {{Z|Z18683}} • {{Z|Z29294}} • {{Z|Z12696}} :::* {{Z|Z13676}} • {{Z|Z17132}} • {{Z|Z19751}} (or less than, etc) :::* {{Z|Z20943}} :::* {{Z|Z12899}} (or some other string-concatenation function) :::* {{Z|Z18475}} :::I believe that none of the above functions can currently be evaluated without ultimately requiring traversal into code. The groupings reflect my belief that improving any member of the set can improve all members. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 14:08, 1 October 2026 (UTC) ::::{{TakeNote}} My previous reply prioritizing {{Z|Z14310}} was written before [[:phab:T440032|DE2.2.10: Improve language-specific function creation]]. Although that Hypothesis is presented as a usability improvement, I think the solution there should be designed to address the scaling, performance and resilience issues [[:phab:T419789#11782917|previously noted]]. @[[User:Jdforrester (WMF)|Jdforrester (WMF)]] [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 12:18, 11 October 2026 (UTC) :::Ping @[[User:CMassaro (WMF)|CMassaro (WMF)]] [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 11:40, 11 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #267: Refreshing results == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-02|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we talk about two new capabilities addressing the issues of caching and freshness of function call results, we introduce our groundwork to support the first pilot communities for Abstract Wikipedia, we discuss news in Types, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 09:31, 2 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31099195 --> == Reached rate limit in evaluator == I increasingly get errors like "Reached rate limit in evaluator" or "The rendering service is temporarily unavailable. Please, try again later". This makes it almost impossible to work. [[User:HenkvD|HenkvD]] ([[User talk:HenkvD|talk]]) 11:08, 9 October 2026 (UTC) :Tracked in [[phab:T438643]] [[User:鈴音雨|鈴音雨]] ([[User talk:鈴音雨|talk]]) 15:06, 9 October 2026 (UTC) :P.S. I have created a userscript that can mitigate this issue to some extent [[User:鈴音雨/WFSpinner]]. [[User:鈴音雨|鈴音雨]] ([[User talk:鈴音雨|talk]]) 14:12, 10 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #268: Quarterly planning == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-09|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we discuss the work we have planned for this quarter (October-December 2026), we introduce news in Types, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Also, we remind you that if you have questions or ideas to discuss, the next '''Volunteers' Corner''' will be held on '''[https://zonestamp.toolforge.org/1791826200 October 12, at 17:30 UTC]''' ([https://meet.google.com/xuy-njxh-rkw link to the meeting]). Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 15:42, 10 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31143368 --> :<q>While [Z91/Z92] were really important for having translatable HTML error messages, we believe they can also be used for a lot other things [...]</q><br>So [[Talk:Z91#Generality|that's a no]], then. I don't mean to sound ungrateful, but we still don't have consistency with the current text Types, so telling us to adopt more is only going to result in fragmentation and confusion, at least in the short term. And there isn't a way (except a message/template on the talk page) to [[WF:Type_proposals/Typed_string|distinguish]] when a {{Z|91}}, or any textual object, contains <code>$1</code> markers which need to be replaced. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 21:57, 10 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #269: Changes in evaluator representations == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-17|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we introduce our latest changes in evaluator representations, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 10:46, 17 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31162541 --> == October 2026 Wikimedia Café: legal issues on Commons, and WMF Board selection process == <div class="border-box" style="background-color: var(--background-color-warning-subtle, #f8eaba); max-width: 875px; padding: 5px; border: 1px solid black; margin: 5px; color: var(--clr-dark)"> <div class="box" style="float:left; padding-top: 10px; padding-right: 10px; padding-left: 10px; padding-bottom: 10px;">[[File:Wikimedia Café logo in plain SVG format.svg|60px|alt=The logo for the Wikimedia Café]]</div> Hello! There will be two '''[https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9 Wikimedia Café]''' discussion opportunities in October. In a change from the usual Café practice, this month's sessions will have different topics. Anyone who meets the Café attendance criteria is welcome to attend either or both sessions. Session A will happen on Saturday, 24 October 2026 at 15:00 UTC ([https://zonestamp.toolforge.org/1792854000 timestamp converter]), at a time friendly to the Americas, Africa, and Europe. This session will feature [https://meta.wikimedia.org/wiki/User:PBradley-WMF Wikimedia Foundation lawyer Phil Bradley-Schmieg]. We will discuss legal issues on Wikimedia Commons, including complexities of international law. (I am hoping that in a future month, a similar Café session will be offered at a time friendly to Asia and the Pacific.) Session B will happen on Sunday, 25 October 2026 at 03:00 UTC ([https://zonestamp.toolforge.org/1792897200 timestamp converter]), at a time friendly to Asia and the Pacific, we will discuss [https://meta.wikimedia.org/wiki/Wikimedia_Foundation_elections/2027/Proposed_eligibility_criteria proposed changes to how Wikimedia Foundation Board candidates are selected]. The latest proposals are much different from the earlier July 2026 proposals. The due date for feedback on current proposals is 27 October, and Wikimedians are welcome to participate on the [https://meta.wikimedia.org/wiki/Talk:Wikimedia_Foundation_elections/2027/Proposed_eligibility_criteria proposal talk page] regardless of Café attendance. Please see the [https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9 Café] page for more information, including [https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9#How_to_attend_the_session how to register]! To subscribe or unsubscribe for Café notices on your talk page please [https://meta.wikimedia.org/wiki/Global_message_delivery/Targets/Wikimedia_Caf%C3%A9 go here]. <br /> [[File:Buntstifte Eberhard Faber crop 64h.jpg|860px|alt=cropped image of colored pencils]]</div> <span style="white-space:nowrap;">[[User:Pine|<span style="color:#01796f; text-shadow:#00BFFF 0 0 1.0em">༄ᨒ𖠰 Pine</span>]] [[User talk:Pine|<span style="color:DeepSkyBlue">(<b style="color:#FFDF00;text-shadow:#FFDF00 0 0 1.0em">✉</b>)</span>]]</span> 06:25, 18 October 2026 (UTC) == Translating "is a" (and similar) == I am trying to learn how to use Abstract Wikipedia after being a Wikipedian for over 20 years, but it is very diffirent. When I look at an article in my own language, words like "is a" and "from" are not translated. I thought it could be a simple and helpful thing to translate those, but I cannot figure out how to do that. /[[User:abbedabb|<b style="color:#ff9c15">abbedabb</b>]][[User talk:abbedabb|<sup><small>talk</small></sup>]] 14:32, 22 October 2026 (UTC) :Try changing the language in the language input to the right side of "Generated text" to Swedish in AW. [[User:ReXLer|ReXLer]] ([[User talk:ReXLer|talk]]) 15:13, 22 October 2026 (UTC) ::That does not answer my question. The generated text is already set to Swedish, but the result is: ::"Astrid Lindgren (is a) författare (from) Sverige." ([https://abstract.wikipedia.org/view/sv/Q55767 link]) ::/[[User:abbedabb|<b style="color:#ff9c15">abbedabb</b>]][[User talk:abbedabb|<sup><small>talk</small></sup>]] 15:20, 22 October 2026 (UTC) :::That's a fallback when there is no version of the thing in the specific language. [[User:ReXLer|ReXLer]] ([[User talk:ReXLer|talk]]) 15:33, 22 October 2026 (UTC) 79qe72m04wrrz9jwl01lrpvg504am0w 330902 330901 2026-10-22T15:35:10Z Abbedabb 102534 /* Translating "is a" (and similar) */ Reply 330902 wikitext text/x-wiki {{shortcut|[[WF:CHAT]]|[[WF:PC]]|[[WF:VP]]}} __NEWSECTIONLINK__ [[Category:Help]] <!-- please do not remove this line --> Welcome to the Project chat, a place to discuss any and all aspects of Wikifunctions: the project itself, policy and proposals, individual data items, technical issues, etc. Other places to find help: * [[Wikifunctions:Administrators' noticeboard]] * [[Wikifunctions:Report a technical problem]] * [[Wikifunctions:FAQ]] {{Autoarchive resolved section |age = 1 |archive = ((FULLPAGENAME))/Archive/((year))/((month:##)) |timeout=30 }} {{Archives|{{#tag:div|<br />{{Flatlist|{{Special:PrefixIndex/WF:Project chat/Archive/|stripprefix=1|hideredirects=1}} |class=mw-collapsible-content|style=font-size:92%;}}|class="mw-collapsible mw-collapsible-toggle mw-collapsed"}} |prefix=WF:Project chat/Archive/ }} == Draft policy for language fallback strategies == [[Help:Language fallback]]<br>I'd appreciate any comments, but I'm particularly seeking approval for this planned mass edit: * '[[Z25065|limited]]' in all [[:Category:Display functions]] * '[[Z14310|none]]' in all [[:Category:Reading functions]] * '[[Z25065|limited]]' in all [[:Category:Abstract description functions]] * NEW STRATEGY '[[Z40583|insistent]]' in all [[:Category:Semantic fragment functions]] (including the ones I haven't categorised yet) * '[[Z40583|insistent]]' in all [[:Category:Hatnote functions]] * '[[Z40583|insistent]]' in all [[:Category:Multilingual captioned image functions]] * '[[Z14310|none]]' in all [[:Category:Conjugation tables]] * '[[Z14310|none]]' in all {{Z|36462}}-producing functions? {{ping|Denny|p=}} * '[[Z25065|limited]]' in everything else: punctuation helpers, lexeme and inflection helpers, partial sentence functions... [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 01:52, 21 October 2026 (UTC) :I am happy that see that you want to structure the language fallback strategies. I can't oversee the consequences, but I trust you in this plan. [[User:HenkvD|HenkvD]] ([[User talk:HenkvD|talk]]) 11:46, 30 August 2026 (UTC) ::At first read, the policy looks great (even if a person speaking fr-CA will probably be angry with that example, despite being largely true). I also approve the planned mass edit so far, it's good to test that. Thanks for the work! [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 16:20, 30 August 2026 (UTC) :::It would also be very great to have a schema and more examples so the policy could be more understandable for newcomers. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 16:22, 30 August 2026 (UTC) :None for the Syntactic tables is a good idea, I think that one will go from experimental right to deprecated anyway. I am not sure yet about the Semantic fragment functions, and would like to see the effect once we have a few more. --[[User:Denny|Denny]] ([[User talk:Denny|talk]]) 11:48, 3 September 2026 (UTC) :Can you provide some examples of things that will change? --[[User:99of9|99of9]] ([[User talk:99of9|talk]]) 04:52, 11 September 2026 (UTC) ::'None' &rarr; 'Limited': {{Z|20780}} will use the Dutch implementation when Afrikaans is requested, instead of the ISO 8601 fallback.<br>'None' &rarr; 'Insistent': {{Z|36083}} will use the English implementation when German is requested, instead of the fallback that's just an arrow.<br>Improvements are very much dependent on how the fallback language lists are configured. And the [[Z14294]]s themselves&mdash;yesterday I went through and replaced hardcoded [ en, en-GB ] with {{Z|33034}}, but in a world where I hadn't, the 'Limited' strategy would be helpful in routing the dialects to en. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 17:13, 11 September 2026 (UTC) :::I'm a bit conflicted here (and I've flipped around in the past too, so don't expect consistency sorry!). In the main articles example, I feel like the default is better than displaying English for German. Main articles doesn't really need words. Certainly En-dialects should get English, but as you say, we have other ways of ensuring that. I don't know enough about Afrikaans to comment on that one. --[[User:99of9|99of9]] ([[User talk:99of9|talk]]) 03:58, 17 September 2026 (UTC) == i can create my own function? == i need enable my implementation for my function Z38065 [[User:Spider077|Spider077]] ([[User talk:Spider077|talk]]) 05:40, 6 September 2026 (UTC) :Please request connections at [[Wikifunctions:Requests for connection and disconnection]]. :I do not think this particular implementation should be connected. :# The function has no test cases, so its intended purpose is not entirely clear. :# The function appears to be a duplicate of {{Z|Z11602}}. :# The implementation will return an error because <code>Text</code> is undefined. :# In any event, <code>print()</code> returns the value <code>None</code>, so the implementation would end up returning {{Z|Z24}}. :Please feel free to reply here if you need any help. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 10:24, 6 September 2026 (UTC) ::I fixed[[File:The Quantum Code.png]] [[User:Spider077|Spider077]] ([[User talk:Spider077|talk]]) 14:30, 29 September 2026 (UTC) == Technical limitations or something on my side? == Hi there, I'm experimenting with different ways to improve NLG in French (many things to do). I experiment some limitations, I don't if they come from the software or something I did: # I tried to create a typed list in {{Z|Z42597}}, similarly to {{Z|Z38002}}, but impossible to add this type (I'm blocked with an empty content box). The Edit Raw JSON script also fails on publication. # I tried to find if an item is a subclass of another in {{Z|Z41641}} and {{Z|Z41649}}, but I only get the error "WASM interpreter aborted (unreachable executed)". Is it me? Or some current limitations? Are there workarounds? Any help appreciated! Cheers. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 14:38, 19 September 2026 (UTC) :1. Z42957 is a {{Z|Z6}}. It is possible to create a typed list of {{Z|Z6091}}, if that’s what you have in mind. :2. Yes, that’s a tricky one. I don’t have time right now, but I should be able to look at it in a few hours or tomorrow morning. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 18:24, 19 September 2026 (UTC) ::Thank you! For some reason I couldn't create a typed list earlier, but it looks fixed now (I was able to create {{Z|Z42639}}). The interface could still be a bit clearer... {{Z|Z42597}} can be deleted, btw. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 19:39, 19 September 2026 (UTC) :::Good. I agree, the interface for type specification is a little peculiar for “generic” types. :::I’ve had a little look at your second problem and I don’t have a quick fix. Theoretically, I think you want to apply the subclass test to each of the classes of which the item is an instance, having failed to establish that the item is an instance of the superclass. [https://www.wikifunctions.org/view/en/Z36572?call=%7B%22Z1K1%22%3A%22Z7%22%2C%22Z7K1%22%3A%22Z36572%22%2C%22Z36572K1%22%3A%7B%22Z1K1%22%3A%22Z7%22%2C%22Z7K1%22%3A%22Z30120%22%2C%22Z30120K1%22%3A%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q84%22%7D%2C%22Z30120K2%22%3A%5B%22Z6030%22%2C%22Z6036%22%5D%2C%22Z30120K3%22%3A%5B%22Z60%22%5D%2C%22Z30120K4%22%3A%5B%22Z6092%22%2C%7B%22Z1K1%22%3A%22Z6092%22%2C%22Z6092K1%22%3A%22P31%22%7D%5D%7D%2C%22Z36572K2%22%3A%5B%22Z6091%22%2C%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q486972%22%7D%5D%2C%22Z36572K3%22%3A%7B%22Z1K1%22%3A%22Z13518%22%2C%22Z13518K1%22%3A%223%22%7D%7D This function call] seems to work, but I would be worried about timing out, generally. It would perhaps be better to create a list of classes that are, ultimately, types of human settlement and only use the more expensive traversal for items that are not instances of any of those classes. I don’t see any such list currently, but the idea is expressed in {{Z|Z41921}}, so @[[User:Jsamwrites|Jsamwrites]] might be interested in collaborating. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 20:38, 19 September 2026 (UTC) ::::As I mentioned [[Talk:Z41920|here]], your solution is ideally correct, but because of technical limitations, I created a faster version for general French usages. [[User:Jsamwrites|John Samuel]] 21:11, 19 September 2026 (UTC) :::::Thanks @[[User:GrounderUK|GrounderUK]]! Any help or Phabricator page (or some dashboard) where we could understand what's likely to timeout? I would love to reduce the burden on the servers but I have no clue on what's causing it. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 11:41, 20 September 2026 (UTC) ::::::I’m not aware of a suitable page, but I think it would be a good idea to have one. Perhaps we should add it to [[Special:MyLanguage/Wikifunctions:How to create implementations]], which is linked to from every implementation? We should probably also have a general Phabricator task for logging errors that are hard to understand and/or impossible to translate. This might fit under [[:phab:T432195]], unless @[[User:LMorgantini-WMF|LMorgantini-WMF]] has a better suggestion. ::::::For now, I would only suggest that we: ::::::* generally avoid {{Z|Z6821}} and use either {{Z|Z6820}} or one of its wrappers, like {{Z|Z30120}} or {{Z|Z23762}} ::::::* test using smaller and fewer Wikidata items ::::::* use the same item(s) for different tests, where appropriate ::::::* avoid unnecessary variation in fetch calls. ::::::[[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 13:19, 20 September 2026 (UTC) :::::::* If a function does not need to pull labels or statements from an Item/Property/Lexeme, it should not fetch it. :::::::** When a label or statement ''is'' needed, from that point on you should only pass around the fetched Item/etc. and not its reference. Unfortunately the naming conventions and [[WF:Catalogue/Wikidata_operations/Item#Labels_and_aliases|catalogue]] aren't very helpful for finding the right label functions at the moment. :::::::* Replace {{Z|22820}} with specialised filter functions where possible to avoid having to repeat a long expression. :::::::* When implementing by composition, try to do it without recursion, at least until a non-recursive or code implementation gets connected. Recursive compositions are slower and more annoying to debug. (Code implementations can use recursion with much less overhead, but are limited in other ways ofc.) :::::::* Embedded function calls often fail, even when the same arguments work fine when used on the function's view page. Must be a separate cache. :::::::[[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 22:24, 20 September 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #266: Memoization arriving == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-09-25|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we talk about storing a function call's result in a cache for easier recalling, we analyse how quickly one particular fact propagates through different Wikipedia language editions, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 09:54, 28 September 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=30951652 --> :This memoization is at the global level, but are subexpressions repeated within a composition also memoized / is that planned? Because I've been writing compositions assuming that they would. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 09:59, 28 September 2026 (UTC) ::Memoization is working on subexpressions. It should capture repeated subcalls within a composition and even across different calls to the orchestrator, so your assumption is safe. ::HOWEVER, be aware that we're only memoizing a very short list of functions so far (<code>[ 'Z860', 'Z885', 'Z101', 'Z10047', 'Z189' ]</code>). We plan to expand this list in future. Very open to suggestions about which functions we should consider; we've based these decisions on benchmarks but would also benefit from advice from composition implementers! [[User:CMassaro (WMF)|CMassaro (WMF)]] ([[User talk:CMassaro (WMF)|talk]]) 17:10, 29 September 2026 (UTC) :::I think it’s worth distinguishing between extrinsic caching of function call results and intrinsic memoization of objects during a function call evaluation. To my mind, “subexpressions repeated within a composition” would fall into the latter category (function call or not), and I believe the Orchestrator generally realizes a repeated subexpression (identical object) only once during a single function call’s evaluation. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 00:08, 30 September 2026 (UTC) :::Good to hear. As for what to do next, I wouldn't trust my intuition over actually measuring. Maybe display functions? [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 06:18, 30 September 2026 (UTC) :::I think the community should avoid recommending functions specifically for memoization. We can highlight functions of particular concern, leaving it to the team to consider whether memoization, new builtins or something else would be the preferred solution. Top of my list is {{Z|Z14310}}, which is a critical dependency for almost all Abstract Wikipedia calls as well as our reading and display functions. This should be considered alongside [[:phab:T390226|T390226: Consider using list inputs to create variadic apply, filter, map, etc. functions]], since the selected function is always applied. :::We should also consider: :::* {{Z|Z13052}} • {{Z|Z18683}} • {{Z|Z29294}} • {{Z|Z12696}} :::* {{Z|Z13676}} • {{Z|Z17132}} • {{Z|Z19751}} (or less than, etc) :::* {{Z|Z20943}} :::* {{Z|Z12899}} (or some other string-concatenation function) :::* {{Z|Z18475}} :::I believe that none of the above functions can currently be evaluated without ultimately requiring traversal into code. The groupings reflect my belief that improving any member of the set can improve all members. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 14:08, 1 October 2026 (UTC) ::::{{TakeNote}} My previous reply prioritizing {{Z|Z14310}} was written before [[:phab:T440032|DE2.2.10: Improve language-specific function creation]]. Although that Hypothesis is presented as a usability improvement, I think the solution there should be designed to address the scaling, performance and resilience issues [[:phab:T419789#11782917|previously noted]]. @[[User:Jdforrester (WMF)|Jdforrester (WMF)]] [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 12:18, 11 October 2026 (UTC) :::Ping @[[User:CMassaro (WMF)|CMassaro (WMF)]] [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 11:40, 11 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #267: Refreshing results == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-02|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we talk about two new capabilities addressing the issues of caching and freshness of function call results, we introduce our groundwork to support the first pilot communities for Abstract Wikipedia, we discuss news in Types, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 09:31, 2 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31099195 --> == Reached rate limit in evaluator == I increasingly get errors like "Reached rate limit in evaluator" or "The rendering service is temporarily unavailable. Please, try again later". This makes it almost impossible to work. [[User:HenkvD|HenkvD]] ([[User talk:HenkvD|talk]]) 11:08, 9 October 2026 (UTC) :Tracked in [[phab:T438643]] [[User:鈴音雨|鈴音雨]] ([[User talk:鈴音雨|talk]]) 15:06, 9 October 2026 (UTC) :P.S. I have created a userscript that can mitigate this issue to some extent [[User:鈴音雨/WFSpinner]]. [[User:鈴音雨|鈴音雨]] ([[User talk:鈴音雨|talk]]) 14:12, 10 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #268: Quarterly planning == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-09|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we discuss the work we have planned for this quarter (October-December 2026), we introduce news in Types, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Also, we remind you that if you have questions or ideas to discuss, the next '''Volunteers' Corner''' will be held on '''[https://zonestamp.toolforge.org/1791826200 October 12, at 17:30 UTC]''' ([https://meet.google.com/xuy-njxh-rkw link to the meeting]). Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 15:42, 10 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31143368 --> :<q>While [Z91/Z92] were really important for having translatable HTML error messages, we believe they can also be used for a lot other things [...]</q><br>So [[Talk:Z91#Generality|that's a no]], then. I don't mean to sound ungrateful, but we still don't have consistency with the current text Types, so telling us to adopt more is only going to result in fragmentation and confusion, at least in the short term. And there isn't a way (except a message/template on the talk page) to [[WF:Type_proposals/Typed_string|distinguish]] when a {{Z|91}}, or any textual object, contains <code>$1</code> markers which need to be replaced. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 21:57, 10 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #269: Changes in evaluator representations == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-17|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we introduce our latest changes in evaluator representations, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 10:46, 17 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31162541 --> == October 2026 Wikimedia Café: legal issues on Commons, and WMF Board selection process == <div class="border-box" style="background-color: var(--background-color-warning-subtle, #f8eaba); max-width: 875px; padding: 5px; border: 1px solid black; margin: 5px; color: var(--clr-dark)"> <div class="box" style="float:left; padding-top: 10px; padding-right: 10px; padding-left: 10px; padding-bottom: 10px;">[[File:Wikimedia Café logo in plain SVG format.svg|60px|alt=The logo for the Wikimedia Café]]</div> Hello! There will be two '''[https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9 Wikimedia Café]''' discussion opportunities in October. In a change from the usual Café practice, this month's sessions will have different topics. Anyone who meets the Café attendance criteria is welcome to attend either or both sessions. Session A will happen on Saturday, 24 October 2026 at 15:00 UTC ([https://zonestamp.toolforge.org/1792854000 timestamp converter]), at a time friendly to the Americas, Africa, and Europe. This session will feature [https://meta.wikimedia.org/wiki/User:PBradley-WMF Wikimedia Foundation lawyer Phil Bradley-Schmieg]. We will discuss legal issues on Wikimedia Commons, including complexities of international law. (I am hoping that in a future month, a similar Café session will be offered at a time friendly to Asia and the Pacific.) Session B will happen on Sunday, 25 October 2026 at 03:00 UTC ([https://zonestamp.toolforge.org/1792897200 timestamp converter]), at a time friendly to Asia and the Pacific, we will discuss [https://meta.wikimedia.org/wiki/Wikimedia_Foundation_elections/2027/Proposed_eligibility_criteria proposed changes to how Wikimedia Foundation Board candidates are selected]. The latest proposals are much different from the earlier July 2026 proposals. The due date for feedback on current proposals is 27 October, and Wikimedians are welcome to participate on the [https://meta.wikimedia.org/wiki/Talk:Wikimedia_Foundation_elections/2027/Proposed_eligibility_criteria proposal talk page] regardless of Café attendance. Please see the [https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9 Café] page for more information, including [https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9#How_to_attend_the_session how to register]! To subscribe or unsubscribe for Café notices on your talk page please [https://meta.wikimedia.org/wiki/Global_message_delivery/Targets/Wikimedia_Caf%C3%A9 go here]. <br /> [[File:Buntstifte Eberhard Faber crop 64h.jpg|860px|alt=cropped image of colored pencils]]</div> <span style="white-space:nowrap;">[[User:Pine|<span style="color:#01796f; text-shadow:#00BFFF 0 0 1.0em">༄ᨒ𖠰 Pine</span>]] [[User talk:Pine|<span style="color:DeepSkyBlue">(<b style="color:#FFDF00;text-shadow:#FFDF00 0 0 1.0em">✉</b>)</span>]]</span> 06:25, 18 October 2026 (UTC) == Translating "is a" (and similar) == I am trying to learn how to use Abstract Wikipedia after being a Wikipedian for over 20 years, but it is very diffirent. When I look at an article in my own language, words like "is a" and "from" are not translated. I thought it could be a simple and helpful thing to translate those, but I cannot figure out how to do that. /[[User:abbedabb|<b style="color:#ff9c15">abbedabb</b>]][[User talk:abbedabb|<sup><small>talk</small></sup>]] 14:32, 22 October 2026 (UTC) :Try changing the language in the language input to the right side of "Generated text" to Swedish in AW. [[User:ReXLer|ReXLer]] ([[User talk:ReXLer|talk]]) 15:13, 22 October 2026 (UTC) ::That does not answer my question. The generated text is already set to Swedish, but the result is: ::"Astrid Lindgren (is a) författare (from) Sverige." ([https://abstract.wikipedia.org/view/sv/Q55767 link]) ::/[[User:abbedabb|<b style="color:#ff9c15">abbedabb</b>]][[User talk:abbedabb|<sup><small>talk</small></sup>]] 15:20, 22 October 2026 (UTC) :::That's a fallback when there is no version of the thing in the specific language. [[User:ReXLer|ReXLer]] ([[User talk:ReXLer|talk]]) 15:33, 22 October 2026 (UTC) ::::Yes, I know that too, but that does not answer my question either. ::::'''How do I translate those?''' /[[User:abbedabb|<b style="color:#ff9c15">abbedabb</b>]][[User talk:abbedabb|<sup><small>talk</small></sup>]] 15:35, 22 October 2026 (UTC) easy0btuewvuvihzayt6o7hptayf8ln 330970 330902 2026-10-22T22:14:23Z YoshiRulz 10156 /* Translating "is a" (and similar) */ Reply 330970 wikitext text/x-wiki {{shortcut|[[WF:CHAT]]|[[WF:PC]]|[[WF:VP]]}} __NEWSECTIONLINK__ [[Category:Help]] <!-- please do not remove this line --> Welcome to the Project chat, a place to discuss any and all aspects of Wikifunctions: the project itself, policy and proposals, individual data items, technical issues, etc. Other places to find help: * [[Wikifunctions:Administrators' noticeboard]] * [[Wikifunctions:Report a technical problem]] * [[Wikifunctions:FAQ]] {{Autoarchive resolved section |age = 1 |archive = ((FULLPAGENAME))/Archive/((year))/((month:##)) |timeout=30 }} {{Archives|{{#tag:div|<br />{{Flatlist|{{Special:PrefixIndex/WF:Project chat/Archive/|stripprefix=1|hideredirects=1}} |class=mw-collapsible-content|style=font-size:92%;}}|class="mw-collapsible mw-collapsible-toggle mw-collapsed"}} |prefix=WF:Project chat/Archive/ }} == Draft policy for language fallback strategies == [[Help:Language fallback]]<br>I'd appreciate any comments, but I'm particularly seeking approval for this planned mass edit: * '[[Z25065|limited]]' in all [[:Category:Display functions]] * '[[Z14310|none]]' in all [[:Category:Reading functions]] * '[[Z25065|limited]]' in all [[:Category:Abstract description functions]] * NEW STRATEGY '[[Z40583|insistent]]' in all [[:Category:Semantic fragment functions]] (including the ones I haven't categorised yet) * '[[Z40583|insistent]]' in all [[:Category:Hatnote functions]] * '[[Z40583|insistent]]' in all [[:Category:Multilingual captioned image functions]] * '[[Z14310|none]]' in all [[:Category:Conjugation tables]] * '[[Z14310|none]]' in all {{Z|36462}}-producing functions? {{ping|Denny|p=}} * '[[Z25065|limited]]' in everything else: punctuation helpers, lexeme and inflection helpers, partial sentence functions... [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 01:52, 21 October 2026 (UTC) :I am happy that see that you want to structure the language fallback strategies. I can't oversee the consequences, but I trust you in this plan. [[User:HenkvD|HenkvD]] ([[User talk:HenkvD|talk]]) 11:46, 30 August 2026 (UTC) ::At first read, the policy looks great (even if a person speaking fr-CA will probably be angry with that example, despite being largely true). I also approve the planned mass edit so far, it's good to test that. Thanks for the work! [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 16:20, 30 August 2026 (UTC) :::It would also be very great to have a schema and more examples so the policy could be more understandable for newcomers. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 16:22, 30 August 2026 (UTC) :None for the Syntactic tables is a good idea, I think that one will go from experimental right to deprecated anyway. I am not sure yet about the Semantic fragment functions, and would like to see the effect once we have a few more. --[[User:Denny|Denny]] ([[User talk:Denny|talk]]) 11:48, 3 September 2026 (UTC) :Can you provide some examples of things that will change? --[[User:99of9|99of9]] ([[User talk:99of9|talk]]) 04:52, 11 September 2026 (UTC) ::'None' &rarr; 'Limited': {{Z|20780}} will use the Dutch implementation when Afrikaans is requested, instead of the ISO 8601 fallback.<br>'None' &rarr; 'Insistent': {{Z|36083}} will use the English implementation when German is requested, instead of the fallback that's just an arrow.<br>Improvements are very much dependent on how the fallback language lists are configured. And the [[Z14294]]s themselves&mdash;yesterday I went through and replaced hardcoded [ en, en-GB ] with {{Z|33034}}, but in a world where I hadn't, the 'Limited' strategy would be helpful in routing the dialects to en. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 17:13, 11 September 2026 (UTC) :::I'm a bit conflicted here (and I've flipped around in the past too, so don't expect consistency sorry!). In the main articles example, I feel like the default is better than displaying English for German. Main articles doesn't really need words. Certainly En-dialects should get English, but as you say, we have other ways of ensuring that. I don't know enough about Afrikaans to comment on that one. --[[User:99of9|99of9]] ([[User talk:99of9|talk]]) 03:58, 17 September 2026 (UTC) == i can create my own function? == i need enable my implementation for my function Z38065 [[User:Spider077|Spider077]] ([[User talk:Spider077|talk]]) 05:40, 6 September 2026 (UTC) :Please request connections at [[Wikifunctions:Requests for connection and disconnection]]. :I do not think this particular implementation should be connected. :# The function has no test cases, so its intended purpose is not entirely clear. :# The function appears to be a duplicate of {{Z|Z11602}}. :# The implementation will return an error because <code>Text</code> is undefined. :# In any event, <code>print()</code> returns the value <code>None</code>, so the implementation would end up returning {{Z|Z24}}. :Please feel free to reply here if you need any help. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 10:24, 6 September 2026 (UTC) ::I fixed[[File:The Quantum Code.png]] [[User:Spider077|Spider077]] ([[User talk:Spider077|talk]]) 14:30, 29 September 2026 (UTC) == Technical limitations or something on my side? == Hi there, I'm experimenting with different ways to improve NLG in French (many things to do). I experiment some limitations, I don't if they come from the software or something I did: # I tried to create a typed list in {{Z|Z42597}}, similarly to {{Z|Z38002}}, but impossible to add this type (I'm blocked with an empty content box). The Edit Raw JSON script also fails on publication. # I tried to find if an item is a subclass of another in {{Z|Z41641}} and {{Z|Z41649}}, but I only get the error "WASM interpreter aborted (unreachable executed)". Is it me? Or some current limitations? Are there workarounds? Any help appreciated! Cheers. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 14:38, 19 September 2026 (UTC) :1. Z42957 is a {{Z|Z6}}. It is possible to create a typed list of {{Z|Z6091}}, if that’s what you have in mind. :2. Yes, that’s a tricky one. I don’t have time right now, but I should be able to look at it in a few hours or tomorrow morning. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 18:24, 19 September 2026 (UTC) ::Thank you! For some reason I couldn't create a typed list earlier, but it looks fixed now (I was able to create {{Z|Z42639}}). The interface could still be a bit clearer... {{Z|Z42597}} can be deleted, btw. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 19:39, 19 September 2026 (UTC) :::Good. I agree, the interface for type specification is a little peculiar for “generic” types. :::I’ve had a little look at your second problem and I don’t have a quick fix. Theoretically, I think you want to apply the subclass test to each of the classes of which the item is an instance, having failed to establish that the item is an instance of the superclass. [https://www.wikifunctions.org/view/en/Z36572?call=%7B%22Z1K1%22%3A%22Z7%22%2C%22Z7K1%22%3A%22Z36572%22%2C%22Z36572K1%22%3A%7B%22Z1K1%22%3A%22Z7%22%2C%22Z7K1%22%3A%22Z30120%22%2C%22Z30120K1%22%3A%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q84%22%7D%2C%22Z30120K2%22%3A%5B%22Z6030%22%2C%22Z6036%22%5D%2C%22Z30120K3%22%3A%5B%22Z60%22%5D%2C%22Z30120K4%22%3A%5B%22Z6092%22%2C%7B%22Z1K1%22%3A%22Z6092%22%2C%22Z6092K1%22%3A%22P31%22%7D%5D%7D%2C%22Z36572K2%22%3A%5B%22Z6091%22%2C%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q486972%22%7D%5D%2C%22Z36572K3%22%3A%7B%22Z1K1%22%3A%22Z13518%22%2C%22Z13518K1%22%3A%223%22%7D%7D This function call] seems to work, but I would be worried about timing out, generally. It would perhaps be better to create a list of classes that are, ultimately, types of human settlement and only use the more expensive traversal for items that are not instances of any of those classes. I don’t see any such list currently, but the idea is expressed in {{Z|Z41921}}, so @[[User:Jsamwrites|Jsamwrites]] might be interested in collaborating. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 20:38, 19 September 2026 (UTC) ::::As I mentioned [[Talk:Z41920|here]], your solution is ideally correct, but because of technical limitations, I created a faster version for general French usages. [[User:Jsamwrites|John Samuel]] 21:11, 19 September 2026 (UTC) :::::Thanks @[[User:GrounderUK|GrounderUK]]! Any help or Phabricator page (or some dashboard) where we could understand what's likely to timeout? I would love to reduce the burden on the servers but I have no clue on what's causing it. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 11:41, 20 September 2026 (UTC) ::::::I’m not aware of a suitable page, but I think it would be a good idea to have one. Perhaps we should add it to [[Special:MyLanguage/Wikifunctions:How to create implementations]], which is linked to from every implementation? We should probably also have a general Phabricator task for logging errors that are hard to understand and/or impossible to translate. This might fit under [[:phab:T432195]], unless @[[User:LMorgantini-WMF|LMorgantini-WMF]] has a better suggestion. ::::::For now, I would only suggest that we: ::::::* generally avoid {{Z|Z6821}} and use either {{Z|Z6820}} or one of its wrappers, like {{Z|Z30120}} or {{Z|Z23762}} ::::::* test using smaller and fewer Wikidata items ::::::* use the same item(s) for different tests, where appropriate ::::::* avoid unnecessary variation in fetch calls. ::::::[[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 13:19, 20 September 2026 (UTC) :::::::* If a function does not need to pull labels or statements from an Item/Property/Lexeme, it should not fetch it. :::::::** When a label or statement ''is'' needed, from that point on you should only pass around the fetched Item/etc. and not its reference. Unfortunately the naming conventions and [[WF:Catalogue/Wikidata_operations/Item#Labels_and_aliases|catalogue]] aren't very helpful for finding the right label functions at the moment. :::::::* Replace {{Z|22820}} with specialised filter functions where possible to avoid having to repeat a long expression. :::::::* When implementing by composition, try to do it without recursion, at least until a non-recursive or code implementation gets connected. Recursive compositions are slower and more annoying to debug. (Code implementations can use recursion with much less overhead, but are limited in other ways ofc.) :::::::* Embedded function calls often fail, even when the same arguments work fine when used on the function's view page. Must be a separate cache. :::::::[[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 22:24, 20 September 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #266: Memoization arriving == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-09-25|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we talk about storing a function call's result in a cache for easier recalling, we analyse how quickly one particular fact propagates through different Wikipedia language editions, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 09:54, 28 September 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=30951652 --> :This memoization is at the global level, but are subexpressions repeated within a composition also memoized / is that planned? Because I've been writing compositions assuming that they would. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 09:59, 28 September 2026 (UTC) ::Memoization is working on subexpressions. It should capture repeated subcalls within a composition and even across different calls to the orchestrator, so your assumption is safe. ::HOWEVER, be aware that we're only memoizing a very short list of functions so far (<code>[ 'Z860', 'Z885', 'Z101', 'Z10047', 'Z189' ]</code>). We plan to expand this list in future. Very open to suggestions about which functions we should consider; we've based these decisions on benchmarks but would also benefit from advice from composition implementers! [[User:CMassaro (WMF)|CMassaro (WMF)]] ([[User talk:CMassaro (WMF)|talk]]) 17:10, 29 September 2026 (UTC) :::I think it’s worth distinguishing between extrinsic caching of function call results and intrinsic memoization of objects during a function call evaluation. To my mind, “subexpressions repeated within a composition” would fall into the latter category (function call or not), and I believe the Orchestrator generally realizes a repeated subexpression (identical object) only once during a single function call’s evaluation. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 00:08, 30 September 2026 (UTC) :::Good to hear. As for what to do next, I wouldn't trust my intuition over actually measuring. Maybe display functions? [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 06:18, 30 September 2026 (UTC) :::I think the community should avoid recommending functions specifically for memoization. We can highlight functions of particular concern, leaving it to the team to consider whether memoization, new builtins or something else would be the preferred solution. Top of my list is {{Z|Z14310}}, which is a critical dependency for almost all Abstract Wikipedia calls as well as our reading and display functions. This should be considered alongside [[:phab:T390226|T390226: Consider using list inputs to create variadic apply, filter, map, etc. functions]], since the selected function is always applied. :::We should also consider: :::* {{Z|Z13052}} • {{Z|Z18683}} • {{Z|Z29294}} • {{Z|Z12696}} :::* {{Z|Z13676}} • {{Z|Z17132}} • {{Z|Z19751}} (or less than, etc) :::* {{Z|Z20943}} :::* {{Z|Z12899}} (or some other string-concatenation function) :::* {{Z|Z18475}} :::I believe that none of the above functions can currently be evaluated without ultimately requiring traversal into code. The groupings reflect my belief that improving any member of the set can improve all members. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 14:08, 1 October 2026 (UTC) ::::{{TakeNote}} My previous reply prioritizing {{Z|Z14310}} was written before [[:phab:T440032|DE2.2.10: Improve language-specific function creation]]. Although that Hypothesis is presented as a usability improvement, I think the solution there should be designed to address the scaling, performance and resilience issues [[:phab:T419789#11782917|previously noted]]. @[[User:Jdforrester (WMF)|Jdforrester (WMF)]] [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 12:18, 11 October 2026 (UTC) :::Ping @[[User:CMassaro (WMF)|CMassaro (WMF)]] [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 11:40, 11 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #267: Refreshing results == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-02|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we talk about two new capabilities addressing the issues of caching and freshness of function call results, we introduce our groundwork to support the first pilot communities for Abstract Wikipedia, we discuss news in Types, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 09:31, 2 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31099195 --> == Reached rate limit in evaluator == I increasingly get errors like "Reached rate limit in evaluator" or "The rendering service is temporarily unavailable. Please, try again later". This makes it almost impossible to work. [[User:HenkvD|HenkvD]] ([[User talk:HenkvD|talk]]) 11:08, 9 October 2026 (UTC) :Tracked in [[phab:T438643]] [[User:鈴音雨|鈴音雨]] ([[User talk:鈴音雨|talk]]) 15:06, 9 October 2026 (UTC) :P.S. I have created a userscript that can mitigate this issue to some extent [[User:鈴音雨/WFSpinner]]. [[User:鈴音雨|鈴音雨]] ([[User talk:鈴音雨|talk]]) 14:12, 10 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #268: Quarterly planning == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-09|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we discuss the work we have planned for this quarter (October-December 2026), we introduce news in Types, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Also, we remind you that if you have questions or ideas to discuss, the next '''Volunteers' Corner''' will be held on '''[https://zonestamp.toolforge.org/1791826200 October 12, at 17:30 UTC]''' ([https://meet.google.com/xuy-njxh-rkw link to the meeting]). Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 15:42, 10 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31143368 --> :<q>While [Z91/Z92] were really important for having translatable HTML error messages, we believe they can also be used for a lot other things [...]</q><br>So [[Talk:Z91#Generality|that's a no]], then. I don't mean to sound ungrateful, but we still don't have consistency with the current text Types, so telling us to adopt more is only going to result in fragmentation and confusion, at least in the short term. And there isn't a way (except a message/template on the talk page) to [[WF:Type_proposals/Typed_string|distinguish]] when a {{Z|91}}, or any textual object, contains <code>$1</code> markers which need to be replaced. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 21:57, 10 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #269: Changes in evaluator representations == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-17|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we introduce our latest changes in evaluator representations, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 10:46, 17 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31162541 --> == October 2026 Wikimedia Café: legal issues on Commons, and WMF Board selection process == <div class="border-box" style="background-color: var(--background-color-warning-subtle, #f8eaba); max-width: 875px; padding: 5px; border: 1px solid black; margin: 5px; color: var(--clr-dark)"> <div class="box" style="float:left; padding-top: 10px; padding-right: 10px; padding-left: 10px; padding-bottom: 10px;">[[File:Wikimedia Café logo in plain SVG format.svg|60px|alt=The logo for the Wikimedia Café]]</div> Hello! There will be two '''[https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9 Wikimedia Café]''' discussion opportunities in October. In a change from the usual Café practice, this month's sessions will have different topics. Anyone who meets the Café attendance criteria is welcome to attend either or both sessions. Session A will happen on Saturday, 24 October 2026 at 15:00 UTC ([https://zonestamp.toolforge.org/1792854000 timestamp converter]), at a time friendly to the Americas, Africa, and Europe. This session will feature [https://meta.wikimedia.org/wiki/User:PBradley-WMF Wikimedia Foundation lawyer Phil Bradley-Schmieg]. We will discuss legal issues on Wikimedia Commons, including complexities of international law. (I am hoping that in a future month, a similar Café session will be offered at a time friendly to Asia and the Pacific.) Session B will happen on Sunday, 25 October 2026 at 03:00 UTC ([https://zonestamp.toolforge.org/1792897200 timestamp converter]), at a time friendly to Asia and the Pacific, we will discuss [https://meta.wikimedia.org/wiki/Wikimedia_Foundation_elections/2027/Proposed_eligibility_criteria proposed changes to how Wikimedia Foundation Board candidates are selected]. The latest proposals are much different from the earlier July 2026 proposals. The due date for feedback on current proposals is 27 October, and Wikimedians are welcome to participate on the [https://meta.wikimedia.org/wiki/Talk:Wikimedia_Foundation_elections/2027/Proposed_eligibility_criteria proposal talk page] regardless of Café attendance. Please see the [https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9 Café] page for more information, including [https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9#How_to_attend_the_session how to register]! To subscribe or unsubscribe for Café notices on your talk page please [https://meta.wikimedia.org/wiki/Global_message_delivery/Targets/Wikimedia_Caf%C3%A9 go here]. <br /> [[File:Buntstifte Eberhard Faber crop 64h.jpg|860px|alt=cropped image of colored pencils]]</div> <span style="white-space:nowrap;">[[User:Pine|<span style="color:#01796f; text-shadow:#00BFFF 0 0 1.0em">༄ᨒ𖠰 Pine</span>]] [[User talk:Pine|<span style="color:DeepSkyBlue">(<b style="color:#FFDF00;text-shadow:#FFDF00 0 0 1.0em">✉</b>)</span>]]</span> 06:25, 18 October 2026 (UTC) == Translating "is a" (and similar) == I am trying to learn how to use Abstract Wikipedia after being a Wikipedian for over 20 years, but it is very diffirent. When I look at an article in my own language, words like "is a" and "from" are not translated. I thought it could be a simple and helpful thing to translate those, but I cannot figure out how to do that. /[[User:abbedabb|<b style="color:#ff9c15">abbedabb</b>]][[User talk:abbedabb|<sup><small>talk</small></sup>]] 14:32, 22 October 2026 (UTC) :Try changing the language in the language input to the right side of "Generated text" to Swedish in AW. [[User:ReXLer|ReXLer]] ([[User talk:ReXLer|talk]]) 15:13, 22 October 2026 (UTC) ::That does not answer my question. The generated text is already set to Swedish, but the result is: ::"Astrid Lindgren (is a) författare (from) Sverige." ([https://abstract.wikipedia.org/view/sv/Q55767 link]) ::/[[User:abbedabb|<b style="color:#ff9c15">abbedabb</b>]][[User talk:abbedabb|<sup><small>talk</small></sup>]] 15:20, 22 October 2026 (UTC) :::That's a fallback when there is no version of the thing in the specific language. [[User:ReXLer|ReXLer]] ([[User talk:ReXLer|talk]]) 15:33, 22 October 2026 (UTC) ::::Yes, I know that too, but that does not answer my question either. ::::'''How do I translate those?''' /[[User:abbedabb|<b style="color:#ff9c15">abbedabb</b>]][[User talk:abbedabb|<sup><small>talk</small></sup>]] 15:35, 22 October 2026 (UTC) :::Use your cursor to find which Function produced that sentence (in this case there's only one so it's pretty obvious). Go to the Function's talk page and hopefully it will have {{t|show function tree}} so that you can jump to the Config from there. The branches corresponding to Configs are the ones with language lists as children. If the template wasn't there you would have to navigate through one or more Implementations.<br>Once you've found the Config, open one of the existing Functions to use as reference, and create a new Function with the same input/output types. Then add it to the Config right away. To save time in writing an Implementation you might be able to copy from another language. Either way you should create a few Tests, which you can copy from AW articles, the top-level Function, or other languages' Functions. There's a longer walkthrough for editing Configs at [[WF:Working with Configuration of functions for given languages]]. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 22:14, 22 October 2026 (UTC) 1gct8ccsvmrrloym1dxu4u3fbk1komy 330971 330970 2026-10-22T22:22:08Z YoshiRulz 10156 /* Translating "is a" (and similar) */ 330971 wikitext text/x-wiki {{shortcut|[[WF:CHAT]]|[[WF:PC]]|[[WF:VP]]}} __NEWSECTIONLINK__ [[Category:Help]] <!-- please do not remove this line --> Welcome to the Project chat, a place to discuss any and all aspects of Wikifunctions: the project itself, policy and proposals, individual data items, technical issues, etc. Other places to find help: * [[Wikifunctions:Administrators' noticeboard]] * [[Wikifunctions:Report a technical problem]] * [[Wikifunctions:FAQ]] {{Autoarchive resolved section |age = 1 |archive = ((FULLPAGENAME))/Archive/((year))/((month:##)) |timeout=30 }} {{Archives|{{#tag:div|<br />{{Flatlist|{{Special:PrefixIndex/WF:Project chat/Archive/|stripprefix=1|hideredirects=1}} |class=mw-collapsible-content|style=font-size:92%;}}|class="mw-collapsible mw-collapsible-toggle mw-collapsed"}} |prefix=WF:Project chat/Archive/ }} == Draft policy for language fallback strategies == [[Help:Language fallback]]<br>I'd appreciate any comments, but I'm particularly seeking approval for this planned mass edit: * '[[Z25065|limited]]' in all [[:Category:Display functions]] * '[[Z14310|none]]' in all [[:Category:Reading functions]] * '[[Z25065|limited]]' in all [[:Category:Abstract description functions]] * NEW STRATEGY '[[Z40583|insistent]]' in all [[:Category:Semantic fragment functions]] (including the ones I haven't categorised yet) * '[[Z40583|insistent]]' in all [[:Category:Hatnote functions]] * '[[Z40583|insistent]]' in all [[:Category:Multilingual captioned image functions]] * '[[Z14310|none]]' in all [[:Category:Conjugation tables]] * '[[Z14310|none]]' in all {{Z|36462}}-producing functions? {{ping|Denny|p=}} * '[[Z25065|limited]]' in everything else: punctuation helpers, lexeme and inflection helpers, partial sentence functions... [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 01:52, 21 October 2026 (UTC) :I am happy that see that you want to structure the language fallback strategies. I can't oversee the consequences, but I trust you in this plan. [[User:HenkvD|HenkvD]] ([[User talk:HenkvD|talk]]) 11:46, 30 August 2026 (UTC) ::At first read, the policy looks great (even if a person speaking fr-CA will probably be angry with that example, despite being largely true). I also approve the planned mass edit so far, it's good to test that. Thanks for the work! [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 16:20, 30 August 2026 (UTC) :::It would also be very great to have a schema and more examples so the policy could be more understandable for newcomers. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 16:22, 30 August 2026 (UTC) :None for the Syntactic tables is a good idea, I think that one will go from experimental right to deprecated anyway. I am not sure yet about the Semantic fragment functions, and would like to see the effect once we have a few more. --[[User:Denny|Denny]] ([[User talk:Denny|talk]]) 11:48, 3 September 2026 (UTC) :Can you provide some examples of things that will change? --[[User:99of9|99of9]] ([[User talk:99of9|talk]]) 04:52, 11 September 2026 (UTC) ::'None' &rarr; 'Limited': {{Z|20780}} will use the Dutch implementation when Afrikaans is requested, instead of the ISO 8601 fallback.<br>'None' &rarr; 'Insistent': {{Z|36083}} will use the English implementation when German is requested, instead of the fallback that's just an arrow.<br>Improvements are very much dependent on how the fallback language lists are configured. And the [[Z14294]]s themselves&mdash;yesterday I went through and replaced hardcoded [ en, en-GB ] with {{Z|33034}}, but in a world where I hadn't, the 'Limited' strategy would be helpful in routing the dialects to en. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 17:13, 11 September 2026 (UTC) :::I'm a bit conflicted here (and I've flipped around in the past too, so don't expect consistency sorry!). In the main articles example, I feel like the default is better than displaying English for German. Main articles doesn't really need words. Certainly En-dialects should get English, but as you say, we have other ways of ensuring that. I don't know enough about Afrikaans to comment on that one. --[[User:99of9|99of9]] ([[User talk:99of9|talk]]) 03:58, 17 September 2026 (UTC) == i can create my own function? == i need enable my implementation for my function Z38065 [[User:Spider077|Spider077]] ([[User talk:Spider077|talk]]) 05:40, 6 September 2026 (UTC) :Please request connections at [[Wikifunctions:Requests for connection and disconnection]]. :I do not think this particular implementation should be connected. :# The function has no test cases, so its intended purpose is not entirely clear. :# The function appears to be a duplicate of {{Z|Z11602}}. :# The implementation will return an error because <code>Text</code> is undefined. :# In any event, <code>print()</code> returns the value <code>None</code>, so the implementation would end up returning {{Z|Z24}}. :Please feel free to reply here if you need any help. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 10:24, 6 September 2026 (UTC) ::I fixed[[File:The Quantum Code.png]] [[User:Spider077|Spider077]] ([[User talk:Spider077|talk]]) 14:30, 29 September 2026 (UTC) == Technical limitations or something on my side? == Hi there, I'm experimenting with different ways to improve NLG in French (many things to do). I experiment some limitations, I don't if they come from the software or something I did: # I tried to create a typed list in {{Z|Z42597}}, similarly to {{Z|Z38002}}, but impossible to add this type (I'm blocked with an empty content box). The Edit Raw JSON script also fails on publication. # I tried to find if an item is a subclass of another in {{Z|Z41641}} and {{Z|Z41649}}, but I only get the error "WASM interpreter aborted (unreachable executed)". Is it me? Or some current limitations? Are there workarounds? Any help appreciated! Cheers. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 14:38, 19 September 2026 (UTC) :1. Z42957 is a {{Z|Z6}}. It is possible to create a typed list of {{Z|Z6091}}, if that’s what you have in mind. :2. Yes, that’s a tricky one. I don’t have time right now, but I should be able to look at it in a few hours or tomorrow morning. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 18:24, 19 September 2026 (UTC) ::Thank you! For some reason I couldn't create a typed list earlier, but it looks fixed now (I was able to create {{Z|Z42639}}). The interface could still be a bit clearer... {{Z|Z42597}} can be deleted, btw. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 19:39, 19 September 2026 (UTC) :::Good. I agree, the interface for type specification is a little peculiar for “generic” types. :::I’ve had a little look at your second problem and I don’t have a quick fix. Theoretically, I think you want to apply the subclass test to each of the classes of which the item is an instance, having failed to establish that the item is an instance of the superclass. [https://www.wikifunctions.org/view/en/Z36572?call=%7B%22Z1K1%22%3A%22Z7%22%2C%22Z7K1%22%3A%22Z36572%22%2C%22Z36572K1%22%3A%7B%22Z1K1%22%3A%22Z7%22%2C%22Z7K1%22%3A%22Z30120%22%2C%22Z30120K1%22%3A%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q84%22%7D%2C%22Z30120K2%22%3A%5B%22Z6030%22%2C%22Z6036%22%5D%2C%22Z30120K3%22%3A%5B%22Z60%22%5D%2C%22Z30120K4%22%3A%5B%22Z6092%22%2C%7B%22Z1K1%22%3A%22Z6092%22%2C%22Z6092K1%22%3A%22P31%22%7D%5D%7D%2C%22Z36572K2%22%3A%5B%22Z6091%22%2C%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q486972%22%7D%5D%2C%22Z36572K3%22%3A%7B%22Z1K1%22%3A%22Z13518%22%2C%22Z13518K1%22%3A%223%22%7D%7D This function call] seems to work, but I would be worried about timing out, generally. It would perhaps be better to create a list of classes that are, ultimately, types of human settlement and only use the more expensive traversal for items that are not instances of any of those classes. I don’t see any such list currently, but the idea is expressed in {{Z|Z41921}}, so @[[User:Jsamwrites|Jsamwrites]] might be interested in collaborating. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 20:38, 19 September 2026 (UTC) ::::As I mentioned [[Talk:Z41920|here]], your solution is ideally correct, but because of technical limitations, I created a faster version for general French usages. [[User:Jsamwrites|John Samuel]] 21:11, 19 September 2026 (UTC) :::::Thanks @[[User:GrounderUK|GrounderUK]]! Any help or Phabricator page (or some dashboard) where we could understand what's likely to timeout? I would love to reduce the burden on the servers but I have no clue on what's causing it. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 11:41, 20 September 2026 (UTC) ::::::I’m not aware of a suitable page, but I think it would be a good idea to have one. Perhaps we should add it to [[Special:MyLanguage/Wikifunctions:How to create implementations]], which is linked to from every implementation? We should probably also have a general Phabricator task for logging errors that are hard to understand and/or impossible to translate. This might fit under [[:phab:T432195]], unless @[[User:LMorgantini-WMF|LMorgantini-WMF]] has a better suggestion. ::::::For now, I would only suggest that we: ::::::* generally avoid {{Z|Z6821}} and use either {{Z|Z6820}} or one of its wrappers, like {{Z|Z30120}} or {{Z|Z23762}} ::::::* test using smaller and fewer Wikidata items ::::::* use the same item(s) for different tests, where appropriate ::::::* avoid unnecessary variation in fetch calls. ::::::[[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 13:19, 20 September 2026 (UTC) :::::::* If a function does not need to pull labels or statements from an Item/Property/Lexeme, it should not fetch it. :::::::** When a label or statement ''is'' needed, from that point on you should only pass around the fetched Item/etc. and not its reference. Unfortunately the naming conventions and [[WF:Catalogue/Wikidata_operations/Item#Labels_and_aliases|catalogue]] aren't very helpful for finding the right label functions at the moment. :::::::* Replace {{Z|22820}} with specialised filter functions where possible to avoid having to repeat a long expression. :::::::* When implementing by composition, try to do it without recursion, at least until a non-recursive or code implementation gets connected. Recursive compositions are slower and more annoying to debug. (Code implementations can use recursion with much less overhead, but are limited in other ways ofc.) :::::::* Embedded function calls often fail, even when the same arguments work fine when used on the function's view page. Must be a separate cache. :::::::[[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 22:24, 20 September 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #266: Memoization arriving == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-09-25|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we talk about storing a function call's result in a cache for easier recalling, we analyse how quickly one particular fact propagates through different Wikipedia language editions, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 09:54, 28 September 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=30951652 --> :This memoization is at the global level, but are subexpressions repeated within a composition also memoized / is that planned? Because I've been writing compositions assuming that they would. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 09:59, 28 September 2026 (UTC) ::Memoization is working on subexpressions. It should capture repeated subcalls within a composition and even across different calls to the orchestrator, so your assumption is safe. ::HOWEVER, be aware that we're only memoizing a very short list of functions so far (<code>[ 'Z860', 'Z885', 'Z101', 'Z10047', 'Z189' ]</code>). We plan to expand this list in future. Very open to suggestions about which functions we should consider; we've based these decisions on benchmarks but would also benefit from advice from composition implementers! [[User:CMassaro (WMF)|CMassaro (WMF)]] ([[User talk:CMassaro (WMF)|talk]]) 17:10, 29 September 2026 (UTC) :::I think it’s worth distinguishing between extrinsic caching of function call results and intrinsic memoization of objects during a function call evaluation. To my mind, “subexpressions repeated within a composition” would fall into the latter category (function call or not), and I believe the Orchestrator generally realizes a repeated subexpression (identical object) only once during a single function call’s evaluation. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 00:08, 30 September 2026 (UTC) :::Good to hear. As for what to do next, I wouldn't trust my intuition over actually measuring. Maybe display functions? [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 06:18, 30 September 2026 (UTC) :::I think the community should avoid recommending functions specifically for memoization. We can highlight functions of particular concern, leaving it to the team to consider whether memoization, new builtins or something else would be the preferred solution. Top of my list is {{Z|Z14310}}, which is a critical dependency for almost all Abstract Wikipedia calls as well as our reading and display functions. This should be considered alongside [[:phab:T390226|T390226: Consider using list inputs to create variadic apply, filter, map, etc. functions]], since the selected function is always applied. :::We should also consider: :::* {{Z|Z13052}} • {{Z|Z18683}} • {{Z|Z29294}} • {{Z|Z12696}} :::* {{Z|Z13676}} • {{Z|Z17132}} • {{Z|Z19751}} (or less than, etc) :::* {{Z|Z20943}} :::* {{Z|Z12899}} (or some other string-concatenation function) :::* {{Z|Z18475}} :::I believe that none of the above functions can currently be evaluated without ultimately requiring traversal into code. The groupings reflect my belief that improving any member of the set can improve all members. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 14:08, 1 October 2026 (UTC) ::::{{TakeNote}} My previous reply prioritizing {{Z|Z14310}} was written before [[:phab:T440032|DE2.2.10: Improve language-specific function creation]]. Although that Hypothesis is presented as a usability improvement, I think the solution there should be designed to address the scaling, performance and resilience issues [[:phab:T419789#11782917|previously noted]]. @[[User:Jdforrester (WMF)|Jdforrester (WMF)]] [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 12:18, 11 October 2026 (UTC) :::Ping @[[User:CMassaro (WMF)|CMassaro (WMF)]] [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 11:40, 11 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #267: Refreshing results == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-02|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we talk about two new capabilities addressing the issues of caching and freshness of function call results, we introduce our groundwork to support the first pilot communities for Abstract Wikipedia, we discuss news in Types, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 09:31, 2 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31099195 --> == Reached rate limit in evaluator == I increasingly get errors like "Reached rate limit in evaluator" or "The rendering service is temporarily unavailable. Please, try again later". This makes it almost impossible to work. [[User:HenkvD|HenkvD]] ([[User talk:HenkvD|talk]]) 11:08, 9 October 2026 (UTC) :Tracked in [[phab:T438643]] [[User:鈴音雨|鈴音雨]] ([[User talk:鈴音雨|talk]]) 15:06, 9 October 2026 (UTC) :P.S. I have created a userscript that can mitigate this issue to some extent [[User:鈴音雨/WFSpinner]]. [[User:鈴音雨|鈴音雨]] ([[User talk:鈴音雨|talk]]) 14:12, 10 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #268: Quarterly planning == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-09|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we discuss the work we have planned for this quarter (October-December 2026), we introduce news in Types, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Also, we remind you that if you have questions or ideas to discuss, the next '''Volunteers' Corner''' will be held on '''[https://zonestamp.toolforge.org/1791826200 October 12, at 17:30 UTC]''' ([https://meet.google.com/xuy-njxh-rkw link to the meeting]). Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 15:42, 10 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31143368 --> :<q>While [Z91/Z92] were really important for having translatable HTML error messages, we believe they can also be used for a lot other things [...]</q><br>So [[Talk:Z91#Generality|that's a no]], then. I don't mean to sound ungrateful, but we still don't have consistency with the current text Types, so telling us to adopt more is only going to result in fragmentation and confusion, at least in the short term. And there isn't a way (except a message/template on the talk page) to [[WF:Type_proposals/Typed_string|distinguish]] when a {{Z|91}}, or any textual object, contains <code>$1</code> markers which need to be replaced. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 21:57, 10 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #269: Changes in evaluator representations == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-17|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we introduce our latest changes in evaluator representations, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 10:46, 17 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31162541 --> == October 2026 Wikimedia Café: legal issues on Commons, and WMF Board selection process == <div class="border-box" style="background-color: var(--background-color-warning-subtle, #f8eaba); max-width: 875px; padding: 5px; border: 1px solid black; margin: 5px; color: var(--clr-dark)"> <div class="box" style="float:left; padding-top: 10px; padding-right: 10px; padding-left: 10px; padding-bottom: 10px;">[[File:Wikimedia Café logo in plain SVG format.svg|60px|alt=The logo for the Wikimedia Café]]</div> Hello! There will be two '''[https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9 Wikimedia Café]''' discussion opportunities in October. In a change from the usual Café practice, this month's sessions will have different topics. Anyone who meets the Café attendance criteria is welcome to attend either or both sessions. Session A will happen on Saturday, 24 October 2026 at 15:00 UTC ([https://zonestamp.toolforge.org/1792854000 timestamp converter]), at a time friendly to the Americas, Africa, and Europe. This session will feature [https://meta.wikimedia.org/wiki/User:PBradley-WMF Wikimedia Foundation lawyer Phil Bradley-Schmieg]. We will discuss legal issues on Wikimedia Commons, including complexities of international law. (I am hoping that in a future month, a similar Café session will be offered at a time friendly to Asia and the Pacific.) Session B will happen on Sunday, 25 October 2026 at 03:00 UTC ([https://zonestamp.toolforge.org/1792897200 timestamp converter]), at a time friendly to Asia and the Pacific, we will discuss [https://meta.wikimedia.org/wiki/Wikimedia_Foundation_elections/2027/Proposed_eligibility_criteria proposed changes to how Wikimedia Foundation Board candidates are selected]. The latest proposals are much different from the earlier July 2026 proposals. The due date for feedback on current proposals is 27 October, and Wikimedians are welcome to participate on the [https://meta.wikimedia.org/wiki/Talk:Wikimedia_Foundation_elections/2027/Proposed_eligibility_criteria proposal talk page] regardless of Café attendance. Please see the [https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9 Café] page for more information, including [https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9#How_to_attend_the_session how to register]! To subscribe or unsubscribe for Café notices on your talk page please [https://meta.wikimedia.org/wiki/Global_message_delivery/Targets/Wikimedia_Caf%C3%A9 go here]. <br /> [[File:Buntstifte Eberhard Faber crop 64h.jpg|860px|alt=cropped image of colored pencils]]</div> <span style="white-space:nowrap;">[[User:Pine|<span style="color:#01796f; text-shadow:#00BFFF 0 0 1.0em">༄ᨒ𖠰 Pine</span>]] [[User talk:Pine|<span style="color:DeepSkyBlue">(<b style="color:#FFDF00;text-shadow:#FFDF00 0 0 1.0em">✉</b>)</span>]]</span> 06:25, 18 October 2026 (UTC) == Translating "is a" (and similar) == I am trying to learn how to use Abstract Wikipedia after being a Wikipedian for over 20 years, but it is very diffirent. When I look at an article in my own language, words like "is a" and "from" are not translated. I thought it could be a simple and helpful thing to translate those, but I cannot figure out how to do that. /[[User:abbedabb|<b style="color:#ff9c15">abbedabb</b>]][[User talk:abbedabb|<sup><small>talk</small></sup>]] 14:32, 22 October 2026 (UTC) :Try changing the language in the language input to the right side of "Generated text" to Swedish in AW. [[User:ReXLer|ReXLer]] ([[User talk:ReXLer|talk]]) 15:13, 22 October 2026 (UTC) ::That does not answer my question. The generated text is already set to Swedish, but the result is: ::"Astrid Lindgren (is a) författare (from) Sverige." ([https://abstract.wikipedia.org/view/sv/Q55767 link]) ::/[[User:abbedabb|<b style="color:#ff9c15">abbedabb</b>]][[User talk:abbedabb|<sup><small>talk</small></sup>]] 15:20, 22 October 2026 (UTC) :::That's a fallback when there is no version of the thing in the specific language. [[User:ReXLer|ReXLer]] ([[User talk:ReXLer|talk]]) 15:33, 22 October 2026 (UTC) ::::Yes, I know that too, but that does not answer my question either. ::::'''How do I translate those?''' /[[User:abbedabb|<b style="color:#ff9c15">abbedabb</b>]][[User talk:abbedabb|<sup><small>talk</small></sup>]] 15:35, 22 October 2026 (UTC) :::Use your cursor to find which Function produced that sentence (in this case there's only one so it's pretty obvious). Go to the Function's talk page and hopefully it will have {{t|show function tree}} so that you can jump to the Config from there. The branches corresponding to Configs are the ones with language lists as children. If the template wasn't there you would have to navigate through one or more Implementations.<br>Once you've found the Config, open one of the existing Functions to use as reference, and create a new Function with the same input/output types. Then add it to the Config right away. To save time in writing an Implementation you might be able to copy from another language. Either way you should create a few Tests, which you can copy from AW articles, the top-level Function, or other languages' Functions. There's a longer walkthrough at [[WF:Working with Configuration of functions for given languages]].<br>Notice this process doesn't involve ''translating from English'' (unless you copied from its Function). Content for AW is generated by Functions specific to a language or languages, starting from QIDs. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 22:14, 22 October 2026 (UTC) 6938u8feb8rld0piy9plcw5vlvdd87o 330972 330971 2026-10-22T22:52:54Z 99of9 1622 /* Translating "is a" (and similar) */ Reply 330972 wikitext text/x-wiki {{shortcut|[[WF:CHAT]]|[[WF:PC]]|[[WF:VP]]}} __NEWSECTIONLINK__ [[Category:Help]] <!-- please do not remove this line --> Welcome to the Project chat, a place to discuss any and all aspects of Wikifunctions: the project itself, policy and proposals, individual data items, technical issues, etc. Other places to find help: * [[Wikifunctions:Administrators' noticeboard]] * [[Wikifunctions:Report a technical problem]] * [[Wikifunctions:FAQ]] {{Autoarchive resolved section |age = 1 |archive = ((FULLPAGENAME))/Archive/((year))/((month:##)) |timeout=30 }} {{Archives|{{#tag:div|<br />{{Flatlist|{{Special:PrefixIndex/WF:Project chat/Archive/|stripprefix=1|hideredirects=1}} |class=mw-collapsible-content|style=font-size:92%;}}|class="mw-collapsible mw-collapsible-toggle mw-collapsed"}} |prefix=WF:Project chat/Archive/ }} == Draft policy for language fallback strategies == [[Help:Language fallback]]<br>I'd appreciate any comments, but I'm particularly seeking approval for this planned mass edit: * '[[Z25065|limited]]' in all [[:Category:Display functions]] * '[[Z14310|none]]' in all [[:Category:Reading functions]] * '[[Z25065|limited]]' in all [[:Category:Abstract description functions]] * NEW STRATEGY '[[Z40583|insistent]]' in all [[:Category:Semantic fragment functions]] (including the ones I haven't categorised yet) * '[[Z40583|insistent]]' in all [[:Category:Hatnote functions]] * '[[Z40583|insistent]]' in all [[:Category:Multilingual captioned image functions]] * '[[Z14310|none]]' in all [[:Category:Conjugation tables]] * '[[Z14310|none]]' in all {{Z|36462}}-producing functions? {{ping|Denny|p=}} * '[[Z25065|limited]]' in everything else: punctuation helpers, lexeme and inflection helpers, partial sentence functions... [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 01:52, 21 October 2026 (UTC) :I am happy that see that you want to structure the language fallback strategies. I can't oversee the consequences, but I trust you in this plan. [[User:HenkvD|HenkvD]] ([[User talk:HenkvD|talk]]) 11:46, 30 August 2026 (UTC) ::At first read, the policy looks great (even if a person speaking fr-CA will probably be angry with that example, despite being largely true). I also approve the planned mass edit so far, it's good to test that. Thanks for the work! [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 16:20, 30 August 2026 (UTC) :::It would also be very great to have a schema and more examples so the policy could be more understandable for newcomers. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 16:22, 30 August 2026 (UTC) :None for the Syntactic tables is a good idea, I think that one will go from experimental right to deprecated anyway. I am not sure yet about the Semantic fragment functions, and would like to see the effect once we have a few more. --[[User:Denny|Denny]] ([[User talk:Denny|talk]]) 11:48, 3 September 2026 (UTC) :Can you provide some examples of things that will change? --[[User:99of9|99of9]] ([[User talk:99of9|talk]]) 04:52, 11 September 2026 (UTC) ::'None' &rarr; 'Limited': {{Z|20780}} will use the Dutch implementation when Afrikaans is requested, instead of the ISO 8601 fallback.<br>'None' &rarr; 'Insistent': {{Z|36083}} will use the English implementation when German is requested, instead of the fallback that's just an arrow.<br>Improvements are very much dependent on how the fallback language lists are configured. And the [[Z14294]]s themselves&mdash;yesterday I went through and replaced hardcoded [ en, en-GB ] with {{Z|33034}}, but in a world where I hadn't, the 'Limited' strategy would be helpful in routing the dialects to en. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 17:13, 11 September 2026 (UTC) :::I'm a bit conflicted here (and I've flipped around in the past too, so don't expect consistency sorry!). In the main articles example, I feel like the default is better than displaying English for German. Main articles doesn't really need words. Certainly En-dialects should get English, but as you say, we have other ways of ensuring that. I don't know enough about Afrikaans to comment on that one. --[[User:99of9|99of9]] ([[User talk:99of9|talk]]) 03:58, 17 September 2026 (UTC) == i can create my own function? == i need enable my implementation for my function Z38065 [[User:Spider077|Spider077]] ([[User talk:Spider077|talk]]) 05:40, 6 September 2026 (UTC) :Please request connections at [[Wikifunctions:Requests for connection and disconnection]]. :I do not think this particular implementation should be connected. :# The function has no test cases, so its intended purpose is not entirely clear. :# The function appears to be a duplicate of {{Z|Z11602}}. :# The implementation will return an error because <code>Text</code> is undefined. :# In any event, <code>print()</code> returns the value <code>None</code>, so the implementation would end up returning {{Z|Z24}}. :Please feel free to reply here if you need any help. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 10:24, 6 September 2026 (UTC) ::I fixed[[File:The Quantum Code.png]] [[User:Spider077|Spider077]] ([[User talk:Spider077|talk]]) 14:30, 29 September 2026 (UTC) == Technical limitations or something on my side? == Hi there, I'm experimenting with different ways to improve NLG in French (many things to do). I experiment some limitations, I don't if they come from the software or something I did: # I tried to create a typed list in {{Z|Z42597}}, similarly to {{Z|Z38002}}, but impossible to add this type (I'm blocked with an empty content box). The Edit Raw JSON script also fails on publication. # I tried to find if an item is a subclass of another in {{Z|Z41641}} and {{Z|Z41649}}, but I only get the error "WASM interpreter aborted (unreachable executed)". Is it me? Or some current limitations? Are there workarounds? Any help appreciated! Cheers. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 14:38, 19 September 2026 (UTC) :1. Z42957 is a {{Z|Z6}}. It is possible to create a typed list of {{Z|Z6091}}, if that’s what you have in mind. :2. Yes, that’s a tricky one. I don’t have time right now, but I should be able to look at it in a few hours or tomorrow morning. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 18:24, 19 September 2026 (UTC) ::Thank you! For some reason I couldn't create a typed list earlier, but it looks fixed now (I was able to create {{Z|Z42639}}). The interface could still be a bit clearer... {{Z|Z42597}} can be deleted, btw. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 19:39, 19 September 2026 (UTC) :::Good. I agree, the interface for type specification is a little peculiar for “generic” types. :::I’ve had a little look at your second problem and I don’t have a quick fix. Theoretically, I think you want to apply the subclass test to each of the classes of which the item is an instance, having failed to establish that the item is an instance of the superclass. [https://www.wikifunctions.org/view/en/Z36572?call=%7B%22Z1K1%22%3A%22Z7%22%2C%22Z7K1%22%3A%22Z36572%22%2C%22Z36572K1%22%3A%7B%22Z1K1%22%3A%22Z7%22%2C%22Z7K1%22%3A%22Z30120%22%2C%22Z30120K1%22%3A%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q84%22%7D%2C%22Z30120K2%22%3A%5B%22Z6030%22%2C%22Z6036%22%5D%2C%22Z30120K3%22%3A%5B%22Z60%22%5D%2C%22Z30120K4%22%3A%5B%22Z6092%22%2C%7B%22Z1K1%22%3A%22Z6092%22%2C%22Z6092K1%22%3A%22P31%22%7D%5D%7D%2C%22Z36572K2%22%3A%5B%22Z6091%22%2C%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q486972%22%7D%5D%2C%22Z36572K3%22%3A%7B%22Z1K1%22%3A%22Z13518%22%2C%22Z13518K1%22%3A%223%22%7D%7D This function call] seems to work, but I would be worried about timing out, generally. It would perhaps be better to create a list of classes that are, ultimately, types of human settlement and only use the more expensive traversal for items that are not instances of any of those classes. I don’t see any such list currently, but the idea is expressed in {{Z|Z41921}}, so @[[User:Jsamwrites|Jsamwrites]] might be interested in collaborating. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 20:38, 19 September 2026 (UTC) ::::As I mentioned [[Talk:Z41920|here]], your solution is ideally correct, but because of technical limitations, I created a faster version for general French usages. [[User:Jsamwrites|John Samuel]] 21:11, 19 September 2026 (UTC) :::::Thanks @[[User:GrounderUK|GrounderUK]]! Any help or Phabricator page (or some dashboard) where we could understand what's likely to timeout? I would love to reduce the burden on the servers but I have no clue on what's causing it. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 11:41, 20 September 2026 (UTC) ::::::I’m not aware of a suitable page, but I think it would be a good idea to have one. Perhaps we should add it to [[Special:MyLanguage/Wikifunctions:How to create implementations]], which is linked to from every implementation? We should probably also have a general Phabricator task for logging errors that are hard to understand and/or impossible to translate. This might fit under [[:phab:T432195]], unless @[[User:LMorgantini-WMF|LMorgantini-WMF]] has a better suggestion. ::::::For now, I would only suggest that we: ::::::* generally avoid {{Z|Z6821}} and use either {{Z|Z6820}} or one of its wrappers, like {{Z|Z30120}} or {{Z|Z23762}} ::::::* test using smaller and fewer Wikidata items ::::::* use the same item(s) for different tests, where appropriate ::::::* avoid unnecessary variation in fetch calls. ::::::[[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 13:19, 20 September 2026 (UTC) :::::::* If a function does not need to pull labels or statements from an Item/Property/Lexeme, it should not fetch it. :::::::** When a label or statement ''is'' needed, from that point on you should only pass around the fetched Item/etc. and not its reference. Unfortunately the naming conventions and [[WF:Catalogue/Wikidata_operations/Item#Labels_and_aliases|catalogue]] aren't very helpful for finding the right label functions at the moment. :::::::* Replace {{Z|22820}} with specialised filter functions where possible to avoid having to repeat a long expression. :::::::* When implementing by composition, try to do it without recursion, at least until a non-recursive or code implementation gets connected. Recursive compositions are slower and more annoying to debug. (Code implementations can use recursion with much less overhead, but are limited in other ways ofc.) :::::::* Embedded function calls often fail, even when the same arguments work fine when used on the function's view page. Must be a separate cache. :::::::[[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 22:24, 20 September 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #266: Memoization arriving == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-09-25|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we talk about storing a function call's result in a cache for easier recalling, we analyse how quickly one particular fact propagates through different Wikipedia language editions, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 09:54, 28 September 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=30951652 --> :This memoization is at the global level, but are subexpressions repeated within a composition also memoized / is that planned? Because I've been writing compositions assuming that they would. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 09:59, 28 September 2026 (UTC) ::Memoization is working on subexpressions. It should capture repeated subcalls within a composition and even across different calls to the orchestrator, so your assumption is safe. ::HOWEVER, be aware that we're only memoizing a very short list of functions so far (<code>[ 'Z860', 'Z885', 'Z101', 'Z10047', 'Z189' ]</code>). We plan to expand this list in future. Very open to suggestions about which functions we should consider; we've based these decisions on benchmarks but would also benefit from advice from composition implementers! [[User:CMassaro (WMF)|CMassaro (WMF)]] ([[User talk:CMassaro (WMF)|talk]]) 17:10, 29 September 2026 (UTC) :::I think it’s worth distinguishing between extrinsic caching of function call results and intrinsic memoization of objects during a function call evaluation. To my mind, “subexpressions repeated within a composition” would fall into the latter category (function call or not), and I believe the Orchestrator generally realizes a repeated subexpression (identical object) only once during a single function call’s evaluation. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 00:08, 30 September 2026 (UTC) :::Good to hear. As for what to do next, I wouldn't trust my intuition over actually measuring. Maybe display functions? [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 06:18, 30 September 2026 (UTC) :::I think the community should avoid recommending functions specifically for memoization. We can highlight functions of particular concern, leaving it to the team to consider whether memoization, new builtins or something else would be the preferred solution. Top of my list is {{Z|Z14310}}, which is a critical dependency for almost all Abstract Wikipedia calls as well as our reading and display functions. This should be considered alongside [[:phab:T390226|T390226: Consider using list inputs to create variadic apply, filter, map, etc. functions]], since the selected function is always applied. :::We should also consider: :::* {{Z|Z13052}} • {{Z|Z18683}} • {{Z|Z29294}} • {{Z|Z12696}} :::* {{Z|Z13676}} • {{Z|Z17132}} • {{Z|Z19751}} (or less than, etc) :::* {{Z|Z20943}} :::* {{Z|Z12899}} (or some other string-concatenation function) :::* {{Z|Z18475}} :::I believe that none of the above functions can currently be evaluated without ultimately requiring traversal into code. The groupings reflect my belief that improving any member of the set can improve all members. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 14:08, 1 October 2026 (UTC) ::::{{TakeNote}} My previous reply prioritizing {{Z|Z14310}} was written before [[:phab:T440032|DE2.2.10: Improve language-specific function creation]]. Although that Hypothesis is presented as a usability improvement, I think the solution there should be designed to address the scaling, performance and resilience issues [[:phab:T419789#11782917|previously noted]]. @[[User:Jdforrester (WMF)|Jdforrester (WMF)]] [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 12:18, 11 October 2026 (UTC) :::Ping @[[User:CMassaro (WMF)|CMassaro (WMF)]] [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 11:40, 11 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #267: Refreshing results == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-02|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we talk about two new capabilities addressing the issues of caching and freshness of function call results, we introduce our groundwork to support the first pilot communities for Abstract Wikipedia, we discuss news in Types, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 09:31, 2 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31099195 --> == Reached rate limit in evaluator == I increasingly get errors like "Reached rate limit in evaluator" or "The rendering service is temporarily unavailable. Please, try again later". This makes it almost impossible to work. [[User:HenkvD|HenkvD]] ([[User talk:HenkvD|talk]]) 11:08, 9 October 2026 (UTC) :Tracked in [[phab:T438643]] [[User:鈴音雨|鈴音雨]] ([[User talk:鈴音雨|talk]]) 15:06, 9 October 2026 (UTC) :P.S. I have created a userscript that can mitigate this issue to some extent [[User:鈴音雨/WFSpinner]]. [[User:鈴音雨|鈴音雨]] ([[User talk:鈴音雨|talk]]) 14:12, 10 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #268: Quarterly planning == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-09|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we discuss the work we have planned for this quarter (October-December 2026), we introduce news in Types, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Also, we remind you that if you have questions or ideas to discuss, the next '''Volunteers' Corner''' will be held on '''[https://zonestamp.toolforge.org/1791826200 October 12, at 17:30 UTC]''' ([https://meet.google.com/xuy-njxh-rkw link to the meeting]). Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 15:42, 10 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31143368 --> :<q>While [Z91/Z92] were really important for having translatable HTML error messages, we believe they can also be used for a lot other things [...]</q><br>So [[Talk:Z91#Generality|that's a no]], then. I don't mean to sound ungrateful, but we still don't have consistency with the current text Types, so telling us to adopt more is only going to result in fragmentation and confusion, at least in the short term. And there isn't a way (except a message/template on the talk page) to [[WF:Type_proposals/Typed_string|distinguish]] when a {{Z|91}}, or any textual object, contains <code>$1</code> markers which need to be replaced. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 21:57, 10 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #269: Changes in evaluator representations == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-17|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we introduce our latest changes in evaluator representations, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 10:46, 17 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31162541 --> == October 2026 Wikimedia Café: legal issues on Commons, and WMF Board selection process == <div class="border-box" style="background-color: var(--background-color-warning-subtle, #f8eaba); max-width: 875px; padding: 5px; border: 1px solid black; margin: 5px; color: var(--clr-dark)"> <div class="box" style="float:left; padding-top: 10px; padding-right: 10px; padding-left: 10px; padding-bottom: 10px;">[[File:Wikimedia Café logo in plain SVG format.svg|60px|alt=The logo for the Wikimedia Café]]</div> Hello! There will be two '''[https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9 Wikimedia Café]''' discussion opportunities in October. In a change from the usual Café practice, this month's sessions will have different topics. Anyone who meets the Café attendance criteria is welcome to attend either or both sessions. Session A will happen on Saturday, 24 October 2026 at 15:00 UTC ([https://zonestamp.toolforge.org/1792854000 timestamp converter]), at a time friendly to the Americas, Africa, and Europe. This session will feature [https://meta.wikimedia.org/wiki/User:PBradley-WMF Wikimedia Foundation lawyer Phil Bradley-Schmieg]. We will discuss legal issues on Wikimedia Commons, including complexities of international law. (I am hoping that in a future month, a similar Café session will be offered at a time friendly to Asia and the Pacific.) Session B will happen on Sunday, 25 October 2026 at 03:00 UTC ([https://zonestamp.toolforge.org/1792897200 timestamp converter]), at a time friendly to Asia and the Pacific, we will discuss [https://meta.wikimedia.org/wiki/Wikimedia_Foundation_elections/2027/Proposed_eligibility_criteria proposed changes to how Wikimedia Foundation Board candidates are selected]. The latest proposals are much different from the earlier July 2026 proposals. The due date for feedback on current proposals is 27 October, and Wikimedians are welcome to participate on the [https://meta.wikimedia.org/wiki/Talk:Wikimedia_Foundation_elections/2027/Proposed_eligibility_criteria proposal talk page] regardless of Café attendance. Please see the [https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9 Café] page for more information, including [https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9#How_to_attend_the_session how to register]! To subscribe or unsubscribe for Café notices on your talk page please [https://meta.wikimedia.org/wiki/Global_message_delivery/Targets/Wikimedia_Caf%C3%A9 go here]. <br /> [[File:Buntstifte Eberhard Faber crop 64h.jpg|860px|alt=cropped image of colored pencils]]</div> <span style="white-space:nowrap;">[[User:Pine|<span style="color:#01796f; text-shadow:#00BFFF 0 0 1.0em">༄ᨒ𖠰 Pine</span>]] [[User talk:Pine|<span style="color:DeepSkyBlue">(<b style="color:#FFDF00;text-shadow:#FFDF00 0 0 1.0em">✉</b>)</span>]]</span> 06:25, 18 October 2026 (UTC) == Translating "is a" (and similar) == I am trying to learn how to use Abstract Wikipedia after being a Wikipedian for over 20 years, but it is very diffirent. When I look at an article in my own language, words like "is a" and "from" are not translated. I thought it could be a simple and helpful thing to translate those, but I cannot figure out how to do that. /[[User:abbedabb|<b style="color:#ff9c15">abbedabb</b>]][[User talk:abbedabb|<sup><small>talk</small></sup>]] 14:32, 22 October 2026 (UTC) :Try changing the language in the language input to the right side of "Generated text" to Swedish in AW. [[User:ReXLer|ReXLer]] ([[User talk:ReXLer|talk]]) 15:13, 22 October 2026 (UTC) ::That does not answer my question. The generated text is already set to Swedish, but the result is: ::"Astrid Lindgren (is a) författare (from) Sverige." ([https://abstract.wikipedia.org/view/sv/Q55767 link]) ::/[[User:abbedabb|<b style="color:#ff9c15">abbedabb</b>]][[User talk:abbedabb|<sup><small>talk</small></sup>]] 15:20, 22 October 2026 (UTC) :::That's a fallback when there is no version of the thing in the specific language. [[User:ReXLer|ReXLer]] ([[User talk:ReXLer|talk]]) 15:33, 22 October 2026 (UTC) ::::Yes, I know that too, but that does not answer my question either. ::::'''How do I translate those?''' /[[User:abbedabb|<b style="color:#ff9c15">abbedabb</b>]][[User talk:abbedabb|<sup><small>talk</small></sup>]] 15:35, 22 October 2026 (UTC) :::Use your cursor to find which Function produced that sentence (in this case there's only one so it's pretty obvious). Go to the Function's talk page and hopefully it will have {{t|show function tree}} so that you can jump to the Config from there. The branches corresponding to Configs are the ones with language lists as children. If the template wasn't there you would have to navigate through one or more Implementations.<br>Once you've found the Config, open one of the existing Functions to use as reference, and create a new Function with the same input/output types. Then add it to the Config right away. To save time in writing an Implementation you might be able to copy from another language. Either way you should create a few Tests, which you can copy from AW articles, the top-level Function, or other languages' Functions. There's a longer walkthrough at [[WF:Working with Configuration of functions for given languages]].<br>Notice this process doesn't involve ''translating from English'' (unless you copied from its Function). Content for AW is generated by Functions specific to a language or languages, starting from QIDs. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 22:14, 22 October 2026 (UTC) ::::Good answer. Another way to find the config quickly is to click the 🔧 link at the end of the sentence like "Astrid Lindgren (is a) författare (from) Sverige.🔧" --[[User:99of9|99of9]] ([[User talk:99of9|talk]]) 22:52, 22 October 2026 (UTC) kcne4e7okss5yfy584rp9wgwozm24xk 331036 330972 2026-10-23T03:08:05Z SpBot 978 archive 1 section: 1 to [[Wikifunctions:Project chat/Archive/2026/09]] (after section [[Wikifunctions:Project chat/Archive/2026/09#Technical_limitations_or_something_on_my_side?|Technical_limitations_or_something_on_my_side?]]) - previous edit: [[:User:99of9|99of9]], 2026-10-22 22:52 331036 wikitext text/x-wiki {{shortcut|[[WF:CHAT]]|[[WF:PC]]|[[WF:VP]]}} __NEWSECTIONLINK__ [[Category:Help]] <!-- please do not remove this line --> Welcome to the Project chat, a place to discuss any and all aspects of Wikifunctions: the project itself, policy and proposals, individual data items, technical issues, etc. Other places to find help: * [[Wikifunctions:Administrators' noticeboard]] * [[Wikifunctions:Report a technical problem]] * [[Wikifunctions:FAQ]] {{Autoarchive resolved section |age = 1 |archive = ((FULLPAGENAME))/Archive/((year))/((month:##)) |timeout=30 }} {{Archives|{{#tag:div|<br />{{Flatlist|{{Special:PrefixIndex/WF:Project chat/Archive/|stripprefix=1|hideredirects=1}} |class=mw-collapsible-content|style=font-size:92%;}}|class="mw-collapsible mw-collapsible-toggle mw-collapsed"}} |prefix=WF:Project chat/Archive/ }} == Draft policy for language fallback strategies == [[Help:Language fallback]]<br>I'd appreciate any comments, but I'm particularly seeking approval for this planned mass edit: * '[[Z25065|limited]]' in all [[:Category:Display functions]] * '[[Z14310|none]]' in all [[:Category:Reading functions]] * '[[Z25065|limited]]' in all [[:Category:Abstract description functions]] * NEW STRATEGY '[[Z40583|insistent]]' in all [[:Category:Semantic fragment functions]] (including the ones I haven't categorised yet) * '[[Z40583|insistent]]' in all [[:Category:Hatnote functions]] * '[[Z40583|insistent]]' in all [[:Category:Multilingual captioned image functions]] * '[[Z14310|none]]' in all [[:Category:Conjugation tables]] * '[[Z14310|none]]' in all {{Z|36462}}-producing functions? {{ping|Denny|p=}} * '[[Z25065|limited]]' in everything else: punctuation helpers, lexeme and inflection helpers, partial sentence functions... [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 01:52, 21 October 2026 (UTC) :I am happy that see that you want to structure the language fallback strategies. I can't oversee the consequences, but I trust you in this plan. [[User:HenkvD|HenkvD]] ([[User talk:HenkvD|talk]]) 11:46, 30 August 2026 (UTC) ::At first read, the policy looks great (even if a person speaking fr-CA will probably be angry with that example, despite being largely true). I also approve the planned mass edit so far, it's good to test that. Thanks for the work! [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 16:20, 30 August 2026 (UTC) :::It would also be very great to have a schema and more examples so the policy could be more understandable for newcomers. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 16:22, 30 August 2026 (UTC) :None for the Syntactic tables is a good idea, I think that one will go from experimental right to deprecated anyway. I am not sure yet about the Semantic fragment functions, and would like to see the effect once we have a few more. --[[User:Denny|Denny]] ([[User talk:Denny|talk]]) 11:48, 3 September 2026 (UTC) :Can you provide some examples of things that will change? --[[User:99of9|99of9]] ([[User talk:99of9|talk]]) 04:52, 11 September 2026 (UTC) ::'None' &rarr; 'Limited': {{Z|20780}} will use the Dutch implementation when Afrikaans is requested, instead of the ISO 8601 fallback.<br>'None' &rarr; 'Insistent': {{Z|36083}} will use the English implementation when German is requested, instead of the fallback that's just an arrow.<br>Improvements are very much dependent on how the fallback language lists are configured. And the [[Z14294]]s themselves&mdash;yesterday I went through and replaced hardcoded [ en, en-GB ] with {{Z|33034}}, but in a world where I hadn't, the 'Limited' strategy would be helpful in routing the dialects to en. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 17:13, 11 September 2026 (UTC) :::I'm a bit conflicted here (and I've flipped around in the past too, so don't expect consistency sorry!). In the main articles example, I feel like the default is better than displaying English for German. Main articles doesn't really need words. Certainly En-dialects should get English, but as you say, we have other ways of ensuring that. I don't know enough about Afrikaans to comment on that one. --[[User:99of9|99of9]] ([[User talk:99of9|talk]]) 03:58, 17 September 2026 (UTC) == i can create my own function? == i need enable my implementation for my function Z38065 [[User:Spider077|Spider077]] ([[User talk:Spider077|talk]]) 05:40, 6 September 2026 (UTC) :Please request connections at [[Wikifunctions:Requests for connection and disconnection]]. :I do not think this particular implementation should be connected. :# The function has no test cases, so its intended purpose is not entirely clear. :# The function appears to be a duplicate of {{Z|Z11602}}. :# The implementation will return an error because <code>Text</code> is undefined. :# In any event, <code>print()</code> returns the value <code>None</code>, so the implementation would end up returning {{Z|Z24}}. :Please feel free to reply here if you need any help. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 10:24, 6 September 2026 (UTC) ::I fixed[[File:The Quantum Code.png]] [[User:Spider077|Spider077]] ([[User talk:Spider077|talk]]) 14:30, 29 September 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #266: Memoization arriving == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-09-25|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we talk about storing a function call's result in a cache for easier recalling, we analyse how quickly one particular fact propagates through different Wikipedia language editions, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 09:54, 28 September 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=30951652 --> :This memoization is at the global level, but are subexpressions repeated within a composition also memoized / is that planned? Because I've been writing compositions assuming that they would. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 09:59, 28 September 2026 (UTC) ::Memoization is working on subexpressions. It should capture repeated subcalls within a composition and even across different calls to the orchestrator, so your assumption is safe. ::HOWEVER, be aware that we're only memoizing a very short list of functions so far (<code>[ 'Z860', 'Z885', 'Z101', 'Z10047', 'Z189' ]</code>). We plan to expand this list in future. Very open to suggestions about which functions we should consider; we've based these decisions on benchmarks but would also benefit from advice from composition implementers! [[User:CMassaro (WMF)|CMassaro (WMF)]] ([[User talk:CMassaro (WMF)|talk]]) 17:10, 29 September 2026 (UTC) :::I think it’s worth distinguishing between extrinsic caching of function call results and intrinsic memoization of objects during a function call evaluation. To my mind, “subexpressions repeated within a composition” would fall into the latter category (function call or not), and I believe the Orchestrator generally realizes a repeated subexpression (identical object) only once during a single function call’s evaluation. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 00:08, 30 September 2026 (UTC) :::Good to hear. As for what to do next, I wouldn't trust my intuition over actually measuring. Maybe display functions? [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 06:18, 30 September 2026 (UTC) :::I think the community should avoid recommending functions specifically for memoization. We can highlight functions of particular concern, leaving it to the team to consider whether memoization, new builtins or something else would be the preferred solution. Top of my list is {{Z|Z14310}}, which is a critical dependency for almost all Abstract Wikipedia calls as well as our reading and display functions. This should be considered alongside [[:phab:T390226|T390226: Consider using list inputs to create variadic apply, filter, map, etc. functions]], since the selected function is always applied. :::We should also consider: :::* {{Z|Z13052}} • {{Z|Z18683}} • {{Z|Z29294}} • {{Z|Z12696}} :::* {{Z|Z13676}} • {{Z|Z17132}} • {{Z|Z19751}} (or less than, etc) :::* {{Z|Z20943}} :::* {{Z|Z12899}} (or some other string-concatenation function) :::* {{Z|Z18475}} :::I believe that none of the above functions can currently be evaluated without ultimately requiring traversal into code. The groupings reflect my belief that improving any member of the set can improve all members. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 14:08, 1 October 2026 (UTC) ::::{{TakeNote}} My previous reply prioritizing {{Z|Z14310}} was written before [[:phab:T440032|DE2.2.10: Improve language-specific function creation]]. Although that Hypothesis is presented as a usability improvement, I think the solution there should be designed to address the scaling, performance and resilience issues [[:phab:T419789#11782917|previously noted]]. @[[User:Jdforrester (WMF)|Jdforrester (WMF)]] [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 12:18, 11 October 2026 (UTC) :::Ping @[[User:CMassaro (WMF)|CMassaro (WMF)]] [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 11:40, 11 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #267: Refreshing results == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-02|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we talk about two new capabilities addressing the issues of caching and freshness of function call results, we introduce our groundwork to support the first pilot communities for Abstract Wikipedia, we discuss news in Types, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 09:31, 2 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31099195 --> == Reached rate limit in evaluator == I increasingly get errors like "Reached rate limit in evaluator" or "The rendering service is temporarily unavailable. Please, try again later". This makes it almost impossible to work. [[User:HenkvD|HenkvD]] ([[User talk:HenkvD|talk]]) 11:08, 9 October 2026 (UTC) :Tracked in [[phab:T438643]] [[User:鈴音雨|鈴音雨]] ([[User talk:鈴音雨|talk]]) 15:06, 9 October 2026 (UTC) :P.S. I have created a userscript that can mitigate this issue to some extent [[User:鈴音雨/WFSpinner]]. [[User:鈴音雨|鈴音雨]] ([[User talk:鈴音雨|talk]]) 14:12, 10 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #268: Quarterly planning == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-09|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we discuss the work we have planned for this quarter (October-December 2026), we introduce news in Types, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Also, we remind you that if you have questions or ideas to discuss, the next '''Volunteers' Corner''' will be held on '''[https://zonestamp.toolforge.org/1791826200 October 12, at 17:30 UTC]''' ([https://meet.google.com/xuy-njxh-rkw link to the meeting]). Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 15:42, 10 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31143368 --> :<q>While [Z91/Z92] were really important for having translatable HTML error messages, we believe they can also be used for a lot other things [...]</q><br>So [[Talk:Z91#Generality|that's a no]], then. I don't mean to sound ungrateful, but we still don't have consistency with the current text Types, so telling us to adopt more is only going to result in fragmentation and confusion, at least in the short term. And there isn't a way (except a message/template on the talk page) to [[WF:Type_proposals/Typed_string|distinguish]] when a {{Z|91}}, or any textual object, contains <code>$1</code> markers which need to be replaced. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 21:57, 10 October 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #269: Changes in evaluator representations == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-10-17|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we introduce our latest changes in evaluator representations, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 10:46, 17 October 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=31162541 --> == October 2026 Wikimedia Café: legal issues on Commons, and WMF Board selection process == <div class="border-box" style="background-color: var(--background-color-warning-subtle, #f8eaba); max-width: 875px; padding: 5px; border: 1px solid black; margin: 5px; color: var(--clr-dark)"> <div class="box" style="float:left; padding-top: 10px; padding-right: 10px; padding-left: 10px; padding-bottom: 10px;">[[File:Wikimedia Café logo in plain SVG format.svg|60px|alt=The logo for the Wikimedia Café]]</div> Hello! There will be two '''[https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9 Wikimedia Café]''' discussion opportunities in October. In a change from the usual Café practice, this month's sessions will have different topics. Anyone who meets the Café attendance criteria is welcome to attend either or both sessions. Session A will happen on Saturday, 24 October 2026 at 15:00 UTC ([https://zonestamp.toolforge.org/1792854000 timestamp converter]), at a time friendly to the Americas, Africa, and Europe. This session will feature [https://meta.wikimedia.org/wiki/User:PBradley-WMF Wikimedia Foundation lawyer Phil Bradley-Schmieg]. We will discuss legal issues on Wikimedia Commons, including complexities of international law. (I am hoping that in a future month, a similar Café session will be offered at a time friendly to Asia and the Pacific.) Session B will happen on Sunday, 25 October 2026 at 03:00 UTC ([https://zonestamp.toolforge.org/1792897200 timestamp converter]), at a time friendly to Asia and the Pacific, we will discuss [https://meta.wikimedia.org/wiki/Wikimedia_Foundation_elections/2027/Proposed_eligibility_criteria proposed changes to how Wikimedia Foundation Board candidates are selected]. The latest proposals are much different from the earlier July 2026 proposals. The due date for feedback on current proposals is 27 October, and Wikimedians are welcome to participate on the [https://meta.wikimedia.org/wiki/Talk:Wikimedia_Foundation_elections/2027/Proposed_eligibility_criteria proposal talk page] regardless of Café attendance. Please see the [https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9 Café] page for more information, including [https://meta.wikimedia.org/wiki/Wikimedia_Caf%C3%A9#How_to_attend_the_session how to register]! To subscribe or unsubscribe for Café notices on your talk page please [https://meta.wikimedia.org/wiki/Global_message_delivery/Targets/Wikimedia_Caf%C3%A9 go here]. <br /> [[File:Buntstifte Eberhard Faber crop 64h.jpg|860px|alt=cropped image of colored pencils]]</div> <span style="white-space:nowrap;">[[User:Pine|<span style="color:#01796f; text-shadow:#00BFFF 0 0 1.0em">༄ᨒ𖠰 Pine</span>]] [[User talk:Pine|<span style="color:DeepSkyBlue">(<b style="color:#FFDF00;text-shadow:#FFDF00 0 0 1.0em">✉</b>)</span>]]</span> 06:25, 18 October 2026 (UTC) == Translating "is a" (and similar) == I am trying to learn how to use Abstract Wikipedia after being a Wikipedian for over 20 years, but it is very diffirent. When I look at an article in my own language, words like "is a" and "from" are not translated. I thought it could be a simple and helpful thing to translate those, but I cannot figure out how to do that. /[[User:abbedabb|<b style="color:#ff9c15">abbedabb</b>]][[User talk:abbedabb|<sup><small>talk</small></sup>]] 14:32, 22 October 2026 (UTC) :Try changing the language in the language input to the right side of "Generated text" to Swedish in AW. [[User:ReXLer|ReXLer]] ([[User talk:ReXLer|talk]]) 15:13, 22 October 2026 (UTC) ::That does not answer my question. The generated text is already set to Swedish, but the result is: ::"Astrid Lindgren (is a) författare (from) Sverige." ([https://abstract.wikipedia.org/view/sv/Q55767 link]) ::/[[User:abbedabb|<b style="color:#ff9c15">abbedabb</b>]][[User talk:abbedabb|<sup><small>talk</small></sup>]] 15:20, 22 October 2026 (UTC) :::That's a fallback when there is no version of the thing in the specific language. [[User:ReXLer|ReXLer]] ([[User talk:ReXLer|talk]]) 15:33, 22 October 2026 (UTC) ::::Yes, I know that too, but that does not answer my question either. ::::'''How do I translate those?''' /[[User:abbedabb|<b style="color:#ff9c15">abbedabb</b>]][[User talk:abbedabb|<sup><small>talk</small></sup>]] 15:35, 22 October 2026 (UTC) :::Use your cursor to find which Function produced that sentence (in this case there's only one so it's pretty obvious). Go to the Function's talk page and hopefully it will have {{t|show function tree}} so that you can jump to the Config from there. The branches corresponding to Configs are the ones with language lists as children. If the template wasn't there you would have to navigate through one or more Implementations.<br>Once you've found the Config, open one of the existing Functions to use as reference, and create a new Function with the same input/output types. Then add it to the Config right away. To save time in writing an Implementation you might be able to copy from another language. Either way you should create a few Tests, which you can copy from AW articles, the top-level Function, or other languages' Functions. There's a longer walkthrough at [[WF:Working with Configuration of functions for given languages]].<br>Notice this process doesn't involve ''translating from English'' (unless you copied from its Function). Content for AW is generated by Functions specific to a language or languages, starting from QIDs. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 22:14, 22 October 2026 (UTC) ::::Good answer. Another way to find the config quickly is to click the 🔧 link at the end of the sentence like "Astrid Lindgren (is a) författare (from) Sverige.🔧" --[[User:99of9|99of9]] ([[User talk:99of9|talk]]) 22:52, 22 October 2026 (UTC) sx0v4axcjor2h3pb3kk6vkv9gwd8i28 Wikifunctions:What Wikifunctions is not 4 1185 331048 294508 2026-10-23T08:05:50Z Ameisenigel 44 tvar 331048 wikitext text/x-wiki <languages/> {{shortcut|[[WF:NOT]]}} {{Draft}} <translate> <!--T:1--> Wikifunctions is a new kind of website, aiming for a new community. We very much hope to work together with many tools, sites, communities, and kinds of systems that are out there: we want to play together with IDEs, with cloud computing platforms, with app development sites, and many more. <!--T:2--> But we also aim to be a novel thing and we hope to shape a new unique space out for us: a Wikimedia project for everyone to collaboratively create and maintain a library of code functions to support the Wikimedia projects and beyond, for everyone to call and re-use in the world's natural and programming languages. <!--T:3--> The scope of the project is within bounds, though. So, let us also explore '''what Wikifunctions is not'''. == Wikifunctions is not an encyclopædia of algorithms == <!--T:4--> <!--T:5--> This means that we will '''not''' concentrate on having pages for famous and not-so famous algorithms such as [[w:Euclidean algorithm|Euclid's]], [[w:Newton's method|Newton's]], or [[w:Dijkstra's algorithm|Dijkstra's algorithm]], aiming to represent all existing algorithms faithfully and in their historical context. <!--T:6--> Yes, we expect to have a function for the [[w:Greatest common divisor|greatest common divisor]] (GCD) of two integers. And there might be one or more implementations which are based on Euclid's algorithm to calculate the GCD. But Wikifunctions' main goal is not to gather algorithms, and it would not be incomplete if it didn't include some, and used alternatives instead to compute the GCD. If you are looking for that, many Wikipedias are actually [[w:List of algorithms|great resources]]. <!--T:7--> Unlike an encyclopedic overview of existing algorithms, Wikifunctions will also invite original work. We will not be restricted to functions that have been published elsewhere first, and we do not require for every function and implementation to be based on previously published work. Wikifunctions, much like Wikibooks and very unlike Wikipedia, will be open to novel contributions. The main criteria for implementations will be: under which conditions can we run a given implementation, and what resources is it expected to take? == Wikifunctions is not an app development site == <!--T:8--> <!--T:9--> We do not expect to make it possible to create full-fledged, stand-alone apps within Wikifunctions — there will be no place to store state, we don't aim to allow calling external APIs or directly cause changes to other sites, and we don't aim to package up apps with icons and UX, etc. <!--T:10--> We absolutely expect Wikifunctions to be a very useful resource for app developers, and can very much imagine apps that are basically wrappers around one or more functions from Wikifunctions, but these would still need code and other assets which wouldn't be part of Wikifunctions. We are not competing in the area of no-code or low-code development sites. == Wikifunctions is not a code hosting service == <!--T:11--> <!--T:12--> Wikifunctions will host code — but not for whole projects, merely for individual functions. There won't be libraries, apps, or services developed on Wikifunctions with bug-trackers, forums, etc. There won't be a Web-based version control system such as ''Mercurial'' or ''Git'' running against Wikifunctions. <!--T:13--> Again, we hope that there will be libraries, apps, and services that will rely on functions available in Wikifunctions, but they would be developed on a different site, such as ''Gerrit'', ''GitHub'', or ''GitLab''. == Wikifunctions is not a programming language, nor is trying to evangelise a particular language == <!--T:14--> <!--T:15--> Wikifunctions will allow for functions to be implemented in a multitude of programming languages. The possibility to compose functions together to create higher level functions may look a little bit like a new programming language, but it will be extremely limited compared to most other programming languages, since we only allow for nested function calls and that's it. == Wikifunctions is not an Integrated Development Environment (IDE) == <!--T:16--> <!--T:17--> We won't provide you with an interface for creating and developing software projects, interfacing with build, testing, and source control systems. == Wikifunctions is not a question-and-answer website == <!--T:18--> <!--T:19--> We are not competing with ''Stack Overflow'' and similar websites, where a developer would ask how to achieve a certain task and have community members discuss and answer the question. We won't contain code snippets to help answer the question, but we will organize code within our website to enable the evaluation of functions within a library of functions. == Wikifunctions is not a cloud computing platform == <!--T:20--> <!--T:21--> We do not provide computing resources and access to services and APIs so that you can run your computational needs on our platform, either for money or for free. Use of Wikifunctions's evaluation platform is to improve access to knowledge for everyone. == Wikifunctions is not a code snippet website == <!--T:22--> <!--T:23--> We are not competing with code snippet sites such as GitHub Gists, [[w:Rosetta_Code|Rosetta Code]], [<tvar name="2">https://esolangs.org/</tvar> esolangs.org], or [<tvar name="3">http://helloworldcollection.de/</tvar> helloworldcollection.de]. <!--T:27--> Wikifunctions differs in that it allows running code and composing existing functions together to create new ones. As well, Wikifunctions is for useful and meaningful code, not temporary, arbitrary snippets that other platforms may accept. == Wikifunctions is not a code education platform == <!--T:25--> <!--T:26--> We are not focused on teaching people how to code, the material in Wikifunctions will not be laid out in a pedagogical order, and we also won't make sure to comprehensively cover all topics important for coding. In fact, we aim for Wikifunctions to be usable for people who don't know how to code and who don't need to learn how to code to use most of Wikifunctions effectively. Though the Wikifunctions community may well help each other in sharing best practices, style guides, and tips on how to use the site in different languages, these will be aimed at the purpose of serving the world's knowledge. == Wikifunctions is not (only) the boiler room for Abstract Wikipedia == </translate> [[File:Mechanical_room_in_basement._Wayne_N._Aspinall_Federal_Building_and_U.S._Courthouse,_Grand_Junction,_Colorado_LCCN2014650034.tif|thumb|<translate>A '[[<tvar name="1">d:Q6804549</tvar>|boiler room]]', where unsightly-but-vital machinery is hidden</translate>]] <translate> Natural language generation (NLG) is the focus of <tvar name="1">{{SITENAME}}</tvar> as of 2026, and the site began as part of the wider [[<tvar name="2">meta:Special:MyLanguage/Abstract_Wikipedia</tvar>|Abstract Wikipedia project]], but NLG is far from the only field in which functions are being developed. That is to say, WF is necessary for AW, but AW is not necessary for WF. On top of the computer science staples of Boolean logic, arithmetic, and list manipulation, we have useful functions relating to disciplines such as [[<tvar name="1">Z16718</tvar>|chemistry]], [[<tvar name="2">Z35550</tvar>|dimensional analysis]], [[<tvar name="3">Z20074</tvar>|electrical engineering]], [[<tvar name="4">Z22162</tvar>|genomics]], [[<tvar name="5">Z10393</tvar>|information theory]], [[<tvar name="6">Z26830</tvar>|meteorology]], [[<tvar name="7">Z13955</tvar>|number theory]], [[<tvar name="8">Z27919</tvar>|physiology]], [[<tvar name="9">Z20094</tvar>|probability]], [[<tvar name="10">Z24497</tvar>|quantum mechanics]], [[<tvar name="11">Z14226</tvar>|railroad engineering]], [[<tvar name="12">Z28600</tvar>|timekeeping/chronometry]], and [[<tvar name="13">Z26841</tvar>|trigonometry]]. </translate> [[Category:Project concept{{#translation:}}]] inddozdqxi0096725n4wznsczfpownn 331049 331048 2026-10-23T08:06:02Z Ameisenigel 44 Marked this version for translation 331049 wikitext text/x-wiki <languages/> {{shortcut|[[WF:NOT]]}} {{Draft}} <translate> <!--T:1--> Wikifunctions is a new kind of website, aiming for a new community. We very much hope to work together with many tools, sites, communities, and kinds of systems that are out there: we want to play together with IDEs, with cloud computing platforms, with app development sites, and many more. <!--T:2--> But we also aim to be a novel thing and we hope to shape a new unique space out for us: a Wikimedia project for everyone to collaboratively create and maintain a library of code functions to support the Wikimedia projects and beyond, for everyone to call and re-use in the world's natural and programming languages. <!--T:3--> The scope of the project is within bounds, though. So, let us also explore '''what Wikifunctions is not'''. == Wikifunctions is not an encyclopædia of algorithms == <!--T:4--> <!--T:5--> This means that we will '''not''' concentrate on having pages for famous and not-so famous algorithms such as [[w:Euclidean algorithm|Euclid's]], [[w:Newton's method|Newton's]], or [[w:Dijkstra's algorithm|Dijkstra's algorithm]], aiming to represent all existing algorithms faithfully and in their historical context. <!--T:6--> Yes, we expect to have a function for the [[w:Greatest common divisor|greatest common divisor]] (GCD) of two integers. And there might be one or more implementations which are based on Euclid's algorithm to calculate the GCD. But Wikifunctions' main goal is not to gather algorithms, and it would not be incomplete if it didn't include some, and used alternatives instead to compute the GCD. If you are looking for that, many Wikipedias are actually [[w:List of algorithms|great resources]]. <!--T:7--> Unlike an encyclopedic overview of existing algorithms, Wikifunctions will also invite original work. We will not be restricted to functions that have been published elsewhere first, and we do not require for every function and implementation to be based on previously published work. Wikifunctions, much like Wikibooks and very unlike Wikipedia, will be open to novel contributions. The main criteria for implementations will be: under which conditions can we run a given implementation, and what resources is it expected to take? == Wikifunctions is not an app development site == <!--T:8--> <!--T:9--> We do not expect to make it possible to create full-fledged, stand-alone apps within Wikifunctions — there will be no place to store state, we don't aim to allow calling external APIs or directly cause changes to other sites, and we don't aim to package up apps with icons and UX, etc. <!--T:10--> We absolutely expect Wikifunctions to be a very useful resource for app developers, and can very much imagine apps that are basically wrappers around one or more functions from Wikifunctions, but these would still need code and other assets which wouldn't be part of Wikifunctions. We are not competing in the area of no-code or low-code development sites. == Wikifunctions is not a code hosting service == <!--T:11--> <!--T:12--> Wikifunctions will host code — but not for whole projects, merely for individual functions. There won't be libraries, apps, or services developed on Wikifunctions with bug-trackers, forums, etc. There won't be a Web-based version control system such as ''Mercurial'' or ''Git'' running against Wikifunctions. <!--T:13--> Again, we hope that there will be libraries, apps, and services that will rely on functions available in Wikifunctions, but they would be developed on a different site, such as ''Gerrit'', ''GitHub'', or ''GitLab''. == Wikifunctions is not a programming language, nor is trying to evangelise a particular language == <!--T:14--> <!--T:15--> Wikifunctions will allow for functions to be implemented in a multitude of programming languages. The possibility to compose functions together to create higher level functions may look a little bit like a new programming language, but it will be extremely limited compared to most other programming languages, since we only allow for nested function calls and that's it. == Wikifunctions is not an Integrated Development Environment (IDE) == <!--T:16--> <!--T:17--> We won't provide you with an interface for creating and developing software projects, interfacing with build, testing, and source control systems. == Wikifunctions is not a question-and-answer website == <!--T:18--> <!--T:19--> We are not competing with ''Stack Overflow'' and similar websites, where a developer would ask how to achieve a certain task and have community members discuss and answer the question. We won't contain code snippets to help answer the question, but we will organize code within our website to enable the evaluation of functions within a library of functions. == Wikifunctions is not a cloud computing platform == <!--T:20--> <!--T:21--> We do not provide computing resources and access to services and APIs so that you can run your computational needs on our platform, either for money or for free. Use of Wikifunctions's evaluation platform is to improve access to knowledge for everyone. == Wikifunctions is not a code snippet website == <!--T:22--> <!--T:23--> We are not competing with code snippet sites such as GitHub Gists, [[w:Rosetta_Code|Rosetta Code]], [<tvar name="2">https://esolangs.org/</tvar> esolangs.org], or [<tvar name="3">http://helloworldcollection.de/</tvar> helloworldcollection.de]. <!--T:27--> Wikifunctions differs in that it allows running code and composing existing functions together to create new ones. As well, Wikifunctions is for useful and meaningful code, not temporary, arbitrary snippets that other platforms may accept. == Wikifunctions is not a code education platform == <!--T:25--> <!--T:26--> We are not focused on teaching people how to code, the material in Wikifunctions will not be laid out in a pedagogical order, and we also won't make sure to comprehensively cover all topics important for coding. In fact, we aim for Wikifunctions to be usable for people who don't know how to code and who don't need to learn how to code to use most of Wikifunctions effectively. Though the Wikifunctions community may well help each other in sharing best practices, style guides, and tips on how to use the site in different languages, these will be aimed at the purpose of serving the world's knowledge. == Wikifunctions is not (only) the boiler room for Abstract Wikipedia == <!--T:28--> </translate> [[File:Mechanical_room_in_basement._Wayne_N._Aspinall_Federal_Building_and_U.S._Courthouse,_Grand_Junction,_Colorado_LCCN2014650034.tif|thumb|<translate><!--T:29--> A '[[<tvar name="1">d:Q6804549</tvar>|boiler room]]', where unsightly-but-vital machinery is hidden</translate>]] <translate> <!--T:30--> Natural language generation (NLG) is the focus of <tvar name="1">{{SITENAME}}</tvar> as of 2026, and the site began as part of the wider [[<tvar name="2">meta:Special:MyLanguage/Abstract_Wikipedia</tvar>|Abstract Wikipedia project]], but NLG is far from the only field in which functions are being developed. That is to say, WF is necessary for AW, but AW is not necessary for WF. <!--T:31--> On top of the computer science staples of Boolean logic, arithmetic, and list manipulation, we have useful functions relating to disciplines such as [[<tvar name="1">Z16718</tvar>|chemistry]], [[<tvar name="2">Z35550</tvar>|dimensional analysis]], [[<tvar name="3">Z20074</tvar>|electrical engineering]], [[<tvar name="4">Z22162</tvar>|genomics]], [[<tvar name="5">Z10393</tvar>|information theory]], [[<tvar name="6">Z26830</tvar>|meteorology]], [[<tvar name="7">Z13955</tvar>|number theory]], [[<tvar name="8">Z27919</tvar>|physiology]], [[<tvar name="9">Z20094</tvar>|probability]], [[<tvar name="10">Z24497</tvar>|quantum mechanics]], [[<tvar name="11">Z14226</tvar>|railroad engineering]], [[<tvar name="12">Z28600</tvar>|timekeeping/chronometry]], and [[<tvar name="13">Z26841</tvar>|trigonometry]]. </translate> [[Category:Project concept{{#translation:}}]] oe2eumiu2cr4o3q0v931wy958jbjuf4 Wikifunctions:Glossary/de 4 3039 331136 330529 2026-10-23T08:26:41Z Ameisenigel 44 331136 wikitext text/x-wiki <noinclude><languages/> <!--<nowiki>(nowiki tags are so that the translate extension doesn't try to translate the TERM and DEFINITION in this boilerplate). Use this boilerplate for a new term: ; {{anchor|term|Term}} <translate>term</translate> {{English term|term}} : ''Definition verification needed'' : <translate>definition</translate> Notes: 1. Omit the "Definition verification" if you're sure that your definition is correct. 2. You can add several values for anchor, if it has spelling or capitalization variants; see the documentation for Template:Anchor and examples in other terms. </nowiki>--></noinclude> {{see also|wikt:en:Appendix:Glossary}} Frage gern nach Begriffen auf der [[Wikifunctions talk:Glossary|Diskussionsseite]], füge weitere Begriffe hinzu oder verbessere die Definitionen. {|class="toccolours" style="margin:.2em auto;padding:.2em .5em;text-align:center" dir="ltr" lang="en" |- |style="padding:0;width:100%"|{{CompactTOC}} |} == A == ; {{anchor|abstract|Abstract}} abstrakt {{English term|abstract}} : nicht in einer bestimmten [[#natural_language|natürlichen Sprache]], sondern abstrahierend von ihr; mit dem Ziel, eine Notation für die Bedeutung hinter Texten, Sätzen oder Phrasen in natürlichen Sprachen bereitzustellen. Gegenteil von [[#concrete|konkret]]. ; {{anchor|abstracttext|AbstractText}} Abstrakter Text {{English term|AbstractText}} : Prototyp-[https://github.com/google/abstracttext Implementierung] der [[#Wikifunctions|Wikifunctions]]-Idee ; {{anchor|abstract_article}} Abstrakter Artikel {{English term|abstract article}} : Eine Seite im Hauptnamensraum der [[#abstract_Wikipedia|Abstrakten Wikipedia]]; eine Seite, die einem Wikipedia-Artikel ähnelt, aber [[#abstract|abstrakt]] ist. Das Gegenteil von [[#concrete_article|konkreter Artikel]]. ("Abstrakt" ist hier ein Adjektiv; es bedeutet ''nicht'' "eine Zusammenfassung eines Artikels".) ; {{anchor|abstract_content}} Abstrakter Inhalt {{English term|abstract content}} : siehe [[#Content|Inhalt]]. ; {{anchor|abstract_Wikipedia|Abstract_Wikipedia}} Abstrakte Wikipedia {{English term|Abstract Wikipedia}} : vorläufiger Name aller [[#Content|Inhalte]], die von [[#local_Wikipedia|lokalen Wikipedien]] verwendet werden können, um einen [[#Renderer|Artikel]] in [[#article|natürlicher Sprache]] [[#natural_language|wiederzugeben]]; der Name ist derzeit vorgeschlagen, um in [[#Wikidata|Wikidata]] neben dem entsprechenden [[#Item|Datenobjekt]] zu existieren, er wird aber vor [[#Part_P2|Projektteil P2]] des [[#development_project|Entwicklungsprojekts]] diskutiert. ; {{anchor|alias}} Alias {{English term|alias}} : alternative Bezeichnung für ein Objekt, die in erster Linie zum Auffinden des Objekts verwendet wird. ; {{anchor|argument}} Argument {{English term|argument}} : eine Eingabe für einen [[#function call|Funktionsaufruf]]. ; {{anchor|argument reference}} Argumentreferenz {{English term|argument reference}} : eine [[#reference|Referenz]] zu einem der übergebenen Argumente innerhalb einer [[#composition|Komposition]]. ; {{anchor|array}} Array {{English term|array}} : Viele Programmiersprachen haben einen "Array"-Typ. Die Gegenstücke in Wikifunctions sind [[#list|Liste]] und [[#typed list|typisierte Liste]]. Siehe auch [[#Benjamin array|Benjamin-Array]]. ; {{anchor|article|Article}} Artikel {{English term|article}} : eine Seite im Hauptnamensraum einer [[#Wikipedia|Wikipedia]] in einer bestimmten Sprache, die einen Eintrag in der Wikipedia in dieser Sprache vertritt. Im Gegensatz zu einem [[#abstract_article|abstrakten Artikel]] ist ein Artikel [[#concrete|konkret]] und kann auch als "konkreter Artikel" bezeichnet werden. == B == ; {{anchor|Benjamin array}} Benjamin-Array {{English term|Benjamin array}} : eine von Benjamin Degenhart vorgeschlagene Möglichkeit zur Bezeichnung von [[#typed list|typisierten Listen]], bei der eine typisierte Liste als JSON-Liste gespeichert wird, deren erstes Element den Typ bezeichnet. Dies steht im Gegensatz zum zuvor vorgeschlagenen Schema, das einfach verknüpfte Listen im LISP-Stil verwendet, bei denen der Typ einmal in jedem Knoten gespeichert werden muss. ; {{anchor|boolean|Boolean}} Wahrheitswert {{English term|boolean}} : ein Wert, der zwei Zustände haben kann, üblicherweise als wahr und falsch bezeichnet. ; {{anchor|built-in|builtin}} Built-In {{English term|built-in}} : eine native Implementierung einer Funktion, die von der Auswertefunktion bereitgestellt und nicht über die Wiki-Schnittstelle bearbeitet werden kann. == C == ; {{anchor|call}} Aufruf {{English term|call}} : siehe [[#function call|Funktionsaufruf]]. Auf Englisch können auch die Begriffe [[#invoke|invoke oder invocation]] benutzt werden. ; {{anchor|canonical|canonicalized|canonicalised}} kanonisch, kanonisiert {{English term|canonical, canonicalized, canonicalised}} : eine spezielle, weniger ausführliche und damit besser lesbare Art, [[#ZObject|ZObjekte]] in [[#JSON|JSON]] darzustellen; es ist die übliche Darstellung, in der ZObjekte in [[#Wikifunctions|Wikifunctions]] gespeichert werden. Gegenteil von [[#normal|normal]]. ; {{anchor|character}} Zeichen {{English term|character}} : ein Zeichen gemäß Unicode-Definition, ein Bestandteil einer Zeichenkette; ein Zeichen kann aus mehreren Bytes (oder Oktetten) bestehen. ; {{anchor|claim|Claim}} Behauptung {{English term|claim}} : Im [[:d:Special:MyLanguage/Wikidata:Glossary#Claim|Datenmodell von Wikibase]] ist eine Behauptung ein Haupt-Snak plus optionale Qualifikatoren, die eine Aussage über eine Entität ausdrückt (ohne Fundstellen oder Rang). : Beispiel: Entität: Albert Einstein :* Behauptung: Ehefrau = Mileva Marić, ab 1903 :* Haupt-Snak: P26 (Ehefrau) → Q937 (Mileva Marić) :* Qualifikator-Snak: P580 (Startzeitpunkt) → 1903 : → “Mileva Marić war ab 1903 die Ehefrau von Albert Einstein.” : Durch die Hinzufügung einer Fundstelle und eines Rangs kann die Behauptung später in eine Aussage umgewandelt werden. ; {{anchor|composition}} Komposition {{English term|composition}} : eine Form der Implementierung einer Funktion, bei der die Implementierung durch die Kombination anderer Funktionen gegeben ist; siehe [[Special:MyLanguage/Wikifunctions:Function model#Composition|Funktionsmodell]]. ; {{anchor|composition notation}} Kompositionsnotation {{English term|composition notation}} : eine leicht lesbare Notation für Kompositionen. Siehe [[Special:MyLanguage/Wikifunctions:Function model#Composition|Funktionsmodell]]. ; {{anchor|concrete|Concrete}} konkret {{English term|concrete}} : in einer bestimmten [[#natural_language|natürlichen Sprache]]. Gegenteil von [[#abstract|abstrakt]]. ; {{anchor|concrete_article}} konkreter Artikel {{English term|concrete article}} : Siehe [[#article|Artikel]]. Das Gegenteil von [[#abstract_article|abstrakter Artikel]]. ; {{anchor|cons}} cons {{English term|cons}} : Funktion zur Erzeugung einer neuen Liste durch Hinzufügen eines Elements an ihrem Beginn. Siehe [[phab:T261474]]. Siehe [[w:cons|cons]] in Wikipedia. ; {{anchor|constructor|Constructor}} Konstruktor {{English term|constructor}} : ein [[#abstract|abstrakter]] Baustein von [[#Content|Inhalt]]. Ein Konstruktor zielt darauf ab, die Bedeutung einer einzelnen Phrase oder einer Satzstruktur zu erfassen. Er hat oft Slots, die andere Konstruktoren aufnehmen können, und kann selbst als Wert verwendet werden, um die Slots anderer Konstruktoren zu füllen. ; {{anchor|Content}}<!--do not add |content to the anchor, it is used by MediaWiki--> Inhalt, abstrakter Inhalt {{English term|content, abstract content}} : aus [[#Constructor|Konstruktoren]] zusammengesetzte abstrakte Darstellung eines Textes oder Textfragments. Technisch gesehen ein instanziierter Konstruktor. Der Konstruktor der obersten Ebene wird verwendet, um einen ganzen [[#article|Artikel]] darzustellen und in der [[#Abstract_Wikipedia|Abstrakten Wikipedia]] zu speichern. Der Inhalt kann aber auch nur für einen Satz oder eine Phrase stehen. Manchmal auch abstrakter Inhalt genannt. ; {{anchor|converter_from_code}} Umwandler aus Code {{English term|converter from code}} : Gegenteil von [[#converter to code|Umwandler in Code]]. ; {{anchor|converter_to_code}} Umwandler in Code {{English term|converter to code}} : Methoden zur Darstellung von [[#ZObject|ZObjekten]] in [[#JSON|JSON]]; siehe auch [[#canonical|kanonisch]], [[#normal|normal]]. ; {{anchor|curry}} Currying, currifiziert {{English term|curried, curry, currying}} : Eine currifizierte Funktion ist eine Funktion, die aus der Annahme mehrerer Argumente in eine Folge von Funktionen mit jeweils einem einzigen Argument übersetzt wurde. Diese Technik wurde nach dem amerikanischen Mathematiker [[:w:de:Haskell Brooks Curry|Haskell Curry]] benannt. Siehe [[:w:de:Currying|Currying]] in der Wikipedia. == D == ; {{anchor|development_project|Development_project}} Entwicklungsprojekt {{English term|development project}} : Projekt zur Entwicklung von [[#Wikifunctions|Wikifunctions]] und [[#Abstract_Wikipedia|Abstrakte Wikipedia]]; siehe [[:m:Special:MyLanguage/Abstract Wikipedia/Plan|Plan für die Abstrakte Wikipedia]]. ; {{anchor|display function}} Anzeigefunktion {{English term|display function}} : ein Synonym für [[#renderer|Renderer]]. Beispielsweise eine Funktion, die einen [[#type|Typ]] in eine für Benutzer verständliche Zeichenkette umwandelt, wie etwa die Umwandlung der Zahl 123456 in "123,456" im (internationalen) Englisch, "1,23,456" im indischen Englisch, "123.456" im Französischen etc. oder die Umwandlung des Datums '2024','03', '12' in '2024-03-12' und so weiter. ; {{anchor|documentation}} Dokumentation {{English term|documentation}} : menschenlesbarer Text zur Erklärung eines Objekts. == E == ; {{anchor|eney|eneyjj}} Eneyj {{English term|eneyj}} :# prototypisches Modell von [[#Wikifunctions|Wikifunctions]]; :# JavaScript-Implementierung einer [[#evaluator|Auswertefunktion]] des Modells, das in [[#abstracttext|abstraktem Text]] bereitgestellt wird. ; {{anchor|error|Error}} Fehler {{English term|error}} : Typ, dessen Instanzen Probleme bei [[#evaluation|Auswertung]] oder [[#validation|Validierung]] anzeigen; siehe [[Special:MyLanguage/Wikifunctions:Function model#Z5/Errors|Funktionsmodell]]. ; {{anchor|evaluation|Evaluation}} Evaluation {{English term|evaluation}} : Die vom [[#evaluator|Auswerter]] ausgeführte Aktion. ; {{anchor|evaluator|Evaluator}} Auswertefunktion {{English term|evaluator}} : ein Stück Software, das ein [[#ZObject|ZObjekt]] nimmt und es auswertet, d. h. eine [[#Function|Funktion]] ausführt und das Ergebnis zurückgibt. Wir sehen die Entwicklung von mehreren Auswertefunktionen vor. Auswertefunktionen können im Browser, auf dem Server der [[#Wikimedia_Foundation|Wikimedia-Stiftung]], in der Cloud, in einer App auf einem mobilen Gerät oder an anderen Orten implementiert und ausgeführt werden. Vergleiche hierzu [[#executor|Ausführer]] und [[#orchestrator|Orchestrierer]] ; {{anchor|execution|Execution}} Ausführung {{English term|execution}} : Die vom [[#executor|Ausführer]] ausgeführte Aktion. ; {{anchor|executor|Executor|executors|Executors}} Ausführer {{English term|executor}} : einer aus einer Reihe von internen Diensten, die nicht öffentlich zugänglich sind. Sie können nur durch den [[#Orchestrator|Orchestrierer]] aufgerufen werden. Sie führen nativen Code in einer bestimmten Programmiersprache aus. Es wird Ausführer für Lua, für JavaScript, für Python usw. geben. Siehe [https://gitlab.wikimedia.org/repos/abstract-wiki/wikifunctions/function-evaluator#executors die Dienstdokumentation]. Vergleiche hierzu [[#evaluator|Auswertefunktion]] und [[#orchestrator|Orchestrierer]]. == F == ; {{anchor|function|Function}} Funktion {{English term|function}} : Spezifikation einer Berechnung, die eine Eingabe annimmt und eine Ausgabe zurückgibt; siehe [[w:de:Unterprogramm|Funktion]] in Wikipedia. ; {{anchor|function call|Function call}} Funktionsaufruf {{English term|function call}} : Ein Funktionsaufruf ist ein ZObjekt, das aus einer Funktion und den für sie erforderlichen Argumenten besteht und das zu einem anderen ZObjekt ausgewertet werden kann. Auf Englisch kann auch der Begriff "invoke" benutzt werden. ; {{anchor|function evaluator}} Funktionsauswerter {{English term|function evaluator}} : Siehe [[#evaluator|Auswerter]]. ; {{anchor|function executor}} Funktionsausführer {{English term|function executor}} : Siehe [[#executor|Ausführer]]. ; {{anchor|function model}} Funktionsmodell {{English term|function model}} : Siehe [[Special:MyLanguage/Wikifunctions:Function model|Funktionsmodell]]. ; {{anchor|function orchestrator}} Funktionsorchestrierer {{English term|function orchestrator}} : Siehe [[#orchestrator|Orchestrierer]]. ; {{anchor|function schemata}} Funktionsschema {{English term|function schemata}} : ein Satz vordefinierter ZObjekte, die im [[#orchestrator|Orchestrierer]] und [[#evaluator|Auswerter]] verwendet werden. Das [[#WikiLambda system|WikiLambda-Systemkonto]] füllt auch vordefinierte ZObjekte im Wiki aus Funktionsschemata. ; {{anchor|functional}} funktional {{English term|functional}} : Kurzbegriff für "rein funktional". Das bedeutet, dass die [[#evaluation|Auswertung]] einer solchen Funktion keine Nebeneffekte hat und deterministisch, also immer gleich ist; siehe [[w:en:Purely functional programming|rein funktionale Programmierung]] in Wikipedia; siehe [[Special:MyLanguage/Wikifunctions:Function model#non-functional|Funktionsmodell]]. == G == ; {{anchor|generic type}} generischer Typ {{English term|generic type}} : ein Typ, der durch die [[#evaluation|Auswertung]] eines Funktionsaufrufs erzeugt wird. == I == ; {{anchor|identity|Identity}} Identität {{English term|identity}} : Die Identität eines Typs ist eine Instanz einer (bestimmten) Funktion, die auf den Typ hin auswertet. Bei einem einfachen Typ ist es ein Verweis auf den Typ selbst. ; {{anchor|implementation|Implementation}} Implementierung {{English term|implementation}} : eine bestimmte Art, eine [[#function|Funktion]] auszuführen. Eine Implementierung kann ein Stück Code in einer bestimmten Programmiersprache sein, sie kann sich auf Funktionalität beziehen, die in die [[#evaluator|Auswertefunktion]] "eingebaut" ist, oder Aufrufe anderer Funktionen [[#composition|zusammensetzen]]. Eine Funktion kann viele Implementierungen haben, die alle gleichwertig sein sollten. Kurz für "[[#ZFunction|ZFunktion]]-Implementierung". ; {{anchor|instance}} Instanz {{English term|instance}} : Jedes ZObjekt ist eine Instanz seines Typs. ; {{anchor|invoke}} Invoke {{English term|invoke}} : Synonym für [[#call|call]] auf Englisch. Siehe [[#function call|Funktionsaufruf]]. ; {{anchor|item|Item}} Objekt, Datenobjekt {{English term|item}} : ein Eintrag in der Wissensbasis von [[#Wikidata|Wikidata]]; siehe [[:d:Wikidata:Glossary#Item|Objekt]] im Wikidata-Glossar. == J == ; {{anchor|JSON}} JSON {{English term|JSON}} : eine weitverbreitetes Format zur Datenübertragung; siehe [[w:de:JavaScript Object Notation|JSON]] in Wikipedia. == K == ; {{anchor|key|Key}} Schlüssel {{English term|key}} : eine Zeichenkette, die mit dem Buchstaben K gefolgt von einer natürlichen Zahl endet und der optional eine [[#ZID|ZID]] vorangestellt ist. Schlüssel werden in [[#Wikifunctions|Wikifunctions]] normalerweise auf [[#Type|Typen]] oder [[#Function|Funktionen]] definiert und zum Aufbau von [[#ZObject|ZObjekten]] verwendet. == L == ; {{anchor|label}} Bezeichnung {{English term|label}} : Hauptname, der zur Identifizierung eines ZObjekts vergeben wird. Darf nur Klartext sein. ; {{anchor|lexeme|Lexeme}} Lexem {{English term|lexeme}} : ein Eintrag in [[#Wikidata|Wikidata]], der lexikographisches Wissen über, grob gesagt, ein Wort enthält; siehe [[d:Wikidata:Glossary#Lexeme|Lexem]] im Wikidata-Glossar. ; {{anchor|linearizer|Linearizer}} Linearisierer {{English term|linearizer}} : (dieser Begriff wird in der aktuellen Terminologie nicht mehr genutzt, kann jedoch noch in älteren Dokumenten gefunden werden) Synonym von [[#renderer|Renderer]] (1). ; {{anchor|list|List}} Liste {{English term|list}} : ein Datentyp, der eine beliebige Anzahl von Instanzen in einer geordneten Einheit zusammenfasst; siehe [[w:en:List (abstract data type)|Liste (abstrakter Datentyp)]] in Wikipedia. ; {{anchor|literal}} Literal {{English term|literal}} : ein Wert, der kein ZObjekt ist. Gegenwärtig ist das einzige zulässige Literal die Zeichenkette. ; {{anchor|local_Wikipedia|Local_Wikipedia}} Lokale Wikipedia {{English term|local Wikipedia}} : eine [[#Wikipedia|Wikipedia]] in einer spezifischen Sprache. Beispiele: Hebräische Wikipedia, Japanische Wikipedia oder Italienische Wikipedia. == M == ; {{anchor|Multlingual_Wikipedia|multilingual_Wikipedia}} Mehrsprachige Wikipedia {{English term|multilingual Wikipedia}} : die Architektur, die es [[#local_Wikipedia|lokalen Wikipedien]] ermöglicht, sich durch [[#Renderer|Rendering]] des [[#Content|Inhalts]] aus der [[#Abstract_Wikipedia|Abstrakte Wikipedia]] anzureichern und so eine umfassendere, aktuellere und korrektere Wikipedia in ihrer Sprache zu haben; siehe [[:m:Special:MyLanguage/Abstract Wikipedia/Architecture|Architektur der Abstrakten Wikipedia]]. == N == ; {{anchor|natural_language|Natural_language}} Natürliche Sprache {{English term|natural language}} : eine bestimmte natürliche Sprache im weiteren Sinne, wie z. B. Englisch, Tagalog oder Swahili; siehe [[w:de:Natürliche Sprache|Natürliche Sprache]] in Wikipedia. ; {{anchor|normal|Normal|normalized|Normalized|normalised}} Normal {{English term|normal}} : eine erweiterte, leicht verarbeitbare und sehr einheitliche Methode zur Darstellung von [[#ZObject|ZObjekten]] in [[#JSON|JSON]]. Gegenteil von [[#canonical|kanonisch]]. ; {{anchor|nothing|Nothing}} Nichts {{English term|nothing}} : ein Datentyp, der keine Instanzen haben kann; siehe [[w:en:Bottom type|Bottom type]] in Wikipedia. == O == ; {{anchor|object|Object}} Objekt {{English term|object}} :# ein Objekt in JavaScript oder JSON ist grundsätzlich ein assoziatives Array; siehe [[w:de:Zuordnungstabelle|Zuordnungstabelle]] in Wikipedia. :# in Wikifunctions Synonym für [[#ZObject|ZObjekt]]. ; {{anchor|orchestration|Orchestration}} Orchestrierung {{English term|orchestration}} :Die vom [[#orchestrator|Orchestrierer]] ausgeführte Aktion. ; {{anchor|orchestrator|Orchestrator}} Orchestrierer {{English term|orchestrator}} : ein Dienst, der ein [[#ZObject|ZObjekt]] nimmt und eine [[#Evaluator|ausgewertete]] Version davon zurückgibt. Dafür wird er das Wiki für andere benötigte ZObjekte, den [[#Executor|Ausführer]] zur Auswertung einiger Funktionsaufrufe und andere Dienste wie [[#Wikidata|Wikidata]] aufrufen. Siehe [https://gitlab.wikimedia.org/repos/abstract-wiki/wikifunctions/function-orchestrator#wikifunctions-function-orchestrator die Dienstdokumentation]. Vergleiche hierzu [[#evaluator|Auswertefunktion]] und [[#executor|Ausführer]]. == P == ; {{anchor|page|Page}} Seite {{English term|page}} : ein Teil eines Wikis. Ein [[#wiki|Wiki]] besteht aus einer Anzahl individueller Seiten, die unabhängig voneinander bearbeitet werden können und die interne Links aufeinander haben können, etc. ; {{anchor|parser|Parser}} Parser {{English term|parser}} : eine Funktion, die eine Zeichenkette in ein ZObjekt umwandelt. Gegenteil von [[#renderer|Renderer]]. ; {{anchor|pair|Pair}} Paar {{English term|pair}} : ein zusammengestztes ZObjekt, das zwei ZObjekte eines spezifischen (aber beliebigen) Typs enthält. ; {{anchor|part_P1|Part_P1}} Projektteil P1 {{English term|Part P1}} : der Teil des [[#development_project|Entwicklungsprojekts]], der sich mit der Erstellung von [[#Wikifunctions|Wikifunktionen]] befasst. Er beginnt am Anfang des Projekts und zieht sich durch dessen gesamte Lebensdauer; siehe [[:m:Special:MyLanguage/Abstract Wikipedia/Tasks#Part P1: Wikifunctions|Projektteil P1: Wikifunctions]]. ; {{anchor|part_P2|Part_P2}} Projektteil P2 {{English term|Part P2}} : der Teil des [[#development_project|Entwicklungsprojekts]], der sich mit der Erstellung der [[#Abstract_Wikipedia|Abstrakten Wikipedia]] beschäftigt. Er beginnt nach etwa einem Projektjahr und setzt sich in der zweiten Hälfte der Projektdauer fort; siehe [[:m:Special:MyLanguage/Abstract Wikipedia/Tasks#Part P2: Abstract Wikipedia|Projektteil P2: Abstrakte Wikipedia]]. ; {{anchor|persistent|Persistent}} persistent {{English term|persistent}} : ein [[#ZObject|ZObjekt]] mit einer [[#ZID|ZID]] und einer eigenen Seite im Wiki. Die meisten persistenten ZObjekte enthalten [[#value|Werte]], die ZID-lose ZObjekte und deshalb nicht persistent sind. ; {{anchor|property|Property}} Eigenschaft {{English term|property}} : wird benutzt, um eine [[#Statement|Aussage]] über ein [[#Item|Objekt]] in der [[#Wikidata|Wikidata]]-Wissensbasis zu machen; siehe [[:d:Wikidata:Glossary#Property|Eigenschaft]] im Wikidata-Glossar. == Q == ; {{anchor|quote|Quote}} Zitat {{English term|quote}} : eine Datenstruktur, die nicht ausgewertet, sondern wortgetreu erhalten bleibt. ; {{anchor|QID}} QID {{English term|QID}} : Identifikator für ein Datenobjekt in [[#Wikidata|Wikidata]], bestehend aus dem Buchstaben "Q" gefolgt von einer Ganzzahl. == R == ; {{anchor|reading function}} Lesefunktion {{English term|reading function}} : ein Synonym für [[#parser|Parser]]. Eine Funktion, die Texteingaben eines Benutzers von einer Zeichenkette in einen bestimmten Typ umwandelt. Beispielsweise wird die Zeichenkette '123456' in die Zahl '123456' oder die Zeichenkette '2024-03-12' in das Datum '2024', '03', '12' umgewandelt. ; {{anchor|reference|Reference}} Referenz {{English term|reference}} : eine ID zur Bezeichnung des zugrundeliegenden Objekts. Beispielsweise bezeichnet die Zeichenkette "Z11" den Typ "Z11/Einsprachiger Text". : {{TakeNote}}Dieser Begriff hat eine völlig andere Bedeutung als in Wikipedia; siehe [[w:de:Referenz (Programmierung)|Referenz (Programmierung)]] in Wikipedia. ; {{anchor|renderer|Renderer}} Renderer {{English term|renderer}} (1) : eine Funktion, die ein ZObjekt in eine Zeichenkette umwandelt. Gegenteil von [[#parser|Parser]]. (früher "Linearisierer" genannt) ; Renderer {{English term|renderer}} (2) : eine [[#Function|Funktion]], die einen [[#Content|Inhalt]] und einen Identifikator einer [[#natural_language|natürlichen Sprache]] als Eingabe bekommt und Text in dieser natürlichen Sprache als Ausgabe wiedergibt. Sie stellt den Inhalt als konkreten Text dar, wobei sie Wissen der [[#Lexeme|Lexeme]] verwendet. : {{TakeNote}}Dies ist eine zukünftige Funktion und die Bedeutung des Begriffs "Renderer" im {{Pg|:m:Abstract Wikipedia/Historic proposal|ursprünglichen Vorschlag}}; dieser Begriff kollidiert mit der aktuellen Verwendung von "Renderer", weshalb er in Zukunft möglicherweise umbenannt wird. ; {{anchor|reify}} reifizieren {{English term|reify}} : eine Funktion, die ein Objekt in seine Bestandteile zerlegt, so dass auf die Teile einzeln zugegriffen werden kann; siehe [[w:de:Reifikation#Informatik|Reifikation]] in Wikipedia; siehe [[phab:T261474]]. ; {{anchor|REPL}} REPL {{English term|REPL}} : Lese-Evaluier-Druck-Schleife (Read / Eval / Print - Loop), ein Command Line Interface (CLI), das eine Eingabe erfasst, auswertet und das Ergebnis anzeigt. Siehe [[w:en:REPL|REPL]] in Wikipedia; siehe [[Special:MyLanguage/Wikifunctions:Function model#REPL|Funktionsmodell]]. == S == ; {{anchor|schemata}} Schema {{English term|schemata}} : Siehe [[#function schemata|Funktionsschema]]. ; {{anchor|snak|Snak}}Snak {{English term|snak}} : Im [[:mw:Special:MyLanguage/Wikibase/DataModel|Datenmodell von Wikibase]] ist ein Snak die kleinste Einheit einer Aussage, die eine Eigenschaft entweder mit einem Wert, “keinem Wert” oder “unbekanntem Wert” verknüpft. : Beispiel-[[#statement|Aussage]] für {{Q|Q937}} mit 3 Snaks: : Haupt-Snak: :  Eigenschaft: {{Q|P26}} → Wert: {{Q|Q76346}} : Qualifikator-Snak (fügt Kontext hinzu): :  Eigenschaft: {{Q|P580}} → Wert: 1903 : Fundstellen-Snak (unterstützt die Behauptung): :  Eigenschaft: {{Q|P248}} → Wert: {{Q|Q23833686}} : Resultierende Aussage (in Worten): “Gemäß dem Katalog der Deutschen Nationalbibliothek war Mileva Marić ab 1903 die Ehefrau von Albert Einstein.” ; {{anchor|statement|Statement}} Aussage {{English term|statement}} : wird benutzt, um eine Behauptung über ein [[#Item|Objekt]] aus der [[#Wikidata|Wikidata]]-Wissensbasis darzustellen; siehe [[:d:Special:MyLanguage/Wikidata:Glossary#Statement|Aussage]] im Wikidata-Glossar (beachte jedoch, dass eine “Behauptung” ohne [[#reference|Fundstellen]] immer noch als {{Z|Z6003|lang={{CURRENTCONTENTLANGUAGE}}}} dargestellt wird). ; {{anchor|string}} Zeichenkette {{English term|string}} : eine Folge von Zeichen ; {{anchor|sum type|Sum type}} Sum-Typ {{English term|sum type}} : ein Typ, der Instanzen von jedem seiner konstituierenden Typen haben kann; siehe [[w:en:Sum type|Sum type]] in Wikipedia; siehe [[Special:MyLanguage/Wikifunctions:Function model#Zx/Sum_types|Funktionsmodell]]. == T == ; {{anchor|template}} Vorlage {{English term|template}} : eine Möglichkeit, einen [[#renderer|Renderer]] als Text mit Platzhaltern oder ''Slots'' anzugeben, die mit Daten aus [[#constructor|Konstruktoren]], Funktionsberechnungen oder Inhalt aus einer anderen Vorlage gefüllt werden können. Siehe das Dokument [[:m:Special:MyLanguage/Abstract Wikipedia/Template Language for Wikifunctions|Vorlagensprache für Wikifunctions]] für eine detaillierte Diskussion über die Vorlagen-Syntax. ; {{anchor|tester|Tester}} Tester {{English term|tester}} : eine Möglichkeit, automatisch zu bestimmen, ob eine gegebene [[#ZFunction|ZFunktion]] das Richtige tut. Eine [[#function|Funktion]] hat typischerweise mehrere Tester, von denen jeder eine Eingabe für die Funktion und Bedingungen angibt, die die Ausgabe für die gegebene Eingabe erfüllen muss. Zum Beispiel könnten die Tester für eine "Groß-/Kleinschreibungs-Funktion" Folgendes enthalten: "abc" sollte "Abc" werden; "krieg und frieden" sollte "Krieg und Frieden" werden; "война и мир" sollte "Война и мир" werden; und "123" sollte "123" bleiben. ; {{anchor|transient|Transient}} Transient {{English term|transient}} : Gegenteil von [[#persistent|persistent]]. ; {{anchor|type|Type}} Typ {{English term|type}} : Der Typ eines Objekts sagt uns, wie das gegebene Objekt zu interpretieren und zu verstehen ist und was mit dem Objekt gemacht werden kann. Wenn wir beispielsweise ein Objekt mit dem Wert "2023" haben, verstehen wir dieses Objekt unterschiedlich, je nachdem, ob sein Typ eine Ganzzahl, ein Jahr oder eine Zeichenkette ist. Jedes Objekt bezieht sich auf “eine Sache in der realen Welt”. Die Ganzzahl 2023 unterscheidet sich vom Jahr 2023. Der Typ sagt uns, wie ein bestimmtes Objekt zu interpretieren ist, sodass wir wissen, auf welche Sache in der realen Welt es sich bezieht. Technisch gesehen definiert es, wie Objekte dieses Typs strukturiert sind und welche Bedingungen sie erfüllen müssen, um ein gültiges Objekt dieses Typs zu sein. Ein Typ definiert die Bedingungen, unter denen ein [[#ZObject|ZObjekt]] eine gültige Instanz dieses Typs ist, indem er eine [[#Function|Funktion]] bereitstellt, die ein ZObjekt validiert. Typen sind selbst ZObjekte, so dass Mitwirkende von [[#Wikifunctions|Wikifunctions]] neue Typen erstellen können. ; {{anchor|type converter}} Typumwandler {{English term|type converter}} : Ein in einer Programmiersprache (wie JavaScript) geschriebenes Skript, das ein natives Objekt (wie BigInt) annimmt und ein JSON-Objekt zurückgibt, das das entsprechende ZObjekt darstellt, oder ''vice versa''. ; {{anchor|typed list|Typed List}} typisierte Liste {{English term|typed list}} : Eine typisierte Liste ist eine [[#list|Liste]], in der alle Bestandteile der Liste einen bestimmten vordefinierten [[#type|Typ]] haben. Beispielsweise ist eine typisierte Liste von [[#string|Zeichenketten]] eine Liste, in der alle Bestandteile der Liste Zeichenketten sind. Eine typisierte Liste übernimmt ein Argument, und zwar den Typ, von dem alle Bestandteile der Liste sein müssen. Typisierte Listen sind wohl der am häufigsten genutzte [[#generic type|generische Typ]]. == V == ; {{anchor|value}} Wert {{English term|value}} : die Zeichenkette oder das [[#ZObject|ZObjekt]], das zu einem [[#key|Schlüssel]] in einem anderen ZObjekt gehört. ; {{anchor|validation|Validation}} Prüfung {{English term|validation}} : Die vom [[#validator|Prüfer]] ausgeführte Aktion. ; {{anchor|validator|Validator}} Prüfer {{English term|validator}} : eine Funktion mit einem ZObjekt als Argument und einer Liste der gefundenen Fehler als Ergebnis. == W == ; {{anchor|wiki|Wiki}} Wiki {{English term|wiki}} : eine Website, die die einfache und gemeinschaftliche Bearbeitung ihrer [[#page|Seiten]] ermöglicht. ; {{anchor|Wikidata}} Wikidata {{English term|Wikidata}} : ein Projekt der [[#Wikimedia_Foundation|Wikimedia-Stiftung]], eine freie, gemeinschaftlich bearbeitete Wissensbasis; siehe [[:m:Special:MyLanguage/Wikidata|Wikidata]]. ; {{anchor|Wikifunctions}}{{anchor|Wikilambda}} Wikifunctions {{English term|Wikifunctions}} : neues Projekt der [[#Wikimedia_Foundation|Wikimedia-Stiftung]]; ein freier, gemeinschaftlich entwickelter und gepflegter Katalog von [[#Function|Funktionen]]. Das Projekt war im {{Pg|:m:Abstract Wikipedia/Historic proposal|Originalvorschlag}} ursprünglich als '''Wikilambda''' bekannt (dieser Name wird jetzt für die [[#WikiLambda|WikiLambda-Erweiterung]] benutzt). ; {{anchor|WikiLambda}} WikiLambda {{English term|WikiLambda}} : die Software für das Projekt, [[mw:Special:MyLanguage/Extension:WikiLambda|Erweiterung:WikiLambda]]. ; {{anchor|WikiLambda system}} WikiLambda-System {{English term|WikiLambda system}} : ein automatisiertes Systemkonto, das ein zentraler Bestandteil der WikiLambda-Erweiterung ist. Siehe [[User:WikiLambda system]] für dessen aktuelle Funktion. ; {{anchor|WMF|Wikimedia_Foundation}} Wikimedia-Stiftung {{English term|Wikimedia Foundation}} : Organisation, die die Wikimedia-Bewegung unterstützt; siehe [[:m:Special:MyLanguage/Wikimedia Foundation|Wikimedia-Stiftung]]. ; {{anchor|Wikipedia}} Wikipedia {{English term|Wikipedia}} : ein Projekt der [[#Wikimedia_Foundation|Wikimedia-Stiftung]], eine freie, gemeinschaftlich herausgegebene Enzyklopädie; siehe [[:m:Special:MyLanguage/Wikipedia|Wikipedia]]. ; Wikipedia, Abstrakte {{English term|Wikipedia, Abstract}} : siehe [[#Abstract_Wikipedia|Abstrakte Wikipedia]]. ; Wikipedia, mehrsprachige {{English term|Wikipedia, multilingual}} : siehe [[#multilingual_Wikipedia|mehrsprachige Wikipedia]]. == Z == ; {{anchor|ZID|ZIDs}} ZID {{English term|ZID}} : eine ID, die mit dem Buchstaben Z beginnt mit einer anschließenden natürliche Zahl. Wird benutzt, um [[#persistent|persistente]] [[#ZObject|ZObjekte]] zu bezeichnen. ; {{anchor|zfunction|ZFunction}} ZFunktion {{English term|ZFunction}} : eine Wiki-Seite in [[#Wikifunctions|Wikifunctions]], die eine bestimmte [[#function|Funktion]] beschreibt, die mit der [[#evaluator|Auswertefunktion]] verwendet werden kann. Jede ZFunktion kann durch eine oder mehrere [[#implementation|Implementierungen]] kodiert werden, und diese Implementierungen können durch eine oder mehrere [[#tester|Tester]]-ZFunktionen als korrekt bestätigt werden. ; {{anchor|ZKey}} ZSchlüssel {{English term|ZKey}} : ein [[#ZObject|ZObjekt]], das einen [[#key|Schlüssel]] für einen bestimmten [[#type |Typ]] definiert. ; {{anchor|ZList}} ZListe {{English term|ZList}} : ein [[#ZObject|ZObjekt]] für eine geordnete Folge anderer ZObjekte. ; {{anchor|ZObject}} ZObjekt {{English term|ZObject}} : jeder Eintrag in [[#Wikifunctions|Wikifunctions]] ist ein ZObjekt. In Wikifunctions gespeicherte Objekte haben [[#ZID|ZIDs]] und können von zahlreichen Typen wie zum Beispiel [[#Constructor|Konstruktoren]], [[#Function|Funktionen]], [[#Type|Typen]], etc. sein. Ein ZObjekt besteht aus einem Satz von [[#Key|Schlüssel]]/[[#Value|Wert]]-Paaren, wobei jeder Schlüssel nur einmal pro ZObjekt aufscheint und Werte ZObjekte sind. ; {{anchor|ZUnit}} ZEinheit {{English term|ZUnit}} : ein [[#ZObject|ZObjekt]], das einen [[:w:de:Einheitstyp|Einheitstypen]] darstellt. [[Category:Glossary| {{#translation:}}]] hbrbcka762io3ww49zdagwp1m9ysh4k Translations:Wikifunctions:Glossary/109/de 1198 3081 331135 280454 2026-10-23T08:26:40Z Ameisenigel 44 331135 wikitext text/x-wiki Gegenteil von [[$converter_to_code|Umwandler in Code]]. eekl0roq0abwv1gf9c75qwdgcqke4wh Wikifunctions:Reserved ZIDs/de 4 7399 331130 325791 2026-10-23T08:24:41Z Ameisenigel 44 Created page with "(Siehe [[$1|§ Wikidata-Typen]] unten.)" 331130 wikitext text/x-wiki <noinclude><languages/>{{Technical documentation navbox}}</noinclude> Diese Seite führt ZIDs auf, die von Wikilambda, die von Wikifunktions verwendete Software, reserviert werden. Alle ZIDs mit vier oder weniger Ziffern sind reserviert. Siehe [[Wikifunctions:Reserved ZIDs/all]] für eine Liste aller aktuellen vordefinierten Objekte. <span id="Ranges"></span> === Bereiche === Wir reservieren bestimmte Bereiche für bestimmte Arten von vordefinierten Objekten. <div style="margin:.3em 0; border:1px solid #AAA; padding:.3em .5em;"><div style="margin-top:-.3em"> * <code>Z1</code> – <code>Z99</code>: Kerntypen. ''(Siehe [[#core-types|§ Kerntypen]] unten.)'' * <code>Z100</code> – <code>Z199</code>: Prüfer für die Kerntypen (''d. h.'' für jeden Kerntyp, +100 ergibt den Prüfer), ''z. B.'' ist Z104 der Prüfer für Z4/Typ * <code>Z200</code> – <code>Z299</code>: eingebaute Implementierungen für die Prüfer für die Kerntypen (''z. B.'' ist Z204 die eingebaute Implementierung für den Prüfer für Z4/Typ) * <code>Z300</code> – <code>Z399</code>: ''vorerst nicht zugewiesen'' * <code>Z400</code> – <code>Z499</code>: ''reserviert für die lokale Nutzung'' * <code>Z500</code> – <code>Z599</code>: Kern-Fehlertypen (<code>Z5XX</code>, da <code>Z5</code> der Fehler ist) ''(Siehe [[#core-error-types|§ Kern-Fehlertypen]] unten.)'' * <code>Z600</code> – <code>Z699</code>: Kern-Programmiersprachen (<code>Z6XX</code>, da <code>Z61</code> die Programmiersprache ist) * <code>Z700</code> – <code>Z799</code>: ''vorerst nicht zugewiesen'' * <code>Z800</code> – <code>Z899</code>: Definitionen von Kernfunktionen mit eingebauten Funktionen (<code>Z8XX</code>, da <code>Z8</code> die Funktion ist) ''(Siehe [[#core-functions|§ Kernfunktionen]] unten.)'' * <code>Z900</code> – <code>Z999</code>: eingebaute Funktionen für die Kernfunktionen (sie sind die entsprechende Z8XX +100) * <code>Z1000</code> – <code>Z2999</code>: natürliche Sprachen (Instanzen von Z60) * <code>Z3000</code> – <code>Z5999</code>: ''reserviert für die zukünftige Nutzung'' * <code>Z6000</code> – <code>Z6999</code>: ''Typen, Funktionen, ''etc.'' für das Nutzen von Inhalten von Wikidata und anderen Wikimedia-Quellen'' ** <code>Z6000</code> – <code>Z6099</code>: ''Typen für Inhalte von Wikidata und anderen Wikimedia-Quellen'' ''(Siehe [[#wikidata-types|§ Wikidata-Typen]] unten.)'' ** <code>Z6100</code> – <code>Z6199</code>: ''Prüfer für diese Typen'' ** <code>Z6200</code> – <code>Z6299</code>: ''integrierte Implementierungen der Prüfer'' ** <code>Z6800</code> – <code>Z6899</code>: ''Hilfsfunktionen für diese Typen, die integriert sein müssen (z. B. Abrufen, Gleichheit)'' ''<span lang="en" dir="ltr" class="mw-content-ltr">(See [[#wikidata-functions|§ Wikidata functions]] below.)</span>'' ** <code>Z6900</code> – <code>Z6999</code>: ''integrierte Implementierungen der Hilfsfunktionen'' * <code>Z7000</code> – <code>Z7999</code>: ''reserviert für die zukünftige Nutzung'' * <code>Z8000</code> – <code>Z8999</code>: Tester für jede vordefinierte Funktion (''z. B.'' wird Z801 über Z8010, Z8011, Z8012, … Z8019 getestet). * <code>Z9000</code> – <code>Z9999</code>: ''reserviert für die zukünftige Nutzung'' </div></div> {{Anchor|core-types}} <span id="Core_types"></span> === Kerntypen === <div style="margin:.3em 0; border:1px solid #AAA; padding:.3em .5em;"><div style="margin-top:-.3em"> * <code>Z1</code>: {{Z|Z1}} (Typ), die Wurzel. * <code>Z2</code>: {{Z|Z2}} (Typ): alles im Wiki ist ein <code>Z2</code>, darum hat es eine so niedrige ZID. * <code>Z3</code>: {{Z|Z3}} (Typ): da das Wort <bdi lang="en" dir="ltr">''key''</bdi> auf Englisch drei Buchstaben hat. * <code>Z4</code>: {{Z|Z4}} (Typ): da das Wort <bdi lang="en" dir="ltr">''type''</bdi> auf Englisch vier Buchstaben hat. * <code>Z5</code>: {{Z|Z5}} (Typ): da das Wort <bdi lang="en" dir="ltr">''error''</bdi> auf Englisch fünf Buchstaben hat. ''(Siehe [[#core-error-types|§ Kern-Fehlertypen]] unten.)'' * <code>Z6</code>: {{Z|Z6}} (Typ): da das Wort <bdi lang="en" dir="ltr">''string''</bdi> auf Englisch sechs Buchstaben hat. * <code>Z7</code>: {{Z|Z7}} (Typ): da Funktionsaufrufe die Hauptmagie des Systems sind und 7 eine magische Zahl ist. Sie ist außerdem nah an <code>Z8</code>. * <code>Z8</code>: {{Z|Z8}} (generischer Typ, also technisch gesehen eine Funktion): da <bdi lang="en" dir="ltr">''function''</bdi> auf Englisch acht Buchstaben hat. ''(Siehe [[#core-functions|§ Kernfunktionen]] unten.)'' * <code>Z9</code>: {{Z|Z9}} (Typ): da das Wort <bdi lang="en" dir="ltr">''reference''</bdi> auf Englisch neun Buchstaben hat. * <code>Z10</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z11</code>: {{Z|Z11}} (Typ): da es nur eine Sprache ist und der Name ''one'' enthält. * <code>Z12</code>: {{Z|Z12}} (Typ): da es eine Erweiterung von <code>Z11</code> ist. * <code>Z13</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z14</code>: {{Z|Z14}} (Typ): da das Wort <bdi lang="en" dir="ltr">''implementation''</bdi> auf Englisch vierzehn Buchstaben hat. * <code>Z15</code>: ''Noch nicht zugewiesen.'' * <code>Z16</code>: {{Z|Z16}} (Typ): kein guter Grund, es liegt nah an Z14 und Z61/Programmiersprache. * <code>Z17</code>: {{Z|Z17}} (Typ). * <code>Z18</code>: {{Z|Z18}} (Typ). * <code>Z19</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z20</code>: {{Z|Z20}} (Typ): da 20/20 die perfekte Vision ist und Tests Fehler sichtbar machen. * <code>Z21</code>: {{Z|Z21}} (Typ). * <code>Z22</code>: {{Z|Z22}} (Typ). * <code>Z23</code>: {{Z|Z23}} (Typ). * <code>Z24</code>: {{Z|Z24}} (Einheit). * <code>Z25</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z26</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z27</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z28</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z29</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z30</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z31</code>: {{Z|Z31}} (Typ). * <code>Z32</code>: {{Z|Z32}} (Typ): da es eine Erweiterung von <code>Z31</code> ist. * <code>Z33</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z34</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z35</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z36</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z37</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z38</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z39</code>: {{Z|Z39}} (Typ): wegen Z3/Schlüssel und Z9/Referenz. * <code>Z40</code>: {{Z|Z40}} (Typ): da Boole erstmals (18)40 publizierte. * <code>Z41</code>: {{Z|Z41}} (Boolesch). * <code>Z42</code>: {{Z|Z42}} (Boolesch). * <code>Z43</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z44</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z45</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z46</code>: {{Z|Z46}} (Typ): da es einen Z4/Typ in Code in eine Z61/Programmiersprache umwandelt. * <code>Z47</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z48</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z49</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z50</code>: {{Z|Z50}} (Typ): da Fehler <code>Z5</code> ist. <!--<nowiki> * <code>Z51</code>: <translate>'''…''' (Type).</translate> … * <code>Z59</code>: <translate>'''…''' (Type).</translate> </nowiki>--> * <code>Z60</code>: {{Z|Z60}} (Typ): da <code>Z6</code> eine Zeichenkette ist. * <code>Z61</code>: {{Z|Z61}} (Typ): da <code>Z16</code> Code ist. * <code>Z64</code>: {{Z|Z64}}: weil es das Gegenteil von <code>Z46</code> ist. <!--<nowiki> * <code>Z62</code>: <translate>'''…''' (Type).</translate> … * <code>Z79</code>: <translate>'''…''' (Type).</translate> </nowiki>--> * <code>Z80</code>: {{Z|Z80}} (Typ): da es ein Oktett ist. <!--<nowiki> * <code>Z81</code>: <translate>'''…''' (Type).</translate> … * <code>Z69</code>: <translate>'''…''' (Type).</translate> </nowiki>--> * <code>Z84</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z85</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z86</code>: {{Z|Z86}} (Typ): da es nicht genau ein Z80/Byte ist, sondern eher eine Z6/Zeichenkette. <!--<nowiki> * <code>Z87</code>: <translate>'''…''' (Type).</translate> * <code>Z88</code>: <translate>'''…''' (Type).</translate> </nowiki> --> * <code>Z89</code>: {{Z|Z89}} (Typ) * <code>Z96</code>: <span lang="en" dir="ltr" class="mw-content-ltr">{{Z|Z96}} (Type): because it is a Z9 but as a Z6</span> * <code>Z99</code>: {{Z|Z99}} (Typ): da es ein Bisschen wie ein schließendes Anführungszeichen auf Englisch aussieht. </div></div> {{Anchor|wikidata-types}} <span id="Wikidata_types"></span> ==== Wikidata-Typen ==== <div style="margin:.3em 0; border:1px solid #AAA; padding:.3em .5em;"><div style="margin-top:-.3em"> *<code>Z6001</code>: {{Z|Z6001}} (Typ) *<code>Z6002</code>: {{Z|Z6002}} (Typ) *<code>Z6003</code>: {{Z|Z6003}} (Typ) *<code>Z6004</code>: {{Z|Z6004}} (Typ) *<code>Z6005</code>: {{Z|Z6005}} (Typ) *<code>Z6006</code>: {{Z|Z6006}} (Typ) *<code>Z6007</code>: {{Z|Z6007}} (Typ) *<code>Z6008</code>: {{Z|Z6008}} (Typ) *<code>Z6010</code>: {{Z|Z6010}} (Typ) *<code>Z6011</code>: {{Z|Z6011}} (Typ) *<code>Z6020</code>: {{Z|Z6020}} (Typ) *<code>Z6021</code>: {{Z|Z6021}} (Aussage-Untertyp) *<code>Z6022</code>: {{Z|Z6022}} (Aussage-Untertyp) *<code>Z6023</code>: {{Z|Z6023}} (Aussage-Untertyp) *<code>Z6030</code>: {{Z|Z6030}} (Typ) *<code>Z6031</code>: {{Z|Z6031}} (Entitätsteil) *<code>Z6032</code>: {{Z|Z6032}} (Entitätsteil) *<code>Z6033</code>: {{Z|Z6033}} (Entitätsteil) *<code>Z6034</code>: {{Z|Z6034}} (Entitätsteil) *<code>Z6035</code>: {{Z|Z6035}} (Entitätsteil) *<code>Z6036</code>: {{Z|Z6036}} (Entitätsteil) *<code>Z6037</code>: {{Z|Z6037}} (Entitätsteil) *<code>Z6038</code>: {{Z|Z6038}} (Entitätsteil) *<code>Z6040</code>: {{Z|Z6040}} (Typ) *<code>Z6041</code>: {{Z|Z6041}} (Aussagerang) *<code>Z6042</code>: {{Z|Z6042}} (Aussagerang) *<code>Z6043</code>: {{Z|Z6043}} (Aussagerang) *<code>Z6060</code>: {{Z|Z6060}} (Typ) *<code>Z6061</code>: {{Z|Z6061}} (Typ) *<code>Z6062</code>: {{Z|Z6062}} (Typ) *<code>Z6063</code>: {{Z|Z6063}} (Typ) *<code>Z6064</code>: {{Z|Z6064}} (Typ) *<code>Z6091</code>: {{Z|Z6091}} (Typ) *<code>Z6092</code>: {{Z|Z6092}} (Typ) *<code>Z6094</code>: {{Z|Z6094}} (Typ) *<code>Z6095</code>: {{Z|Z6095}} (Typ) *<code>Z6096</code>: {{Z|Z6096}} (Typ) </div></div> {{Anchor|core-functions}} <span id="Core_functions"></span> === Kernfunktionen === <div style="margin:.3em 0; border:1px solid #AAA; padding:.3em .5em;"><div style="margin-top:-.3em"> * <code>Z801</code> {{Z+|Z801}}: T ➝ T * <code>Z802</code> {{Z+|Z802}}: Boolean, T, T ➝ T * <code>Z803</code> {{Z+|Z803}}: Key reference, Any ➝ Any *: Z3/Schlüssel * <code>Z804</code> {{Z+|Z804}}: List(Key reference) ➝ Abt * <code>Z805</code> {{Z+|Z805}}: Any ➝ List(Pair(Key reference, Any)) *: Reify hat fünf Buchstaben * <code>Z808</code> {{Z+|Z808}}: List(Pair(Key reference, Any)) ➝ Any *: Abstract hat acht Buchstaben. * <code>Z810</code> {{Z+|Z810}}: T, List(T) ➝ List(T) *: (da Z10 Liste ist). * <code>Z811</code> {{Z+|Z811}}: List(T) ➝ T *: (da Z10 Liste sein sollte und wir das erste erhalten) * <code>Z812</code> {{Z+|Z812}}: List(T) ➝ List(T) *: (da Z10 Liste sein sollte und wir das zweite, den Rest, erhalten) * <code>Z813</code> {{Z+|Z813}}: List(T) ➝ Boolean *: (da Z13 als leere Liste geplant war). * <code>Z820</code> {{Z+|Z820}}: String, Any ➝ Any * <code>Z821</code> {{Z+|Z821}}: Pair(T1, T2) ➝ T1 *: (da Z22 Paar ist). * <code>Z822</code> {{Z+|Z822}}: Pair(T1, T2) ➝ T2 *: (da Z22 Paar ist). * <code>Z823</code> {{Z+|Z823}}: Quote ➝ Pair(Object, Object) * <code>Z825</code> {{Z+|Z825}}: Item reference, Natural language, Gregorian calendar date ➝ HTML fragment * <code>Z828</code> {{Z+|Z828}}: Quote ➝ Persistent object * <code>Z832</code> {{Z+|Z832}}: Monolingual stringset, Monolingual stringset ➝ Boolean * <code>Z844</code> {{Z+|Z844}}: Boolean, Boolean ➝ Boolean * <code>Z850</code> {{Z+|Z850}}: Object, Error type, Object ➝ Object *: (da es mit Z5/Fehlern umgeht) * <code>Z851</code> {{Z+|Z851}}: Error type, List(T) ➝ Unit * <code>Z852</code> {{Z+|Z852}}: Error, Error type ➝ Boolean * <code>Z853</code> {{Z+|Z853}}: Object ➝ Pair(Error, Object) * <code>Z854</code> {{Z+|Z854}}: Object ➝ String * <code>Z860</code> {{Z+|Z860}}: String ➝ Language * <code>Z862</code> {{Z+|Z862}}: Natural language, Natural language ➝ Boolean * <code>Z866</code> {{Z+|Z866}}: String, String ➝ Boolean * <code>Z868</code> Ersetzt durch {{Z+|Z22717}}: String ➝ List(Character) *: Wegen Z6/Zeichenkette und Z86/Zeichen. * <code>Z869</code> {{Z+|Z869}}: String ➝ Wikifunctions Object Reference * <code>Z872</code> {{Z+|Z872}}: Function, Typed list (Object) ➝ Object * <code>Z873</code> {{Z+|Z873}} Function, List ➝ List * <code>Z876</code> {{Z+|Z876}}: Function, List, Object ➝ Object * <code>Z877</code> {{Z+|Z877}}: HTML fragment -> HTML fragment * <code>Z881</code> {{Z+|Z881}}: Type ➝ Type * <code>Z882</code> {{Z+|Z882}}: Type, Type ➝ Type * <code>Z883</code> {{Z+|Z883}}: T ➝ T * <code>Z884</code> {{Z+|Z884}}: Type, List(Reference), String ➝ Type * <code>Z885</code> {{Z+|Z885}}: Error type ➝ Type * <code>Z886</code> Ersetzt durch {{Z+|Z22693}}: List*(Character) ➝ String *: Wegen Z86/Zeichen und Z6/Zeichenkette. * <code>Z888</code> Ersetzt durch {{Z+|Z22683}}: Character, Character ➝ Boolean * <code>Z889</code> {{Z+|Z889}}: Typed list (Object), Typed list (Object), Function ➝ Boolean * <code>Z899</code> {{Z+|Z899}}: Quote ➝ Any *: Wegen Z99/Zitat. </div></div> {{Anchor|wikidata-functions}} <span id="Wikidata_functions"></span> ==== Wikidata-Funktionen ==== <div style="margin:.3em 0; border:1px solid #AAA; padding:.3em .5em;"><div style="margin-top:-.3em"> *<code>Z6801</code> bis <code>Z6808</code> sind die Funktionen für 'gleiches Objekt', die <code>Z6001</code> bis <code>Z6008</code> entsprechen. *<code>Z6820</code> {{Z+|Z6820}}: List(Object) ➝ Map(String, Object) *<code>Z6821</code> {{Z+|Z6821}}: Item reference ➝ Item *<code>Z6822</code> {{Z+|Z6822}}: Property reference ➝ Property *<code>Z6824</code> {{Z+|Z6824}}: Lexeme form reference ➝ Lexeme form *<code>Z6825</code> {{Z+|Z6825}}: Lexeme reference ➝ Lexeme *<code>Z6826</code> {{Z+|Z6826}}: Lexeme sense reference ➝ Lexeme sense *<code>Z6830</code> {{Z+|Z6830}}: Item reference, Property reference, Natural language ➝ List(Lexeme reference) *<code>Z6831</code> {{Z+|Z6831}}: Lexeme sense reference, Property reference, Natural language ➝ List(Lexeme reference) *<code>Z6839</code> {{Z+|Z6839}}: Wikidata Item reference, Typed List(String), Typed List(Natural language) ➝ Typed List(Wikidata sitelink) *<code>Z6884</code> {{Z+|Z6884}}: Type, List(Object), String ➝ Type *<code>Z6894</code> {{Z+|Z6894}} *<code>Z6895</code> {{Z+|Z6895}}: Object ➝ Object *<code>Z6896</code> {{Z+|Z6896}}: List(String) ➝ Object </div></div> {{Anchor|core-error-types}} <span id="Core_error_types"></span> === Kern-Fehlertypen === <div style="margin:.3em 0; border:1px solid #AAA; padding:.3em .5em;"><div style="margin-top:-.3em"> * {{Z|Z500}} (Fehlerinformation): unspezifizierter Fehler * {{Z|Z501}} (Fehlermeldung, Eingabe): Syntaxfehler * {{Z|Z502}} (Untertyp, Wert): nicht wohlgeformt, verweist auf Z52X oder Z53X * {{Z|Z503}} (Funktionsname): noch nicht implementiert * {{Z|Z504}} (ZID): ZID nicht gefunden * {{Z|Z505}} (erwartet, tatsächlich, Argumente): Anzahl der Argumente stimmt nicht überein * {{Z|Z506}} (erwartet, tatsächlich, Argumente): Argumenttyp stimmt nicht überein * {{Z|Z507}} (Funktionsaufruf): Fehler in der Auswertung * {{Z|Z508}} (Objekt): konkurrierende Schlüssel * {{Z|Z509}} (Fehler): Liste von Fehlern * {{Z|Z510}} (keine): null * {{Z|Z511}} (Schlüsselreferenz, Objekt): Schlüssel nicht gefunden * {{Z|Z512}} (Objekt): Fehler Z9 * {{Z|Z513}} (aufgelöstes Objekt): aufgelöstes Objekt ohne Z2K2 * {{Z|Z514}} (Implementierung): eingebaute Funktion existiert nicht * {{Z|Z515}} (Implementierung): eingebaute ID ist fehlerhaft * {{Z|Z516}} (Schlüssel, schlechter Wert): Fehler beim Argumentwert * {{Z|Z517}} (erwarteter Typ, tatsächlicher Typ, zurückgegebener Wert, weitergegebener Fehler): zurückgegebener Wert stimmt nicht überein * {{Z|Z518}} (erwarteter Typ, Objekt, weitergegebener Fehler): Objekttyp stimmt nicht überein * {{Z|Z519}} (Objekt): undefinierter Listentyp * {{Z|Z520}} (Objekt): falscher Listentyp * {{Z|Z521}} (verletzender Wert): ZObjekte dürfen keine Zahl, boolesch oder null sein * {{Z|Z522}} (verletzender Index im Array, verbreiteter Fehler): Array-Element nicht wohlgeformt * {{Z|Z523}} (Objekt): Fehlende Z1K1 * {{Z|Z524}} (Wert von Z1K1): Z1K1 darf keine Zeichenkette und kein Array sein * {{Z|Z525}} (Schlüssel): Ungültiger Schlüssel * {{Z|Z526}} (Schlüssel, verbreiteter Fehler): nicht wohlgeformter Wert] * {{Z|Z529}} (Host-Name) * {{Z|Z530}} (Funktionsaufruf, propagierter Fehler) * {{Z|Z531}} (ganzes Objekt): Z6 muss zwei Schlüssel haben * {{Z|Z532}} (ganzes Objekt): Z6 ohne Z6K1 * {{Z|Z533}} (Wert von Z6K1): Z6K1 muss eine Zeichenkette sein * {{Z|Z534}} (ganzes Objekt): Z9 muss zwei Schlüssel haben * {{Z|Z535}} (ganzes Objekt): Z9 ohne Z9K1 * {{Z|Z536}} (Wert von Z9K1): Z9K1 muss eine Zeichenkette in JSON sein * {{Z|Z537}} (Wert von Z9K1): Z9K1 muss wie eine Referenz aussehen * {{Z|Z538}} (Seitentitel): falscher Namensraum * {{Z|Z539}} (Seitentitel): falscher Inhaltstyp * {{Z|Z540}} (Sprachcode): ungültiger Sprachcode * {{Z|Z541}} (Sprachcode): Sprachcode nicht gefunden * {{Z|Z542}} (erwarteter Typ, tatsächliches Objekt): erwarteter Typ, tatsächliches Objekt * {{Z|Z543}} (Typenname): Typ nicht gefunden * {{Z|Z544}} (Typen-ZID, Typenname, vorhandener Typenname): widersprüchliche Typennamen * {{Z|Z545}} (Typen-ZID, Typenname, vorhandene Typen-ZID): widersprüchliche Typen-ZIDs * {{Z|Z546}} (Typen-ZID, Typenname): eingebauter Typ nicht gefunden * {{Z|Z547}} (Eingabe): ungültiges Format * {{Z|Z548}} (Fehlermeldung, Eingabe): ungültiges JSON * {{Z|Z549}} (Referenzwert): ungültige ZReferenz * {{Z|Z550}} (Referenzwert): unbekannte ZReferenz * {{Z|Z551}} (Schlüssel, erwarteter Typ, tatsächlicher Typ): Schematyp stimmt nicht überein * {{Z|Z552}} (Index, erwarteter Typ, tatsächlicher Typ): Typ des Array-Elements stimmt nicht überein * {{Z|Z553}} (ZObjekt): nicht erlaubter Wurzeltyp * {{Z|Z554}} (kollidierende ZID): Bezeichnung kollidiert mit der Bezeichnung eines anderen ZObjektes * {{Z|Z555}} (ZID, Titel): ZID und Seitentitel stimmen nicht überein * {{Z|Z556}} (Titel): ungültiger Seitentitel * {{Z|Z557}} (Fehlermeldung): Benutzer hat nicht die Berechtigung * {{Z|Z558}} (Programmiersprache): ungültige Programmiersprache * {{Z|Z559}} (keine): Benutzer darf Funktionen nicht auswerten * {{Z|Z560}} (Auswertungsergebnis): ungültiges Auswertungsergebnis * {{Z|Z561}} (weitergegebener Fehler): ungültige Auswertungsanfrage * {{Z|Z562}} (fehlende Eigenschaft): unvollständige Auswertungsanfrage * {{Z|Z563}} (Aufruf): Aufruf durch nicht wiedereintretenden Ausführer * {{Z|Z564}} (Inhalte): ungültige Ausführerantwort * {{Z|Z565}} (fehlende Eigenschaft): unvollständige Ausführeranfrage * {{Z|Z570}} (Beschränkungslimit des Orchestrierers): Beschränkungslimit des Orchestrierers erreicht * {{Z|Z571}} (Beschränkungslimit des Auswerters): Beschränkungslimit des Auswerters erreicht * {{Z|Z572}} (Rekursionslimit, Funktionsname): Rekursionslimit im Orchestrierer erreicht * {{Z|Z573}} (Rekursionslimit, Funktionsname): Rekursionslimit im Auswerter erreicht * {{Z|Z574}} (Zeitlimit): Zeitlimit im Orchestrierer erreicht * {{Z|Z575}} (Zeitlimit): Zeitlimit im Auswerter erreicht * {{Z|Z576}} (Zeitlimit) * {{Z|Z580}} (doppelte Sprache) </div></div> <span id="See_also"></span> == Siehe auch == * [[:m:Special:MyLanguage/Abstract Wikipedia/Notes|Übersicht der Anmerkungen]] <noinclude> [[Category:Technical documentation{{#translation:}}|Reserved ZIDs]] </noinclude> 1378wzslf0mjpgnd0bhl9xa7tv0uuw4 331132 331130 2026-10-23T08:25:19Z Ameisenigel 44 Created page with "(Siehe [[$1|§ Wikidata-Funktionen]] unten.)" 331132 wikitext text/x-wiki <noinclude><languages/>{{Technical documentation navbox}}</noinclude> Diese Seite führt ZIDs auf, die von Wikilambda, die von Wikifunktions verwendete Software, reserviert werden. Alle ZIDs mit vier oder weniger Ziffern sind reserviert. Siehe [[Wikifunctions:Reserved ZIDs/all]] für eine Liste aller aktuellen vordefinierten Objekte. <span id="Ranges"></span> === Bereiche === Wir reservieren bestimmte Bereiche für bestimmte Arten von vordefinierten Objekten. <div style="margin:.3em 0; border:1px solid #AAA; padding:.3em .5em;"><div style="margin-top:-.3em"> * <code>Z1</code> – <code>Z99</code>: Kerntypen. ''(Siehe [[#core-types|§ Kerntypen]] unten.)'' * <code>Z100</code> – <code>Z199</code>: Prüfer für die Kerntypen (''d. h.'' für jeden Kerntyp, +100 ergibt den Prüfer), ''z. B.'' ist Z104 der Prüfer für Z4/Typ * <code>Z200</code> – <code>Z299</code>: eingebaute Implementierungen für die Prüfer für die Kerntypen (''z. B.'' ist Z204 die eingebaute Implementierung für den Prüfer für Z4/Typ) * <code>Z300</code> – <code>Z399</code>: ''vorerst nicht zugewiesen'' * <code>Z400</code> – <code>Z499</code>: ''reserviert für die lokale Nutzung'' * <code>Z500</code> – <code>Z599</code>: Kern-Fehlertypen (<code>Z5XX</code>, da <code>Z5</code> der Fehler ist) ''(Siehe [[#core-error-types|§ Kern-Fehlertypen]] unten.)'' * <code>Z600</code> – <code>Z699</code>: Kern-Programmiersprachen (<code>Z6XX</code>, da <code>Z61</code> die Programmiersprache ist) * <code>Z700</code> – <code>Z799</code>: ''vorerst nicht zugewiesen'' * <code>Z800</code> – <code>Z899</code>: Definitionen von Kernfunktionen mit eingebauten Funktionen (<code>Z8XX</code>, da <code>Z8</code> die Funktion ist) ''(Siehe [[#core-functions|§ Kernfunktionen]] unten.)'' * <code>Z900</code> – <code>Z999</code>: eingebaute Funktionen für die Kernfunktionen (sie sind die entsprechende Z8XX +100) * <code>Z1000</code> – <code>Z2999</code>: natürliche Sprachen (Instanzen von Z60) * <code>Z3000</code> – <code>Z5999</code>: ''reserviert für die zukünftige Nutzung'' * <code>Z6000</code> – <code>Z6999</code>: ''Typen, Funktionen, ''etc.'' für das Nutzen von Inhalten von Wikidata und anderen Wikimedia-Quellen'' ** <code>Z6000</code> – <code>Z6099</code>: ''Typen für Inhalte von Wikidata und anderen Wikimedia-Quellen'' ''(Siehe [[#wikidata-types|§ Wikidata-Typen]] unten.)'' ** <code>Z6100</code> – <code>Z6199</code>: ''Prüfer für diese Typen'' ** <code>Z6200</code> – <code>Z6299</code>: ''integrierte Implementierungen der Prüfer'' ** <code>Z6800</code> – <code>Z6899</code>: ''Hilfsfunktionen für diese Typen, die integriert sein müssen (z. B. Abrufen, Gleichheit)'' ''(Siehe [[#wikidata-functions|§ Wikidata-Funktionen]] unten.)'' ** <code>Z6900</code> – <code>Z6999</code>: ''integrierte Implementierungen der Hilfsfunktionen'' * <code>Z7000</code> – <code>Z7999</code>: ''reserviert für die zukünftige Nutzung'' * <code>Z8000</code> – <code>Z8999</code>: Tester für jede vordefinierte Funktion (''z. B.'' wird Z801 über Z8010, Z8011, Z8012, … Z8019 getestet). * <code>Z9000</code> – <code>Z9999</code>: ''reserviert für die zukünftige Nutzung'' </div></div> {{Anchor|core-types}} <span id="Core_types"></span> === Kerntypen === <div style="margin:.3em 0; border:1px solid #AAA; padding:.3em .5em;"><div style="margin-top:-.3em"> * <code>Z1</code>: {{Z|Z1}} (Typ), die Wurzel. * <code>Z2</code>: {{Z|Z2}} (Typ): alles im Wiki ist ein <code>Z2</code>, darum hat es eine so niedrige ZID. * <code>Z3</code>: {{Z|Z3}} (Typ): da das Wort <bdi lang="en" dir="ltr">''key''</bdi> auf Englisch drei Buchstaben hat. * <code>Z4</code>: {{Z|Z4}} (Typ): da das Wort <bdi lang="en" dir="ltr">''type''</bdi> auf Englisch vier Buchstaben hat. * <code>Z5</code>: {{Z|Z5}} (Typ): da das Wort <bdi lang="en" dir="ltr">''error''</bdi> auf Englisch fünf Buchstaben hat. ''(Siehe [[#core-error-types|§ Kern-Fehlertypen]] unten.)'' * <code>Z6</code>: {{Z|Z6}} (Typ): da das Wort <bdi lang="en" dir="ltr">''string''</bdi> auf Englisch sechs Buchstaben hat. * <code>Z7</code>: {{Z|Z7}} (Typ): da Funktionsaufrufe die Hauptmagie des Systems sind und 7 eine magische Zahl ist. Sie ist außerdem nah an <code>Z8</code>. * <code>Z8</code>: {{Z|Z8}} (generischer Typ, also technisch gesehen eine Funktion): da <bdi lang="en" dir="ltr">''function''</bdi> auf Englisch acht Buchstaben hat. ''(Siehe [[#core-functions|§ Kernfunktionen]] unten.)'' * <code>Z9</code>: {{Z|Z9}} (Typ): da das Wort <bdi lang="en" dir="ltr">''reference''</bdi> auf Englisch neun Buchstaben hat. * <code>Z10</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z11</code>: {{Z|Z11}} (Typ): da es nur eine Sprache ist und der Name ''one'' enthält. * <code>Z12</code>: {{Z|Z12}} (Typ): da es eine Erweiterung von <code>Z11</code> ist. * <code>Z13</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z14</code>: {{Z|Z14}} (Typ): da das Wort <bdi lang="en" dir="ltr">''implementation''</bdi> auf Englisch vierzehn Buchstaben hat. * <code>Z15</code>: ''Noch nicht zugewiesen.'' * <code>Z16</code>: {{Z|Z16}} (Typ): kein guter Grund, es liegt nah an Z14 und Z61/Programmiersprache. * <code>Z17</code>: {{Z|Z17}} (Typ). * <code>Z18</code>: {{Z|Z18}} (Typ). * <code>Z19</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z20</code>: {{Z|Z20}} (Typ): da 20/20 die perfekte Vision ist und Tests Fehler sichtbar machen. * <code>Z21</code>: {{Z|Z21}} (Typ). * <code>Z22</code>: {{Z|Z22}} (Typ). * <code>Z23</code>: {{Z|Z23}} (Typ). * <code>Z24</code>: {{Z|Z24}} (Einheit). * <code>Z25</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z26</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z27</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z28</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z29</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z30</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z31</code>: {{Z|Z31}} (Typ). * <code>Z32</code>: {{Z|Z32}} (Typ): da es eine Erweiterung von <code>Z31</code> ist. * <code>Z33</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z34</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z35</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z36</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z37</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z38</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z39</code>: {{Z|Z39}} (Typ): wegen Z3/Schlüssel und Z9/Referenz. * <code>Z40</code>: {{Z|Z40}} (Typ): da Boole erstmals (18)40 publizierte. * <code>Z41</code>: {{Z|Z41}} (Boolesch). * <code>Z42</code>: {{Z|Z42}} (Boolesch). * <code>Z43</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z44</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z45</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z46</code>: {{Z|Z46}} (Typ): da es einen Z4/Typ in Code in eine Z61/Programmiersprache umwandelt. * <code>Z47</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z48</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z49</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z50</code>: {{Z|Z50}} (Typ): da Fehler <code>Z5</code> ist. <!--<nowiki> * <code>Z51</code>: <translate>'''…''' (Type).</translate> … * <code>Z59</code>: <translate>'''…''' (Type).</translate> </nowiki>--> * <code>Z60</code>: {{Z|Z60}} (Typ): da <code>Z6</code> eine Zeichenkette ist. * <code>Z61</code>: {{Z|Z61}} (Typ): da <code>Z16</code> Code ist. * <code>Z64</code>: {{Z|Z64}}: weil es das Gegenteil von <code>Z46</code> ist. <!--<nowiki> * <code>Z62</code>: <translate>'''…''' (Type).</translate> … * <code>Z79</code>: <translate>'''…''' (Type).</translate> </nowiki>--> * <code>Z80</code>: {{Z|Z80}} (Typ): da es ein Oktett ist. <!--<nowiki> * <code>Z81</code>: <translate>'''…''' (Type).</translate> … * <code>Z69</code>: <translate>'''…''' (Type).</translate> </nowiki>--> * <code>Z84</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z85</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z86</code>: {{Z|Z86}} (Typ): da es nicht genau ein Z80/Byte ist, sondern eher eine Z6/Zeichenkette. <!--<nowiki> * <code>Z87</code>: <translate>'''…''' (Type).</translate> * <code>Z88</code>: <translate>'''…''' (Type).</translate> </nowiki> --> * <code>Z89</code>: {{Z|Z89}} (Typ) * <code>Z96</code>: <span lang="en" dir="ltr" class="mw-content-ltr">{{Z|Z96}} (Type): because it is a Z9 but as a Z6</span> * <code>Z99</code>: {{Z|Z99}} (Typ): da es ein Bisschen wie ein schließendes Anführungszeichen auf Englisch aussieht. </div></div> {{Anchor|wikidata-types}} <span id="Wikidata_types"></span> ==== Wikidata-Typen ==== <div style="margin:.3em 0; border:1px solid #AAA; padding:.3em .5em;"><div style="margin-top:-.3em"> *<code>Z6001</code>: {{Z|Z6001}} (Typ) *<code>Z6002</code>: {{Z|Z6002}} (Typ) *<code>Z6003</code>: {{Z|Z6003}} (Typ) *<code>Z6004</code>: {{Z|Z6004}} (Typ) *<code>Z6005</code>: {{Z|Z6005}} (Typ) *<code>Z6006</code>: {{Z|Z6006}} (Typ) *<code>Z6007</code>: {{Z|Z6007}} (Typ) *<code>Z6008</code>: {{Z|Z6008}} (Typ) *<code>Z6010</code>: {{Z|Z6010}} (Typ) *<code>Z6011</code>: {{Z|Z6011}} (Typ) *<code>Z6020</code>: {{Z|Z6020}} (Typ) *<code>Z6021</code>: {{Z|Z6021}} (Aussage-Untertyp) *<code>Z6022</code>: {{Z|Z6022}} (Aussage-Untertyp) *<code>Z6023</code>: {{Z|Z6023}} (Aussage-Untertyp) *<code>Z6030</code>: {{Z|Z6030}} (Typ) *<code>Z6031</code>: {{Z|Z6031}} (Entitätsteil) *<code>Z6032</code>: {{Z|Z6032}} (Entitätsteil) *<code>Z6033</code>: {{Z|Z6033}} (Entitätsteil) *<code>Z6034</code>: {{Z|Z6034}} (Entitätsteil) *<code>Z6035</code>: {{Z|Z6035}} (Entitätsteil) *<code>Z6036</code>: {{Z|Z6036}} (Entitätsteil) *<code>Z6037</code>: {{Z|Z6037}} (Entitätsteil) *<code>Z6038</code>: {{Z|Z6038}} (Entitätsteil) *<code>Z6040</code>: {{Z|Z6040}} (Typ) *<code>Z6041</code>: {{Z|Z6041}} (Aussagerang) *<code>Z6042</code>: {{Z|Z6042}} (Aussagerang) *<code>Z6043</code>: {{Z|Z6043}} (Aussagerang) *<code>Z6060</code>: {{Z|Z6060}} (Typ) *<code>Z6061</code>: {{Z|Z6061}} (Typ) *<code>Z6062</code>: {{Z|Z6062}} (Typ) *<code>Z6063</code>: {{Z|Z6063}} (Typ) *<code>Z6064</code>: {{Z|Z6064}} (Typ) *<code>Z6091</code>: {{Z|Z6091}} (Typ) *<code>Z6092</code>: {{Z|Z6092}} (Typ) *<code>Z6094</code>: {{Z|Z6094}} (Typ) *<code>Z6095</code>: {{Z|Z6095}} (Typ) *<code>Z6096</code>: {{Z|Z6096}} (Typ) </div></div> {{Anchor|core-functions}} <span id="Core_functions"></span> === Kernfunktionen === <div style="margin:.3em 0; border:1px solid #AAA; padding:.3em .5em;"><div style="margin-top:-.3em"> * <code>Z801</code> {{Z+|Z801}}: T ➝ T * <code>Z802</code> {{Z+|Z802}}: Boolean, T, T ➝ T * <code>Z803</code> {{Z+|Z803}}: Key reference, Any ➝ Any *: Z3/Schlüssel * <code>Z804</code> {{Z+|Z804}}: List(Key reference) ➝ Abt * <code>Z805</code> {{Z+|Z805}}: Any ➝ List(Pair(Key reference, Any)) *: Reify hat fünf Buchstaben * <code>Z808</code> {{Z+|Z808}}: List(Pair(Key reference, Any)) ➝ Any *: Abstract hat acht Buchstaben. * <code>Z810</code> {{Z+|Z810}}: T, List(T) ➝ List(T) *: (da Z10 Liste ist). * <code>Z811</code> {{Z+|Z811}}: List(T) ➝ T *: (da Z10 Liste sein sollte und wir das erste erhalten) * <code>Z812</code> {{Z+|Z812}}: List(T) ➝ List(T) *: (da Z10 Liste sein sollte und wir das zweite, den Rest, erhalten) * <code>Z813</code> {{Z+|Z813}}: List(T) ➝ Boolean *: (da Z13 als leere Liste geplant war). * <code>Z820</code> {{Z+|Z820}}: String, Any ➝ Any * <code>Z821</code> {{Z+|Z821}}: Pair(T1, T2) ➝ T1 *: (da Z22 Paar ist). * <code>Z822</code> {{Z+|Z822}}: Pair(T1, T2) ➝ T2 *: (da Z22 Paar ist). * <code>Z823</code> {{Z+|Z823}}: Quote ➝ Pair(Object, Object) * <code>Z825</code> {{Z+|Z825}}: Item reference, Natural language, Gregorian calendar date ➝ HTML fragment * <code>Z828</code> {{Z+|Z828}}: Quote ➝ Persistent object * <code>Z832</code> {{Z+|Z832}}: Monolingual stringset, Monolingual stringset ➝ Boolean * <code>Z844</code> {{Z+|Z844}}: Boolean, Boolean ➝ Boolean * <code>Z850</code> {{Z+|Z850}}: Object, Error type, Object ➝ Object *: (da es mit Z5/Fehlern umgeht) * <code>Z851</code> {{Z+|Z851}}: Error type, List(T) ➝ Unit * <code>Z852</code> {{Z+|Z852}}: Error, Error type ➝ Boolean * <code>Z853</code> {{Z+|Z853}}: Object ➝ Pair(Error, Object) * <code>Z854</code> {{Z+|Z854}}: Object ➝ String * <code>Z860</code> {{Z+|Z860}}: String ➝ Language * <code>Z862</code> {{Z+|Z862}}: Natural language, Natural language ➝ Boolean * <code>Z866</code> {{Z+|Z866}}: String, String ➝ Boolean * <code>Z868</code> Ersetzt durch {{Z+|Z22717}}: String ➝ List(Character) *: Wegen Z6/Zeichenkette und Z86/Zeichen. * <code>Z869</code> {{Z+|Z869}}: String ➝ Wikifunctions Object Reference * <code>Z872</code> {{Z+|Z872}}: Function, Typed list (Object) ➝ Object * <code>Z873</code> {{Z+|Z873}} Function, List ➝ List * <code>Z876</code> {{Z+|Z876}}: Function, List, Object ➝ Object * <code>Z877</code> {{Z+|Z877}}: HTML fragment -> HTML fragment * <code>Z881</code> {{Z+|Z881}}: Type ➝ Type * <code>Z882</code> {{Z+|Z882}}: Type, Type ➝ Type * <code>Z883</code> {{Z+|Z883}}: T ➝ T * <code>Z884</code> {{Z+|Z884}}: Type, List(Reference), String ➝ Type * <code>Z885</code> {{Z+|Z885}}: Error type ➝ Type * <code>Z886</code> Ersetzt durch {{Z+|Z22693}}: List*(Character) ➝ String *: Wegen Z86/Zeichen und Z6/Zeichenkette. * <code>Z888</code> Ersetzt durch {{Z+|Z22683}}: Character, Character ➝ Boolean * <code>Z889</code> {{Z+|Z889}}: Typed list (Object), Typed list (Object), Function ➝ Boolean * <code>Z899</code> {{Z+|Z899}}: Quote ➝ Any *: Wegen Z99/Zitat. </div></div> {{Anchor|wikidata-functions}} <span id="Wikidata_functions"></span> ==== Wikidata-Funktionen ==== <div style="margin:.3em 0; border:1px solid #AAA; padding:.3em .5em;"><div style="margin-top:-.3em"> *<code>Z6801</code> bis <code>Z6808</code> sind die Funktionen für 'gleiches Objekt', die <code>Z6001</code> bis <code>Z6008</code> entsprechen. *<code>Z6820</code> {{Z+|Z6820}}: List(Object) ➝ Map(String, Object) *<code>Z6821</code> {{Z+|Z6821}}: Item reference ➝ Item *<code>Z6822</code> {{Z+|Z6822}}: Property reference ➝ Property *<code>Z6824</code> {{Z+|Z6824}}: Lexeme form reference ➝ Lexeme form *<code>Z6825</code> {{Z+|Z6825}}: Lexeme reference ➝ Lexeme *<code>Z6826</code> {{Z+|Z6826}}: Lexeme sense reference ➝ Lexeme sense *<code>Z6830</code> {{Z+|Z6830}}: Item reference, Property reference, Natural language ➝ List(Lexeme reference) *<code>Z6831</code> {{Z+|Z6831}}: Lexeme sense reference, Property reference, Natural language ➝ List(Lexeme reference) *<code>Z6839</code> {{Z+|Z6839}}: Wikidata Item reference, Typed List(String), Typed List(Natural language) ➝ Typed List(Wikidata sitelink) *<code>Z6884</code> {{Z+|Z6884}}: Type, List(Object), String ➝ Type *<code>Z6894</code> {{Z+|Z6894}} *<code>Z6895</code> {{Z+|Z6895}}: Object ➝ Object *<code>Z6896</code> {{Z+|Z6896}}: List(String) ➝ Object </div></div> {{Anchor|core-error-types}} <span id="Core_error_types"></span> === Kern-Fehlertypen === <div style="margin:.3em 0; border:1px solid #AAA; padding:.3em .5em;"><div style="margin-top:-.3em"> * {{Z|Z500}} (Fehlerinformation): unspezifizierter Fehler * {{Z|Z501}} (Fehlermeldung, Eingabe): Syntaxfehler * {{Z|Z502}} (Untertyp, Wert): nicht wohlgeformt, verweist auf Z52X oder Z53X * {{Z|Z503}} (Funktionsname): noch nicht implementiert * {{Z|Z504}} (ZID): ZID nicht gefunden * {{Z|Z505}} (erwartet, tatsächlich, Argumente): Anzahl der Argumente stimmt nicht überein * {{Z|Z506}} (erwartet, tatsächlich, Argumente): Argumenttyp stimmt nicht überein * {{Z|Z507}} (Funktionsaufruf): Fehler in der Auswertung * {{Z|Z508}} (Objekt): konkurrierende Schlüssel * {{Z|Z509}} (Fehler): Liste von Fehlern * {{Z|Z510}} (keine): null * {{Z|Z511}} (Schlüsselreferenz, Objekt): Schlüssel nicht gefunden * {{Z|Z512}} (Objekt): Fehler Z9 * {{Z|Z513}} (aufgelöstes Objekt): aufgelöstes Objekt ohne Z2K2 * {{Z|Z514}} (Implementierung): eingebaute Funktion existiert nicht * {{Z|Z515}} (Implementierung): eingebaute ID ist fehlerhaft * {{Z|Z516}} (Schlüssel, schlechter Wert): Fehler beim Argumentwert * {{Z|Z517}} (erwarteter Typ, tatsächlicher Typ, zurückgegebener Wert, weitergegebener Fehler): zurückgegebener Wert stimmt nicht überein * {{Z|Z518}} (erwarteter Typ, Objekt, weitergegebener Fehler): Objekttyp stimmt nicht überein * {{Z|Z519}} (Objekt): undefinierter Listentyp * {{Z|Z520}} (Objekt): falscher Listentyp * {{Z|Z521}} (verletzender Wert): ZObjekte dürfen keine Zahl, boolesch oder null sein * {{Z|Z522}} (verletzender Index im Array, verbreiteter Fehler): Array-Element nicht wohlgeformt * {{Z|Z523}} (Objekt): Fehlende Z1K1 * {{Z|Z524}} (Wert von Z1K1): Z1K1 darf keine Zeichenkette und kein Array sein * {{Z|Z525}} (Schlüssel): Ungültiger Schlüssel * {{Z|Z526}} (Schlüssel, verbreiteter Fehler): nicht wohlgeformter Wert] * {{Z|Z529}} (Host-Name) * {{Z|Z530}} (Funktionsaufruf, propagierter Fehler) * {{Z|Z531}} (ganzes Objekt): Z6 muss zwei Schlüssel haben * {{Z|Z532}} (ganzes Objekt): Z6 ohne Z6K1 * {{Z|Z533}} (Wert von Z6K1): Z6K1 muss eine Zeichenkette sein * {{Z|Z534}} (ganzes Objekt): Z9 muss zwei Schlüssel haben * {{Z|Z535}} (ganzes Objekt): Z9 ohne Z9K1 * {{Z|Z536}} (Wert von Z9K1): Z9K1 muss eine Zeichenkette in JSON sein * {{Z|Z537}} (Wert von Z9K1): Z9K1 muss wie eine Referenz aussehen * {{Z|Z538}} (Seitentitel): falscher Namensraum * {{Z|Z539}} (Seitentitel): falscher Inhaltstyp * {{Z|Z540}} (Sprachcode): ungültiger Sprachcode * {{Z|Z541}} (Sprachcode): Sprachcode nicht gefunden * {{Z|Z542}} (erwarteter Typ, tatsächliches Objekt): erwarteter Typ, tatsächliches Objekt * {{Z|Z543}} (Typenname): Typ nicht gefunden * {{Z|Z544}} (Typen-ZID, Typenname, vorhandener Typenname): widersprüchliche Typennamen * {{Z|Z545}} (Typen-ZID, Typenname, vorhandene Typen-ZID): widersprüchliche Typen-ZIDs * {{Z|Z546}} (Typen-ZID, Typenname): eingebauter Typ nicht gefunden * {{Z|Z547}} (Eingabe): ungültiges Format * {{Z|Z548}} (Fehlermeldung, Eingabe): ungültiges JSON * {{Z|Z549}} (Referenzwert): ungültige ZReferenz * {{Z|Z550}} (Referenzwert): unbekannte ZReferenz * {{Z|Z551}} (Schlüssel, erwarteter Typ, tatsächlicher Typ): Schematyp stimmt nicht überein * {{Z|Z552}} (Index, erwarteter Typ, tatsächlicher Typ): Typ des Array-Elements stimmt nicht überein * {{Z|Z553}} (ZObjekt): nicht erlaubter Wurzeltyp * {{Z|Z554}} (kollidierende ZID): Bezeichnung kollidiert mit der Bezeichnung eines anderen ZObjektes * {{Z|Z555}} (ZID, Titel): ZID und Seitentitel stimmen nicht überein * {{Z|Z556}} (Titel): ungültiger Seitentitel * {{Z|Z557}} (Fehlermeldung): Benutzer hat nicht die Berechtigung * {{Z|Z558}} (Programmiersprache): ungültige Programmiersprache * {{Z|Z559}} (keine): Benutzer darf Funktionen nicht auswerten * {{Z|Z560}} (Auswertungsergebnis): ungültiges Auswertungsergebnis * {{Z|Z561}} (weitergegebener Fehler): ungültige Auswertungsanfrage * {{Z|Z562}} (fehlende Eigenschaft): unvollständige Auswertungsanfrage * {{Z|Z563}} (Aufruf): Aufruf durch nicht wiedereintretenden Ausführer * {{Z|Z564}} (Inhalte): ungültige Ausführerantwort * {{Z|Z565}} (fehlende Eigenschaft): unvollständige Ausführeranfrage * {{Z|Z570}} (Beschränkungslimit des Orchestrierers): Beschränkungslimit des Orchestrierers erreicht * {{Z|Z571}} (Beschränkungslimit des Auswerters): Beschränkungslimit des Auswerters erreicht * {{Z|Z572}} (Rekursionslimit, Funktionsname): Rekursionslimit im Orchestrierer erreicht * {{Z|Z573}} (Rekursionslimit, Funktionsname): Rekursionslimit im Auswerter erreicht * {{Z|Z574}} (Zeitlimit): Zeitlimit im Orchestrierer erreicht * {{Z|Z575}} (Zeitlimit): Zeitlimit im Auswerter erreicht * {{Z|Z576}} (Zeitlimit) * {{Z|Z580}} (doppelte Sprache) </div></div> <span id="See_also"></span> == Siehe auch == * [[:m:Special:MyLanguage/Abstract Wikipedia/Notes|Übersicht der Anmerkungen]] <noinclude> [[Category:Technical documentation{{#translation:}}|Reserved ZIDs]] </noinclude> 49zeaqg5gl9ogo67b4h8ddiyypp5ijh 331134 331132 2026-10-23T08:26:13Z Ameisenigel 44 Created page with "$1 (Typ): da es eine Z9 ist, aber als Z6" 331134 wikitext text/x-wiki <noinclude><languages/>{{Technical documentation navbox}}</noinclude> Diese Seite führt ZIDs auf, die von Wikilambda, die von Wikifunktions verwendete Software, reserviert werden. Alle ZIDs mit vier oder weniger Ziffern sind reserviert. Siehe [[Wikifunctions:Reserved ZIDs/all]] für eine Liste aller aktuellen vordefinierten Objekte. <span id="Ranges"></span> === Bereiche === Wir reservieren bestimmte Bereiche für bestimmte Arten von vordefinierten Objekten. <div style="margin:.3em 0; border:1px solid #AAA; padding:.3em .5em;"><div style="margin-top:-.3em"> * <code>Z1</code> – <code>Z99</code>: Kerntypen. ''(Siehe [[#core-types|§ Kerntypen]] unten.)'' * <code>Z100</code> – <code>Z199</code>: Prüfer für die Kerntypen (''d. h.'' für jeden Kerntyp, +100 ergibt den Prüfer), ''z. B.'' ist Z104 der Prüfer für Z4/Typ * <code>Z200</code> – <code>Z299</code>: eingebaute Implementierungen für die Prüfer für die Kerntypen (''z. B.'' ist Z204 die eingebaute Implementierung für den Prüfer für Z4/Typ) * <code>Z300</code> – <code>Z399</code>: ''vorerst nicht zugewiesen'' * <code>Z400</code> – <code>Z499</code>: ''reserviert für die lokale Nutzung'' * <code>Z500</code> – <code>Z599</code>: Kern-Fehlertypen (<code>Z5XX</code>, da <code>Z5</code> der Fehler ist) ''(Siehe [[#core-error-types|§ Kern-Fehlertypen]] unten.)'' * <code>Z600</code> – <code>Z699</code>: Kern-Programmiersprachen (<code>Z6XX</code>, da <code>Z61</code> die Programmiersprache ist) * <code>Z700</code> – <code>Z799</code>: ''vorerst nicht zugewiesen'' * <code>Z800</code> – <code>Z899</code>: Definitionen von Kernfunktionen mit eingebauten Funktionen (<code>Z8XX</code>, da <code>Z8</code> die Funktion ist) ''(Siehe [[#core-functions|§ Kernfunktionen]] unten.)'' * <code>Z900</code> – <code>Z999</code>: eingebaute Funktionen für die Kernfunktionen (sie sind die entsprechende Z8XX +100) * <code>Z1000</code> – <code>Z2999</code>: natürliche Sprachen (Instanzen von Z60) * <code>Z3000</code> – <code>Z5999</code>: ''reserviert für die zukünftige Nutzung'' * <code>Z6000</code> – <code>Z6999</code>: ''Typen, Funktionen, ''etc.'' für das Nutzen von Inhalten von Wikidata und anderen Wikimedia-Quellen'' ** <code>Z6000</code> – <code>Z6099</code>: ''Typen für Inhalte von Wikidata und anderen Wikimedia-Quellen'' ''(Siehe [[#wikidata-types|§ Wikidata-Typen]] unten.)'' ** <code>Z6100</code> – <code>Z6199</code>: ''Prüfer für diese Typen'' ** <code>Z6200</code> – <code>Z6299</code>: ''integrierte Implementierungen der Prüfer'' ** <code>Z6800</code> – <code>Z6899</code>: ''Hilfsfunktionen für diese Typen, die integriert sein müssen (z. B. Abrufen, Gleichheit)'' ''(Siehe [[#wikidata-functions|§ Wikidata-Funktionen]] unten.)'' ** <code>Z6900</code> – <code>Z6999</code>: ''integrierte Implementierungen der Hilfsfunktionen'' * <code>Z7000</code> – <code>Z7999</code>: ''reserviert für die zukünftige Nutzung'' * <code>Z8000</code> – <code>Z8999</code>: Tester für jede vordefinierte Funktion (''z. B.'' wird Z801 über Z8010, Z8011, Z8012, … Z8019 getestet). * <code>Z9000</code> – <code>Z9999</code>: ''reserviert für die zukünftige Nutzung'' </div></div> {{Anchor|core-types}} <span id="Core_types"></span> === Kerntypen === <div style="margin:.3em 0; border:1px solid #AAA; padding:.3em .5em;"><div style="margin-top:-.3em"> * <code>Z1</code>: {{Z|Z1}} (Typ), die Wurzel. * <code>Z2</code>: {{Z|Z2}} (Typ): alles im Wiki ist ein <code>Z2</code>, darum hat es eine so niedrige ZID. * <code>Z3</code>: {{Z|Z3}} (Typ): da das Wort <bdi lang="en" dir="ltr">''key''</bdi> auf Englisch drei Buchstaben hat. * <code>Z4</code>: {{Z|Z4}} (Typ): da das Wort <bdi lang="en" dir="ltr">''type''</bdi> auf Englisch vier Buchstaben hat. * <code>Z5</code>: {{Z|Z5}} (Typ): da das Wort <bdi lang="en" dir="ltr">''error''</bdi> auf Englisch fünf Buchstaben hat. ''(Siehe [[#core-error-types|§ Kern-Fehlertypen]] unten.)'' * <code>Z6</code>: {{Z|Z6}} (Typ): da das Wort <bdi lang="en" dir="ltr">''string''</bdi> auf Englisch sechs Buchstaben hat. * <code>Z7</code>: {{Z|Z7}} (Typ): da Funktionsaufrufe die Hauptmagie des Systems sind und 7 eine magische Zahl ist. Sie ist außerdem nah an <code>Z8</code>. * <code>Z8</code>: {{Z|Z8}} (generischer Typ, also technisch gesehen eine Funktion): da <bdi lang="en" dir="ltr">''function''</bdi> auf Englisch acht Buchstaben hat. ''(Siehe [[#core-functions|§ Kernfunktionen]] unten.)'' * <code>Z9</code>: {{Z|Z9}} (Typ): da das Wort <bdi lang="en" dir="ltr">''reference''</bdi> auf Englisch neun Buchstaben hat. * <code>Z10</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z11</code>: {{Z|Z11}} (Typ): da es nur eine Sprache ist und der Name ''one'' enthält. * <code>Z12</code>: {{Z|Z12}} (Typ): da es eine Erweiterung von <code>Z11</code> ist. * <code>Z13</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z14</code>: {{Z|Z14}} (Typ): da das Wort <bdi lang="en" dir="ltr">''implementation''</bdi> auf Englisch vierzehn Buchstaben hat. * <code>Z15</code>: ''Noch nicht zugewiesen.'' * <code>Z16</code>: {{Z|Z16}} (Typ): kein guter Grund, es liegt nah an Z14 und Z61/Programmiersprache. * <code>Z17</code>: {{Z|Z17}} (Typ). * <code>Z18</code>: {{Z|Z18}} (Typ). * <code>Z19</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z20</code>: {{Z|Z20}} (Typ): da 20/20 die perfekte Vision ist und Tests Fehler sichtbar machen. * <code>Z21</code>: {{Z|Z21}} (Typ). * <code>Z22</code>: {{Z|Z22}} (Typ). * <code>Z23</code>: {{Z|Z23}} (Typ). * <code>Z24</code>: {{Z|Z24}} (Einheit). * <code>Z25</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z26</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z27</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z28</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z29</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z30</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z31</code>: {{Z|Z31}} (Typ). * <code>Z32</code>: {{Z|Z32}} (Typ): da es eine Erweiterung von <code>Z31</code> ist. * <code>Z33</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z34</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z35</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z36</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z37</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z38</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z39</code>: {{Z|Z39}} (Typ): wegen Z3/Schlüssel und Z9/Referenz. * <code>Z40</code>: {{Z|Z40}} (Typ): da Boole erstmals (18)40 publizierte. * <code>Z41</code>: {{Z|Z41}} (Boolesch). * <code>Z42</code>: {{Z|Z42}} (Boolesch). * <code>Z43</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z44</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z45</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z46</code>: {{Z|Z46}} (Typ): da es einen Z4/Typ in Code in eine Z61/Programmiersprache umwandelt. * <code>Z47</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z48</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z49</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z50</code>: {{Z|Z50}} (Typ): da Fehler <code>Z5</code> ist. <!--<nowiki> * <code>Z51</code>: <translate>'''…''' (Type).</translate> … * <code>Z59</code>: <translate>'''…''' (Type).</translate> </nowiki>--> * <code>Z60</code>: {{Z|Z60}} (Typ): da <code>Z6</code> eine Zeichenkette ist. * <code>Z61</code>: {{Z|Z61}} (Typ): da <code>Z16</code> Code ist. * <code>Z64</code>: {{Z|Z64}}: weil es das Gegenteil von <code>Z46</code> ist. <!--<nowiki> * <code>Z62</code>: <translate>'''…''' (Type).</translate> … * <code>Z79</code>: <translate>'''…''' (Type).</translate> </nowiki>--> * <code>Z80</code>: {{Z|Z80}} (Typ): da es ein Oktett ist. <!--<nowiki> * <code>Z81</code>: <translate>'''…''' (Type).</translate> … * <code>Z69</code>: <translate>'''…''' (Type).</translate> </nowiki>--> * <code>Z84</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z85</code>: {{Tunit|151|''Not yet assigned.''}} * <code>Z86</code>: {{Z|Z86}} (Typ): da es nicht genau ein Z80/Byte ist, sondern eher eine Z6/Zeichenkette. <!--<nowiki> * <code>Z87</code>: <translate>'''…''' (Type).</translate> * <code>Z88</code>: <translate>'''…''' (Type).</translate> </nowiki> --> * <code>Z89</code>: {{Z|Z89}} (Typ) * <code>Z96</code>: {{Z|Z96}} (Typ): da es eine Z9 ist, aber als Z6 * <code>Z99</code>: {{Z|Z99}} (Typ): da es ein Bisschen wie ein schließendes Anführungszeichen auf Englisch aussieht. </div></div> {{Anchor|wikidata-types}} <span id="Wikidata_types"></span> ==== Wikidata-Typen ==== <div style="margin:.3em 0; border:1px solid #AAA; padding:.3em .5em;"><div style="margin-top:-.3em"> *<code>Z6001</code>: {{Z|Z6001}} (Typ) *<code>Z6002</code>: {{Z|Z6002}} (Typ) *<code>Z6003</code>: {{Z|Z6003}} (Typ) *<code>Z6004</code>: {{Z|Z6004}} (Typ) *<code>Z6005</code>: {{Z|Z6005}} (Typ) *<code>Z6006</code>: {{Z|Z6006}} (Typ) *<code>Z6007</code>: {{Z|Z6007}} (Typ) *<code>Z6008</code>: {{Z|Z6008}} (Typ) *<code>Z6010</code>: {{Z|Z6010}} (Typ) *<code>Z6011</code>: {{Z|Z6011}} (Typ) *<code>Z6020</code>: {{Z|Z6020}} (Typ) *<code>Z6021</code>: {{Z|Z6021}} (Aussage-Untertyp) *<code>Z6022</code>: {{Z|Z6022}} (Aussage-Untertyp) *<code>Z6023</code>: {{Z|Z6023}} (Aussage-Untertyp) *<code>Z6030</code>: {{Z|Z6030}} (Typ) *<code>Z6031</code>: {{Z|Z6031}} (Entitätsteil) *<code>Z6032</code>: {{Z|Z6032}} (Entitätsteil) *<code>Z6033</code>: {{Z|Z6033}} (Entitätsteil) *<code>Z6034</code>: {{Z|Z6034}} (Entitätsteil) *<code>Z6035</code>: {{Z|Z6035}} (Entitätsteil) *<code>Z6036</code>: {{Z|Z6036}} (Entitätsteil) *<code>Z6037</code>: {{Z|Z6037}} (Entitätsteil) *<code>Z6038</code>: {{Z|Z6038}} (Entitätsteil) *<code>Z6040</code>: {{Z|Z6040}} (Typ) *<code>Z6041</code>: {{Z|Z6041}} (Aussagerang) *<code>Z6042</code>: {{Z|Z6042}} (Aussagerang) *<code>Z6043</code>: {{Z|Z6043}} (Aussagerang) *<code>Z6060</code>: {{Z|Z6060}} (Typ) *<code>Z6061</code>: {{Z|Z6061}} (Typ) *<code>Z6062</code>: {{Z|Z6062}} (Typ) *<code>Z6063</code>: {{Z|Z6063}} (Typ) *<code>Z6064</code>: {{Z|Z6064}} (Typ) *<code>Z6091</code>: {{Z|Z6091}} (Typ) *<code>Z6092</code>: {{Z|Z6092}} (Typ) *<code>Z6094</code>: {{Z|Z6094}} (Typ) *<code>Z6095</code>: {{Z|Z6095}} (Typ) *<code>Z6096</code>: {{Z|Z6096}} (Typ) </div></div> {{Anchor|core-functions}} <span id="Core_functions"></span> === Kernfunktionen === <div style="margin:.3em 0; border:1px solid #AAA; padding:.3em .5em;"><div style="margin-top:-.3em"> * <code>Z801</code> {{Z+|Z801}}: T ➝ T * <code>Z802</code> {{Z+|Z802}}: Boolean, T, T ➝ T * <code>Z803</code> {{Z+|Z803}}: Key reference, Any ➝ Any *: Z3/Schlüssel * <code>Z804</code> {{Z+|Z804}}: List(Key reference) ➝ Abt * <code>Z805</code> {{Z+|Z805}}: Any ➝ List(Pair(Key reference, Any)) *: Reify hat fünf Buchstaben * <code>Z808</code> {{Z+|Z808}}: List(Pair(Key reference, Any)) ➝ Any *: Abstract hat acht Buchstaben. * <code>Z810</code> {{Z+|Z810}}: T, List(T) ➝ List(T) *: (da Z10 Liste ist). * <code>Z811</code> {{Z+|Z811}}: List(T) ➝ T *: (da Z10 Liste sein sollte und wir das erste erhalten) * <code>Z812</code> {{Z+|Z812}}: List(T) ➝ List(T) *: (da Z10 Liste sein sollte und wir das zweite, den Rest, erhalten) * <code>Z813</code> {{Z+|Z813}}: List(T) ➝ Boolean *: (da Z13 als leere Liste geplant war). * <code>Z820</code> {{Z+|Z820}}: String, Any ➝ Any * <code>Z821</code> {{Z+|Z821}}: Pair(T1, T2) ➝ T1 *: (da Z22 Paar ist). * <code>Z822</code> {{Z+|Z822}}: Pair(T1, T2) ➝ T2 *: (da Z22 Paar ist). * <code>Z823</code> {{Z+|Z823}}: Quote ➝ Pair(Object, Object) * <code>Z825</code> {{Z+|Z825}}: Item reference, Natural language, Gregorian calendar date ➝ HTML fragment * <code>Z828</code> {{Z+|Z828}}: Quote ➝ Persistent object * <code>Z832</code> {{Z+|Z832}}: Monolingual stringset, Monolingual stringset ➝ Boolean * <code>Z844</code> {{Z+|Z844}}: Boolean, Boolean ➝ Boolean * <code>Z850</code> {{Z+|Z850}}: Object, Error type, Object ➝ Object *: (da es mit Z5/Fehlern umgeht) * <code>Z851</code> {{Z+|Z851}}: Error type, List(T) ➝ Unit * <code>Z852</code> {{Z+|Z852}}: Error, Error type ➝ Boolean * <code>Z853</code> {{Z+|Z853}}: Object ➝ Pair(Error, Object) * <code>Z854</code> {{Z+|Z854}}: Object ➝ String * <code>Z860</code> {{Z+|Z860}}: String ➝ Language * <code>Z862</code> {{Z+|Z862}}: Natural language, Natural language ➝ Boolean * <code>Z866</code> {{Z+|Z866}}: String, String ➝ Boolean * <code>Z868</code> Ersetzt durch {{Z+|Z22717}}: String ➝ List(Character) *: Wegen Z6/Zeichenkette und Z86/Zeichen. * <code>Z869</code> {{Z+|Z869}}: String ➝ Wikifunctions Object Reference * <code>Z872</code> {{Z+|Z872}}: Function, Typed list (Object) ➝ Object * <code>Z873</code> {{Z+|Z873}} Function, List ➝ List * <code>Z876</code> {{Z+|Z876}}: Function, List, Object ➝ Object * <code>Z877</code> {{Z+|Z877}}: HTML fragment -> HTML fragment * <code>Z881</code> {{Z+|Z881}}: Type ➝ Type * <code>Z882</code> {{Z+|Z882}}: Type, Type ➝ Type * <code>Z883</code> {{Z+|Z883}}: T ➝ T * <code>Z884</code> {{Z+|Z884}}: Type, List(Reference), String ➝ Type * <code>Z885</code> {{Z+|Z885}}: Error type ➝ Type * <code>Z886</code> Ersetzt durch {{Z+|Z22693}}: List*(Character) ➝ String *: Wegen Z86/Zeichen und Z6/Zeichenkette. * <code>Z888</code> Ersetzt durch {{Z+|Z22683}}: Character, Character ➝ Boolean * <code>Z889</code> {{Z+|Z889}}: Typed list (Object), Typed list (Object), Function ➝ Boolean * <code>Z899</code> {{Z+|Z899}}: Quote ➝ Any *: Wegen Z99/Zitat. </div></div> {{Anchor|wikidata-functions}} <span id="Wikidata_functions"></span> ==== Wikidata-Funktionen ==== <div style="margin:.3em 0; border:1px solid #AAA; padding:.3em .5em;"><div style="margin-top:-.3em"> *<code>Z6801</code> bis <code>Z6808</code> sind die Funktionen für 'gleiches Objekt', die <code>Z6001</code> bis <code>Z6008</code> entsprechen. *<code>Z6820</code> {{Z+|Z6820}}: List(Object) ➝ Map(String, Object) *<code>Z6821</code> {{Z+|Z6821}}: Item reference ➝ Item *<code>Z6822</code> {{Z+|Z6822}}: Property reference ➝ Property *<code>Z6824</code> {{Z+|Z6824}}: Lexeme form reference ➝ Lexeme form *<code>Z6825</code> {{Z+|Z6825}}: Lexeme reference ➝ Lexeme *<code>Z6826</code> {{Z+|Z6826}}: Lexeme sense reference ➝ Lexeme sense *<code>Z6830</code> {{Z+|Z6830}}: Item reference, Property reference, Natural language ➝ List(Lexeme reference) *<code>Z6831</code> {{Z+|Z6831}}: Lexeme sense reference, Property reference, Natural language ➝ List(Lexeme reference) *<code>Z6839</code> {{Z+|Z6839}}: Wikidata Item reference, Typed List(String), Typed List(Natural language) ➝ Typed List(Wikidata sitelink) *<code>Z6884</code> {{Z+|Z6884}}: Type, List(Object), String ➝ Type *<code>Z6894</code> {{Z+|Z6894}} *<code>Z6895</code> {{Z+|Z6895}}: Object ➝ Object *<code>Z6896</code> {{Z+|Z6896}}: List(String) ➝ Object </div></div> {{Anchor|core-error-types}} <span id="Core_error_types"></span> === Kern-Fehlertypen === <div style="margin:.3em 0; border:1px solid #AAA; padding:.3em .5em;"><div style="margin-top:-.3em"> * {{Z|Z500}} (Fehlerinformation): unspezifizierter Fehler * {{Z|Z501}} (Fehlermeldung, Eingabe): Syntaxfehler * {{Z|Z502}} (Untertyp, Wert): nicht wohlgeformt, verweist auf Z52X oder Z53X * {{Z|Z503}} (Funktionsname): noch nicht implementiert * {{Z|Z504}} (ZID): ZID nicht gefunden * {{Z|Z505}} (erwartet, tatsächlich, Argumente): Anzahl der Argumente stimmt nicht überein * {{Z|Z506}} (erwartet, tatsächlich, Argumente): Argumenttyp stimmt nicht überein * {{Z|Z507}} (Funktionsaufruf): Fehler in der Auswertung * {{Z|Z508}} (Objekt): konkurrierende Schlüssel * {{Z|Z509}} (Fehler): Liste von Fehlern * {{Z|Z510}} (keine): null * {{Z|Z511}} (Schlüsselreferenz, Objekt): Schlüssel nicht gefunden * {{Z|Z512}} (Objekt): Fehler Z9 * {{Z|Z513}} (aufgelöstes Objekt): aufgelöstes Objekt ohne Z2K2 * {{Z|Z514}} (Implementierung): eingebaute Funktion existiert nicht * {{Z|Z515}} (Implementierung): eingebaute ID ist fehlerhaft * {{Z|Z516}} (Schlüssel, schlechter Wert): Fehler beim Argumentwert * {{Z|Z517}} (erwarteter Typ, tatsächlicher Typ, zurückgegebener Wert, weitergegebener Fehler): zurückgegebener Wert stimmt nicht überein * {{Z|Z518}} (erwarteter Typ, Objekt, weitergegebener Fehler): Objekttyp stimmt nicht überein * {{Z|Z519}} (Objekt): undefinierter Listentyp * {{Z|Z520}} (Objekt): falscher Listentyp * {{Z|Z521}} (verletzender Wert): ZObjekte dürfen keine Zahl, boolesch oder null sein * {{Z|Z522}} (verletzender Index im Array, verbreiteter Fehler): Array-Element nicht wohlgeformt * {{Z|Z523}} (Objekt): Fehlende Z1K1 * {{Z|Z524}} (Wert von Z1K1): Z1K1 darf keine Zeichenkette und kein Array sein * {{Z|Z525}} (Schlüssel): Ungültiger Schlüssel * {{Z|Z526}} (Schlüssel, verbreiteter Fehler): nicht wohlgeformter Wert] * {{Z|Z529}} (Host-Name) * {{Z|Z530}} (Funktionsaufruf, propagierter Fehler) * {{Z|Z531}} (ganzes Objekt): Z6 muss zwei Schlüssel haben * {{Z|Z532}} (ganzes Objekt): Z6 ohne Z6K1 * {{Z|Z533}} (Wert von Z6K1): Z6K1 muss eine Zeichenkette sein * {{Z|Z534}} (ganzes Objekt): Z9 muss zwei Schlüssel haben * {{Z|Z535}} (ganzes Objekt): Z9 ohne Z9K1 * {{Z|Z536}} (Wert von Z9K1): Z9K1 muss eine Zeichenkette in JSON sein * {{Z|Z537}} (Wert von Z9K1): Z9K1 muss wie eine Referenz aussehen * {{Z|Z538}} (Seitentitel): falscher Namensraum * {{Z|Z539}} (Seitentitel): falscher Inhaltstyp * {{Z|Z540}} (Sprachcode): ungültiger Sprachcode * {{Z|Z541}} (Sprachcode): Sprachcode nicht gefunden * {{Z|Z542}} (erwarteter Typ, tatsächliches Objekt): erwarteter Typ, tatsächliches Objekt * {{Z|Z543}} (Typenname): Typ nicht gefunden * {{Z|Z544}} (Typen-ZID, Typenname, vorhandener Typenname): widersprüchliche Typennamen * {{Z|Z545}} (Typen-ZID, Typenname, vorhandene Typen-ZID): widersprüchliche Typen-ZIDs * {{Z|Z546}} (Typen-ZID, Typenname): eingebauter Typ nicht gefunden * {{Z|Z547}} (Eingabe): ungültiges Format * {{Z|Z548}} (Fehlermeldung, Eingabe): ungültiges JSON * {{Z|Z549}} (Referenzwert): ungültige ZReferenz * {{Z|Z550}} (Referenzwert): unbekannte ZReferenz * {{Z|Z551}} (Schlüssel, erwarteter Typ, tatsächlicher Typ): Schematyp stimmt nicht überein * {{Z|Z552}} (Index, erwarteter Typ, tatsächlicher Typ): Typ des Array-Elements stimmt nicht überein * {{Z|Z553}} (ZObjekt): nicht erlaubter Wurzeltyp * {{Z|Z554}} (kollidierende ZID): Bezeichnung kollidiert mit der Bezeichnung eines anderen ZObjektes * {{Z|Z555}} (ZID, Titel): ZID und Seitentitel stimmen nicht überein * {{Z|Z556}} (Titel): ungültiger Seitentitel * {{Z|Z557}} (Fehlermeldung): Benutzer hat nicht die Berechtigung * {{Z|Z558}} (Programmiersprache): ungültige Programmiersprache * {{Z|Z559}} (keine): Benutzer darf Funktionen nicht auswerten * {{Z|Z560}} (Auswertungsergebnis): ungültiges Auswertungsergebnis * {{Z|Z561}} (weitergegebener Fehler): ungültige Auswertungsanfrage * {{Z|Z562}} (fehlende Eigenschaft): unvollständige Auswertungsanfrage * {{Z|Z563}} (Aufruf): Aufruf durch nicht wiedereintretenden Ausführer * {{Z|Z564}} (Inhalte): ungültige Ausführerantwort * {{Z|Z565}} (fehlende Eigenschaft): unvollständige Ausführeranfrage * {{Z|Z570}} (Beschränkungslimit des Orchestrierers): Beschränkungslimit des Orchestrierers erreicht * {{Z|Z571}} (Beschränkungslimit des Auswerters): Beschränkungslimit des Auswerters erreicht * {{Z|Z572}} (Rekursionslimit, Funktionsname): Rekursionslimit im Orchestrierer erreicht * {{Z|Z573}} (Rekursionslimit, Funktionsname): Rekursionslimit im Auswerter erreicht * {{Z|Z574}} (Zeitlimit): Zeitlimit im Orchestrierer erreicht * {{Z|Z575}} (Zeitlimit): Zeitlimit im Auswerter erreicht * {{Z|Z576}} (Zeitlimit) * {{Z|Z580}} (doppelte Sprache) </div></div> <span id="See_also"></span> == Siehe auch == * [[:m:Special:MyLanguage/Abstract Wikipedia/Notes|Übersicht der Anmerkungen]] <noinclude> [[Category:Technical documentation{{#translation:}}|Reserved ZIDs]] </noinclude> fkj6yxhv69jl16hjil4p3gznrff8nrp Wikifunctions:How to create implementations/en 4 8925 331110 296938 2026-10-23T08:23:19Z FuzzyBot 207 Updating to match new version of source page 331110 wikitext text/x-wiki <languages/> This page provides a more detailed guide to '''creating implementations''', beyond the overview at {{ll|Wikifunctions:Introduction}}. == Types of Implementations == In Wikifunctions, an '''implementation''' can take one of two main forms: '''code''' or '''composition'''. A code implementation directly expresses the function’s logic in any of the available programming languages (currently, Python3 or JavaScript). It’s most useful when the function’s behavior can’t easily be built from existing Wikifunctions, or when precise control over data processing is needed. A composition implementation, on the other hand, defines the function entirely by combining other existing functions, without writing code. Compositions are easier to understand, reuse, and translate into other languages automatically, but they depend on suitable building blocks already being available and often are less performant. In general, start by checking whether your goal can be achieved through composition; if it can’t, or if performance or fine-grained logic matters, choose a code implementation instead. There's a third type of implementation: '''built-ins'''. These are run by system-built code, and are not editable. Most likely all pre-defined functions will have a built-in implementation. In such cases, when opening the implementation page, you will see a message stating ''"{{int|wikilambda-implementation-selector-none}}"'' == Practice Test-Driven Development == '''Test-Driven Development''', or '''TDD''', is a way of creating software where you write tests before you write the actual code. Tests are just a way of understanding what your function is supposed to do by listing examples and how they should work. In Wikifunctions, writing tests first offers significant benefits. If you are working on an implementation, you can run your code against the existing tests to check that it behaves as expected. This makes it easier to catch errors early before even publishing your implementation. Tests are also a powerful way to describe the function you need. By writing tests, '''you clearly communicate the expected behavior''', and the community can step in and help with the implementation, or create alternative implementations. Imagine you want to implement a Function that combines two strings with a space in between. A basic test for this might look like: <syntaxhighlight lang="prolog"> join_with_space( "Hello", "world" ) => "Hello world" </syntaxhighlight> Once you have defined the basic behavior, it's important to '''think about edge cases'''—situations where the inputs are such that you might need some special behavior. For example, what if your first string ends in a space, or your second string starts with a space? Should the function keep all existing spaces and add another one, or should it return a neatly spaced result with just a single space between the words? Depending on your requirements, you should build a test for such a case. For example, a test for this edge case could be either one of these — but not both!: <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> or ... <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> Make sure that all possible special cases are covered by your tests, and once you have them, make sure that they are all connected to the Function by selecting them and clicking "Connect". == Code implementations == [[File:Code implementation.png|thumb|alt=Wikifunctions code editor initialized with a function template|When adding a new code implementation, the function template is initialized with the function and argument names]] When creating an implementation using code, the Wikifunctions UI will set up a code editor with the selected language activated for syntax highlighting and validation. When the function to implement and the programming language are selected, this editor will be set with the correct function template: '''do not remove or edit this'''! Keep your code inside this function signature: if you need auxiliary functions, you can simply declare them inside your top-level function declaration. === Using input types in your code === Wikifunctions types {{Z|Z6}} and {{Z|Z40}} can be used as if they were native types in both JavaScript and Python3. For example, a String input can be concatenated or a Boolean be directly used in a logical expression. To use other types in your code implementations, you will have to look deeper into the type, figure out if it has a conversion to a native equivalent, and treat it accordingly. For example, let's say we want to write some Python code that handles an input of type {{Z|Z20420}}. In the page for this type, let's look at its "type converters to code" and search for a Python one. The converter {{Z|Z20424}} will be applied to our date input before our code, so looking at "native type" we know that our input will be a Python ''dict'' and looking at the implementation we can see the keys we can expect: <syntaxhighlight lang="python3"> return { 'K1': year, 'K2': month, 'K3': day } </syntaxhighlight> When a type doesn't have a converter, you'll have to access its parts directly using its keys. For example, let's assume that your function <code>Z30000</code> has one input <code>Z30000K1</code> of type {{Z|Z11}}. This type has two keys: <code>Z11K1</code> for the language (itself an object of type {{Z|Z60}}), and <code>Z11K2</code> for the string value. Similarly, the language object has a key <code>Z60K1</code> for the language code. So, to get a string with the language code and the text, you can write: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1 ) { // e.g. "en: some text" return Z30000K1.Z11K1.Z60K1 + ": " + Z30000K1.Z11K2; } </syntaxhighlight> For a quick reference of the available type conversions visit [[Special:MyLanguage/Wikifunctions:Execution targets#Default type conversion|the default type conversion table]]. === Returning the right outputs === Similarly to the way you treat inputs, outputs need to match the type specified in the function definition. Some can be treated as simply as native types, so any string output will be converted into a Wikifunctions {{Z|Z6}} object and any native boolean returned by your implementation will be converted into a Wikifunctions {{Z|Z40}} object. Those types that have "type converters from code" will apply the appropriate function to the output, in order to build the required type. Following the example of {{Z|Z20420}}, the {{Z|Z20443}} will transform the output from your implementation–a dict with K1, K2 and K3 keys–into its correct ZObject representation. For types that don't have converters from code, you can carefully build and return the output objects. For example, imagine that our function <code>Z30000</code> takes two string inputs: language code and text, and should return a {{Z|Z11}} object. You can do this in Python by using the <code>ZObject</code> constructor: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): lang_object = ZObject( {"Z1K1": "Z9", "Z9K1": "Z60"}, Z60K1 = Z30000K1 ) return ZObject( {"Z1K1": "Z9", "Z9K1": "Z11"}, Z11K1 = lang_object, Z11K2 = Z30000K2 ) </syntaxhighlight> Or in JavaScript: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { const langObject = new ZObject( new Map( [ [ "Z60K1", Z30000K1 ] ] ), { "Z1K1": "Z9", "Z9K1": "Z60" } ); const monolingualKeys = new Map( [ [ "Z11K1", langObject ], [ "Z11K2", Z30000K2 ] ] ); return new ZObject( monolingualKeys, { "Z1K1": "Z9", "Z9K1": "Z11" } ); } </syntaxhighlight> You can learn more about the <code>ZObject</code> class and other useful constructors in {{ll|Wikifunctions:Execution_targets#Custom_and_non-built-in_type_conversion}} {{phab|T392750}}As of 2026-05, trying to return a list of lists may fail, so you're not able to implement such functions in code. === Code in Python === In this section, we give a concrete example on how to create an implementation in the form of Code in Python. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is Z30000. The implementation is defined using the ZID of the function. So are the arguments of the function. So in the case of the function Z30000 with its two arguments, the function template should look like this: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): </syntaxhighlight> As we described before, we know that the arguments (<code>Z30000K1</code> and <code>Z30000K2</code>) are Strings, so we can treat them as simply as we use native strings in Python. Also, the function should return a String. For our example, we simply return the two arguments concatenated with a space in between: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): return Z30000K1 + " " + Z30000K2 </syntaxhighlight> Since this is Python, do not forget to indent this line. If you have followed our advice to [[#Practice Test-Driven Development|practice TDD]], you will already have a set of tests that you know should work. If that's the case, while building your implementation you can click on the circular arrow in the Tests panel, and see if your implementation passes all of them. Remember that the runtime has no state. Don’t assume values for global or static variables. If you have further questions about what you can and cannot do in Python, ask on [[Wikifunctions:Python implementations]]. === Code in JavaScript === In this section, we give a concrete example on how to create an implementation in the form of Code in JavaScript. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is <code>Z30000</code>. The implementation is defined using the ZID of the function. So are the arguments of the function. So in the case of the function <code>Z30000</code> with its two arguments, the function template should look like this: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { } </syntaxhighlight> We know that the arguments (<code>Z30000K1</code> and <code>Z30000K2</code>) are Strings, so we can treat them as native strings in JavaScript. Also, the function should return a String. To complete our function, you can then add a line concatenating the input strings, like this: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> If you have tests as recommended in the [[#Practice Test-Driven Development|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes all of them. Remember that the runtime has no state. Don’t assume values for global or static variables. If you have further questions about what you can and cannot do in JavaScript, ask on [[Wikifunctions:JavaScript implementations]]. === Calling another Wikifunctions function === A code implementation can call certain other Wikifunctions functions, receive the output of the call, and use that output in further processing. We refer to such calls as callbacks. At present, due to security and performance concerns, only the following built-in Wikidata fetch and search functions can be called in this way: {{Z|Z6820}}, {{Z|Z6821}}, {{Z|Z6822}}, {{Z|Z6824}}, {{Z|Z6825}}, {{Z|Z6826}}, {{Z|Z6830}}, and {{Z|Z6831}}. This capability is in an initial stage of deployment; we hope to allow calls to a broader range of functions in the future. Let’s look at a JavaScript implementation containing a callback. This implementation fetches an item from Wikidata, extracts the label of that item in a given language, and returns the label string. The item to fetch is given by argument <code>Z400K1</code>, and the language is given by <code>Z400K2</code>. <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const item = Wikifunctions.Call('Z6821', Z400K1); for (const label of item.Z6001K2.Z12K1) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> A callback is made by calling <code>Wikifunctions.Call</code>, as shown in the example. The first argument to <code>Wikifunctions.Call</code> is always the ZID of the function to be called – in this case, {{Z|Z6821}}, which takes a single argument. Following that, the arguments to be passed to that function are listed, separated by commas. Here, that argument, <code>Z400K1</code>, is the same value that was passed to the function <code>Z400</code>. This is a common pattern of argument passing to callbacks, but their arguments can also be built using the <code>ZObject</code> constructor (as explained above), or obtained in other ways. The value of <code>Z400K1</code> would be an instance of {{Z|Z6091}}, containing the QID of the item to be fetched. Line 2 of the example calls <code>Z6821</code> to fetch that item from Wikidata and assigns the resulting ZObject to the const <code>item</code>. The remaining code iterates over the item’s labels until it finds the one matching the language given by <code>Z400K2</code>. For the first example above, we have used <code>Z6821</code> for simplicity. However - unless an entire entity is needed by the implementation, it is strongly recommended to use <code>Z6820</code> to retrieve Wikidata items, which can be quite large. Although a call to <code>Z6820</code> is a bit more complex, its parameters allow for fetching selected portions of a Wikidata item, which can greatly improve performance and avoid some errors, by reducing the network bandwidth and processing time that are needed. (<code>Z6820</code> can also be used in place of <code>Z6822</code>, <code>Z6824</code>, <code>Z6825</code>, and <code>Z6826</code>, to get similar bandwidth-reduction benefits.) Just below we show how <code>Z6820</code> can be used, in <code>Wikifunctions.Call</code>, to implement the same behavior as above. Note that we use the second argument passed to <code>Z6820</code>, <code>[labelsPart]</code>, to say “Just return the item’s labels”, and we use the third argument, <code>[Z400K2]</code>, to say “Just return labels in the given language”. (This argument would also apply to aliases and descriptions, if they were included in the result.) <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const labelsPart = new ZObject( new Map( [ ['Z6030K1', new ZReference('Z6033')] ] ), {Z1K1: 'Z9', Z9K1: 'Z6030'} ); const entities = Wikifunctions.Call( 'Z6820', [Z400K1], [labelsPart], [Z400K2], []); const item = entities.get(Z400K1.Z6091K1); const labels = item.Z6001K2.Z12K1; for (const label of labels) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> Other things to note: * Even though code implementations are now able to fetch Wikidata entities, it is recommended that they not be written to return ''entire'' entities. This is because of current limitations on the size of the value returned from a code implementation. To fetch and return an entire large entity, it’s better to call the fetch function from a composition. * Only one callback can execute at a time. For security reasons, it is not possible to use the concurrency features of JavaScript or Python to execute multiple callbacks in parallel. ** Keep in mind, however, that you can fetch multiple entities at once using Z6820. * There is currently a 3 MiB limit on the size of Wikidata content that can be returned to a code implementation, by a single callback. The same limit applies to the size of the result returned from a code implementation. == Compositions == In this section, we give a concrete example on how to create an implementation in the form of a composition. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is <code>Z30000</code>. It is usually a good idea to first think about how to combine existing functions in order to create the desired output. Sometimes this might be trivial, and you can just go ahead with composing functions, but in many cases it is worthwhile to note the desired composition down. For example, for the given Function, we could use the existing Function {{Z|Z10000}}. That Function takes two strings and makes one string out of them. But we need to add a space in between. So we first concatenate a space to the end of the first string, and then concatenate the second string to the result of that first concatenation. So our composition could be noted down like this: <syntaxhighlight lang="prolog"> join_strings( join_strings( Z30000K1, " " ), Z30000K2 ) </syntaxhighlight> There are multiple ways to write a composition: notice that the same thing could be accomplished with: <syntaxhighlight lang="prolog"> join_strings( Z30000K1, join_strings( " ", Z30000K2 ) ) </syntaxhighlight> An alternative implementation could also use the existing Function {{Z|Z15175}}, so your composition could be: <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> As you can see, there are multiple ways to accomplish this, so take your time and explore the existing functions available in the {{ll|Wikifunctions:Catalogue}}. Let's try to create the second example, <code>join_strings(Z30000K1, join_strings(" ", Z30000K2))</code>. In order to create this: # Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page. # Make sure that the option "composition" under "Implementation" is selected. # Click on the "›" icon or click the "Select Function" link to expand the function details. # Under "function" search for the name of the outermost function you want to use, which in this example is "join two strings". Then, select the wanted function from the dropdown list. # You will see two new fields, one for each of the arguments needed for the selected function. # For the first argument, we want to select the first input to our function: ## Next to "first string", click on the "…" button and select "Argument reference". ## Under "key id" you can now select the first string of your function from the dropdown, which contains all available inputs. # For the second argument, we want to use the result of another call to "join two strings": ## Next to "second string", click on the "…" button and select "Function call". ## Under "function", search and select the function you want to call, which is again "join two strings". ## For this inner function call, configure the "first string" by simply typing a white space in the text field, and configure the "second string" as you did for step 6: change it using the "…" button to "Argument reference", and then select the second argument in the dropdown. Your composition is now complete! You can expand and collapse the details using the chevron buttons to see how it looks. If you already have Tests as recommended in the [[#Practice Test-Driven Development|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes the tests. Once your composition passes the tests, go ahead and publish it. [[File:Composition implementation expanded.png|frame|center|alt=A Wikifunctions composition implementation in its expanded view|A Wikifunctions composition implementation in its expanded view]] [[File:Composition implementation collapsed.png|frame|center|alt=A Wikifunctions composition implementation in its collapsed view|A Wikifunctions composition implementation in its collapsed view]] == Wikifunctions error handling == As a Wikifunctions function creator, you might want to warn the user calling your function when something goes wrong in the code, or when their inputs do not fit a certain criteria. For example, if your Function expects a string input to contain a name, you might want to check that the name is not empty and, if it is, show an error message that the person using your Function can understand. For this purpose, you can use <code>Wikifunctions.Error()</code> from your code implementations or the function {{Z|Z851}} from your compositions. In this section you will learn: * How to throw errors from both code and composition implementations, * how to write tests for error cases, and * how to catch and handle errors thrown by functions that you are using in your compositions. === Throwing errors from code implementations === When writing code, both from JavaScript and Python, you can use <code>Wikifunctions.Error()</code> to end the execution with a wanted error. <code>Wikifunctions.Error()</code> has two parameters: # Error type: a string containing the ZID of the error type you want to return. # Error arguments: a list of string arguments to build the error. Let's go one by one: ==== Error type ==== An error type is an object that describes a kind of error that could happen in the system. There are a number of built-in error types but you can also build other error types that are more suited to your use case. When using errors, the best idea is to browse through the available error types, which can be explored in [[Special:ListObjectsByType/Z50|this list]]. If there are no errors that fit your case, create a new one by going to the create page, and selecting "Error type" in the type selector. Then, set the necessary fields: [[File:Error type.png|thumb|alt=Error type creation in Wikifunctions|To create new Error type (Z50), edit the label and add the necessary keys.]] * '''Label''' – This is the main title of the error, which should contain a short but descriptive message. Set the error label on the right-side box titled "About". * '''Keys''' – Keys contain additional information about what caused the error. For example, if an input had the wrong format, you might want to inform the user of what was the input content when raising the error. To use them in your implementations, keys should be strings. To create a key, click on the "[+]" icon below "keys", select "String" under "value type", and add a label that describes it appropriately, for example "current input". Once you have all the necessary keys, you can Publish your error type and keep the ID of the newly created object. * '''Error message''' – Error types can contain a multilingual array of HTML parametrized error messages. The parameter notation is $1, $2, etc., where the digit corresponds to the error type key. For example, when creating an error type with one string key "current input", the error message can use the positional parameter "$1", which will be replaced with the value of the "current input" key at the time of rendering the error. To add HTML messages, click on the "[+]" icon below "html fragments", select a language and input the HTML string. ==== Error arguments ==== Error arguments correspond to the keys of the Error type, and they should provide additional information to understand the error. Error arguments should always be Strings. ==== Using Wikifunctions.Error() ==== Say that you want an error to be thrown when either your first or your second input are empty. You have already created the error type, and the assigned ZID was <code>Z30005</code>. Your error type has two string keys: * Input key: contains the key of the failing input * Input value: contains the current value of the failing input To raise an error in your JavaScript implementation you should do something like this: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { // If the first input is empty, raise error Z30005 // with two string args: [ first input key, first input value ] Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { // If the second input is empty, raise error Z30005 // with two string args: [ second input key, second input value ] Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> To raise an error in your Python implementation you should do something like this: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": # If the first input is empty, raise error Z30005 # with two string args: [ first input key, first input value ] Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": # If the second input is empty, raise error Z30005 # with two string args: [ first input key, first input value ] Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> Remember that calling <code>Wikifunctions.Error()</code> ends the execution! === Throwing errors from compositions === If you are creating a composition implementation, you can throw an error by calling the special function {{Z|Z851}}. ==== Throw Error function (Z851) ==== The {{Z|Z851}} function is similar to the <code>Wikifunctions.Error()</code> method and takes two arguments: * '''Error type''' – A reference to the Error type you want to raise * '''Error parameters''' – A list with the arguments to create your Error, which should also be Strings. ==== Using Throw Error ==== Say you want to modify your composition so that it first checks that the arguments are not empty, and raises an error when it finds an empty one. Then, if none of them are empty, it runs the original composition, which is: <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> To do this, you need to create conditional paths, for which you can use the {{Z|Z802}} function. Think of it like this: * If the first argument is empty, throw an error for the first argument * Else, proceed to check the second argument * If the second argument is empty, throw an error for the second argument * Else, proceed with the success path and return the joint strings with the space separator Or in functional pseudo code: <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), throw_error( Z30005, [ "Z30000K1", Z30000K1 ] ), if( is_empty_string( Z30000K2 ), throw_error( Z30005, [ "Z30000K2", Z30000K2 ] ), join_with_separator( Z30000K1, Z30000K2, " " ) ) ) </syntaxhighlight> Let's create this step by step: # Start adding an implementation by clicking on the "+” button in the "Implementations" table from your Function page. # Make sure that the option "composition" under "Implementation" is selected. # Click on the "›” icon or click the "Select Function" link to expand the function details. # Under "function" search and select the outermost function you want to use, which in this case is "if". # Check the validity of the first argument: ## Next to "condition", click on the "…" button and select "function call" ## Under "function", search and select the function "is empty string" ## Next to "input", click on the "…" button and select "argument reference" ## Under "key id", select the first input (e.g. "first string") ## You can now collapse the "condition" function call if you want, by clicking on the down-chevron next to "condition". You should see something like "f(x) is empty string( → first string )" # Throw error if the condition is true: ## Next to "then", click on the "…" button and select "function call" ## Under "function", search and select the function "Throw Error" ## Under "error type", search and select your error type (you can directly input the error ID if you know it, e.g. Z30005) ## Under "error parameters", add two items by clicking on the "+" button ## For "Item 1" (offending argument key), set its type to "String" and write the argument identifier (e.g. "first input", or "Z30000K1") ## For "Item 2" (offending argument value), click on the "…" next to "Item 2" and select "argument reference" ## Under "key id", select the first input (e.g. "first string") ## You can now collapse the "then" function call if you want, by clicking on the down-chevron next to "then". You should see something like "f(x) Throw Error( Input was the wrong format, Typed list( Object, "first input", → first string ) )" # Continue to check the second argument if the first was good: ## Next to "else", click on the "…" button and select "function call" ## Under "function", search and select the function "if" ## Set up "condition" to check the validity of the second argument by following the same process as described in step 5. ## Set up "then" to throw an error for the second argument by following the same process as described in step 6. # Finally, set up the success path: ## Next to the nested "else", click on the "…" button and select "function call" ## Under "function", search and select the successful function, which in this case can be "join strings with separator" ## Next to "first string", click on the "…" button and set it to "argument reference", then select "first string" ## Next to "second string", click on the "…" button and set it to "argument reference", then select "second string" ## Under "separator" add a space into the text field The resulting function call should look like this: [[File:Throw error expanded.png|frame|center|alt=Wikifunctions composition using Throw Error function|Wikifunctions composition using Throw Error function]] [[File:Throw error collapsed.png|frame|center|alt=Wikifunctions composition using Throw Error function, in its collapsed view|Wikifunctions composition using Throw Error function, in its collapsed view]] === Handling errors in compositions === While it is useful to allow functions to raise expected errors, it is crucial to be able to handle errors in your compositions in order to safely use these functions. Say you want to create a new function "full name of a person" – we will refer to it with the ZID <code>Z30010</code>. This function should return the full name of a person given a first and last names, but if any of the two fields are empty, it should return the text "Unknown" instead. You could create a composition using our example function "Join two strings with a space" or <code>Z30000</code> to generate the name. If any of the inputs are empty, you know that <code>Z30000</code> will throw an error of type <code>Z30005</code>. Using the function {{Z|Z850}} as a wrapper, you can attempt the join operation and intercept a possible error to simply return "Unknown" whenever it occurs. ==== Try-Catch function (Z850) ==== The {{Z|Z850}} function is built-in with ZID <code>Z850</code> and takes three arguments: * '''Function call''' – The initial function call to run. If nothing goes wrong, the response will be the result of this function call. * '''Error type''' – An error type to catch in case it is thrown during the execution of the first function call. * '''Error handler''' – A function call that will be run in case the error specified above is caught during the execution of the initial function call. If that happens, the result of the error handler will be the value returned. ==== Using Try-Catch ==== Once we have all the functions for our composition, we can craft it like this: <syntaxhighlight lang="prolog"> try_catch( join_with_space( Z30010K1, Z30010K2 ), Z30005, echo( "Unknown" ) ) </syntaxhighlight> This means that: * The "Join two strings with a space" function will be tried with the two inputs and, if everything goes well, the output of this function will be returned * If any of the inputs are blank, "Join two strings with a space" with raise an error of type <code>Z30005</code> * Our {{Z|Z850}} will then detect this error and run the {{Z|Z801}} function to return "Unknown" Let's create this step by step: # Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page. # Make sure that the option "composition" under "Implementation" is selected. # Click on the "›” icon or click the "Select Function" link to expand the function details. # Under "function" search and select the outermost function you want to use, which in this case is "Try-Catch". # Set the main function call: ## Under the field where the "Try-Catch" function is selected, next to the "function call" key, click on the "…" button and select "function call" ## Under "function" search and select the function "join two strings with space" ## Next to "first string", click on the "…" button and select "argument reference", then select the "first name" argument from the dropdown. ## Next to "second string", click on the "…" button and select "argument reference", then select the "second name" argument from the dropdown. # Select the error to catch: ## Under "error type", search and select "bad string input" – you can search directly by its ZID <code>Z30005</code> # Set the error handler function call: ## Next to "error handler", click on the "…" button and select "function call" ## Under "function", search and select the function "echo" ## Under "input" and "type", search and select the type "String" ## Now, under "input", type "Unknown" in the text field The resulting function should look like this: [[File:Try catch expanded.png|frame|center|alt=Wikifunctions composition using Try-catch function, in expanded mode|Wikifunctions composition using Try-catch function, in expanded mode]] [[File:Try catch collapsed.png|frame|center|alt=Wikifunctions composition using Try-catch function, in collapsed mode|Wikifunctions composition using Try-catch function, in collapsed mode]] === Testing your failure use cases === As we introduced in the above section about [[#Practice Test-Driven Development|practicing TDD]], it's important to test not only the most common paths, but also the possible edge cases. It is equally important to test failure behavior. In this section we will give you the tools necessary to test that your function fails with a given set of inputs, and that the error thrown is the expected one. To do that, you will need other two system functions: ==== Is error type (Z852) ==== The {{Z|Z852}} function is built-in with ZID <code>Z852</code> and takes two arguments: * '''Error''' – An {{Z|Z5}} object, which can be thrown by a failing call. An error instance has a type and a value. * '''Error type''' – A reference to an {{Z|Z50}} which will be compared to the type of the Error passed as a first argument. If that's the case, the function will return true. ==== Get error thrown by function call (Z853) ==== The {{Z|Z853}} function is built-in with ZID <code>Z853</code> and takes one argument: * '''Function call''' – A function call which can either return a successful value of any type, or throw an error. This function returns a {{Z|Z882}} with a {{Z|Z40}} in first place and an {{Z|Z1}} in the second: * If the Function call runs successfully and hence does not throw any error, the returned pair will contain False in the first place, and void in the second. * If the Function call throws an error, the returned pair will contain True in the first place, and the caught error in the second. To use this function in your compositions, you might need to use the additional functions: * {{Z|Z821}}, and * {{Z|Z822}} ==== Testing errors ==== Say our target function, "Join two strings with a space" or <code>Z30000</code>, throws an error of type <code>Z30005</code> and we want to test this behavior. To do that we need to: * Throw a failing function call * Get the error using the function {{Z|Z853}} * Check that the error is the right type with {{Z|Z852}} Tests have two fields: * '''Call''' – A function call that will produce an output with the inputs you want to test. This call will return a value. * '''Result validation''' – A function call that will validate that the value returned by the call above is the expected one. The first argument of this function call will be automatically assigned to take the return value of the first call. For step-by-step instructions on how to create tests, see {{ll|Wikifunctions:Introduction#Create_tests}}. In our example, we can structure it like this — but this is not the only way! The call, which will return an {{Z|Z5}} object: <syntaxhighlight lang="prolog"> error = get_second_element_of_typed_list( get_error_thrown_by( join_strings_by_whitespace( "", "not empty" ) ) ) </syntaxhighlight> And the result validation, which will take the {{Z|Z5}} object as its first argument: <syntaxhighlight lang="prolog"> is_error_type( error, Z30005 ) </syntaxhighlight> Let's do this step by step: # Start adding a test by clicking on the "+" button in the "Tests" table from your Function page. The "call" and "result validation" fields already have some functions pre-set, but to test the errors we will need to change them. # First, let's set the call: ## Under "call", click the "›" chevron button to expand the function call. ## Under "function", edit the field and search and select the function "Get second element of a typed pair" ## Once selected, next to "Typed pair", click on the "…" button and select "function call" ## Under "function", search and select the function "Get error thrown by function call" ## Next to "function call", click on the "…" button and select "function call" ## Under "function", search and select the function "Join two strings with a space" (or by ZID <code>Z30000</code>) ## Now set the inputs so that they cause a failure: at least one of them should be empty. ## You can now collapse your "call" by clicking again on the down-chevron button if you want! # Next, let's set the result validation: ## Under "result validation", click the "›" chevron button to expand the function call. ## Under "function", edit the field and search and select the function "Is error type" ## Now you will only be asked to configure the second argument. Under "error type", search and select your <code>Z30005</code> error type. # And you are done! You can now click the circular arrow in the "Implementations" box and you should see green checks. If everything went right, you can now save your test. It should look like this: [[File:Get error expanded.png|frame|center|alt=Testing a failure using Get error and Is error type functions, in expanded mode|Testing a failure using Get error and Is error type functions, in expanded mode]] [[File:Get error collapsed.png|frame|center|alt=Testing a failure using Get error and Is error type functions, in collapsed mode|Testing a failure using Get error and Is error type functions, in collapsed mode]] === Creating actionable error messages === As described above, Error Types have an optional key <code>Z50K3</code> which contains a multilingual list of HTML strings. When rendering information about an error, the messages stored in the error type can help create a clear, precise, informative, translatable and actionable error message. For that purpose, error messages can contain parameters like <code>$1</code>, <code>$2</code>, etc., where the digit corresponds to the error type argument and its value in the error instance. These error messages are rendered in Wikifunctions inside the "Details" dialog window after executing a function call. Additionally, these error messages are surfaced in other client interfaces, like Abstract Wikipedia, to provide better guidance to Abstract Content editors. [[File:Wikifunctions actionable error message example in the Details dialog.png|thumb|The error message is rendered using the HTML message of the error type and the error argument values.]] [[File:Wikifunctions actionable error message example in Abstract Wikipedia.png|thumb|When available, the HTML error message is rendered in the Abstract Wikipedia preview section.]] Let's use a real example to understand the benefits of HTML error messages: The function {{Z|Z37847}} returns the first Lexeme reference given a Wikidata Item reference and a language. When there is no Lexeme for this Item-Language combination, it throws an error of type {{Z|Z28248}}, which has three keys: * '''Z28248K1''' is the input Wikidata item QID * '''Z28248K2''' is the connecting property, in this case <code>P5137/item for this sense</code> * '''Z28248K3''' is the language code When calling this function for a Wikidata lexeme that doesn't exist, the call will throw an error instance like this: <syntaxhighlight lang="json" highlight="10,12"> { "Z1K1": "Z5", "Z5K1": "Z28248", "Z5K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z885", "Z885K1": "Z28248" }, "Z28248K1": "Q319", "Z28248K2": "P5137", "Z28248K3": "ast" } } </syntaxhighlight> While the error type label indicates: <code>No matching lexeme for item in language</code>, a better error message should indicate: * which is the failing item, * which is the language missing, and * what are the possible ways to fix it. The error message <code>Z50K3</code> field can provide this functionality. Whenever an Error Type has an error message for the user language (or any of its fallbacks), the error message shown will be rendered by: # First, replacing the message parameters with the values of the keys. In our example, any <code>$1</code> will be replaced with the value of <code>Z28248K1</code> ("Q319"), <code>$2</code> with "P5137", and <code>$3</code> with "ast", # Last, sanitizing and rendering the HTML message. So a HTML message like: <syntaxhighlight lang="html"> There is no matching lexeme for the item $1 in "$3".<br> <a href="http://wikidata.org/wiki/$1">Edit in Wikidata</a> </syntaxhighlight> Will become: : There is no matching lexeme for the item Q319 in "ast" : [[d:Q319|Edit in Wikidata]] == Debugging your implementations == Sometimes things can go wrong. A function might behave differently than expected or a value might not look quite right. Sometimes implementations are really complex and, because they are run in a sandboxed environment, it can seem really difficult to debug. To help understand what's going on inside a function call, Wikifunctions includes a small set of debugging tools. These tools don't change the result of a function, but will add extra information to the returned metadata, which you can observe after running the function. You can use <code>Wikifunctions.Debug()</code> from your code implementations or the function {{Z|Z854}} from your compositions. In this section you will learn: * How to add debug messages from both code and composition implementations, * how to inspect the metadata manually or via the UI to inspect these logs. === Debugging your code implementations === When writing code, both from JavaScript and Python3, you can use <code>Wikifunctions.Debug()</code> to add a message to your debugging log and continue the execution. {{phab|T441028}} <code>Wikifunctions.Debug()</code> has one parameter, which is generally expected to be a string. However, any other object passed as parameter will get directly converted into a string. If we want to add debug logs to our code implementations for our "Join two strings with a space" example function, we can do, in JavaScript: <syntaxhighlight lang="JavaScript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { Wikifunctions.Debug( `first input is empty "${ Z30000K1 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { Wikifunctions.Debug( `second input is empty "${ Z30000K2 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } Wikifunctions.Debug( "both inputs are fine" ); return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> And the same in your Python3 implementation will be: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": Wikifunctions.Debug( 'first input is empty "'+Z30000K1+'"' ) Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": Wikifunctions.Debug( 'second input is empty "'+Z30000K2+'"' ) Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) Wikifunctions.Debug( 'both inputs are fine' ) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> This way, no matter what happens, we will be adding one message to your debugging logs: * If the function call fails when checking on the first or second input, the result of the execution will be a failure, but it will contain one informative log about what branch caused the failure. * If the function call succeeds—because both inputs are valid—the function call will return the joined string, but the returned metadata will also contain a debug log. === Debugging your compositions === To support debugging compositions, Wikifunctions provides the built-in function {{Z|Z854}}. This function allows you to attach debug messages to the execution of any function call that generates the final output. The debug logs collected during the evaluation are returned as part of the execution metadata, under the <code>executorDebugLogs</code> key. ==== Add debug log to function call (Z854) ==== The {{Z|Z854}} function is built-in with ZID <code>Z854</code> and takes two arguments: * '''Function call''' – Any composition you want to execute. * '''Debug log''' – A string message that will be recorded if the given function call is evaluated. When the wrapped function call runs, the provided message is added to the execution logs. If that function call is not executed, or its execution is not part of the final output, its debug log will not appear in the final result metadata. You will benefit from this built-in if you want to observe: * Which branch of a conditional was executed, or * the order of evaluation in a composition. ==== Using Add debug log to function call ==== Say that you want to add debug logs to our example function "Join two strings with a space" or <code>Z30000</code>, so that different messages are added to the different possible outcomes. You could use our debugging builtin like this: <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), add_debug_log( throw_error( Z30005, ... ), 'failed on first input' ) if( is_empty_string( Z30000K2 ), add_debug_log( throw_error( Z30005, ... ), 'failed on second input' ), add_debug_log( join_with_separator( Z30000K1, Z30000K2, " " ), 'both inputs are ok!' ) ) ) </syntaxhighlight> This way, * when called with an empty first input, the function will return a failed response, and the metadata will contain an <code>executorDebugLogs</code> entry with the "failed on first input" log. * When called with an empty second input, the call will also fail, but the logged message will be "failed on second input" * When called with valid inputs, the function will return a successful response, and additionally the metadata will contain "both inputs are ok" in its <code>executorDebugLogs</code> key. This is the way this composition would look: [[File:Add debug log expanded.png|frame|center|alt=Composition implementation using Add debug logs to log all possible execution paths|Composition implementation using Add debug logs to log all possible execution paths]] === Accessing execution debug logs === Whether your execution logs are added via <code>Wikifunctions.Debug()</code> or via the {{Z|Z854}} built-in function, they are returned as part of the response metadata. To see the logs, once you run your function, click on the "Details" button that appears at the bottom of the "Result" section. The error and debug information will appear at the top of the "Details" dialog. This is what you would see when running the composition from our previous example with valid and invalid inputs: {| class="wikitable" | [[File:Execution logs success.png|frameless|center|alt=Function metadata dialog for a successful execution with debug logs]] | [[File:Execution logs failure.png|frameless|center|alt=Function metadata dialog for a failed execution with debug logs]] |- | Function metadata dialog for a successful execution: shows no errors, but displays the successful execution log: ''"both inputs are ok!"'' | Function metadata dialog for a failed execution: shows the error information, and the additional execution log for the first failure branch: ''"failed on first input"'' |} [[Category:How to create implementations| {{#translation:}}]] 1kceuk1qydl1r2qcuwtwuxtvm4mtzfg Wikifunctions:How to create implementations/de 4 9282 331111 276737 2026-10-23T08:23:19Z FuzzyBot 207 Updating to match new version of source page 331111 wikitext text/x-wiki <languages/> Diese Seite bietet eine detailliertere Anleitung dafür, wie man '''Implementierungen erstellt''' und geht über den Überblick auf {{ll|Wikifunctions:Introduction}} hinaus. <span id="Types_of_Implementations"></span> == Arten von Implementierungen == In Wikifunctions kann eine '''Implementierung''' zwei Hauptformen annehmen: '''Code''' oder '''Komposition'''. Eine Code-Implementierung drückt die Logik der Funktion direkt in einer der verfügbaren Programmiersprachen aus (derzeit Python3 oder JavaScript). Sie ist besonders nützlich, wenn sich das Verhalten der Funktion nicht ohne Weiteres aus bestehenden Wikifunktionen ableiten lässt oder wenn eine präzise Kontrolle über die Datenverarbeitung erforderlich ist. Eine Kompositions-Implementierung definiert die Funktion hingegen vollständig durch die Kombination bestehender Funktionen, ohne dass Code geschrieben werden muss. Kompositionen sind leichter verständlich, wiederverwendbar und lassen sich automatisch in andere Sprachen übersetzen. Sie setzen jedoch voraus, dass geeignete Bausteine ​​bereits vorhanden sind und sind oft weniger leistungsfähig. Prüfe daher zunächst, ob dein Ziel durch Komposition erreicht werden kann. Ist dies nicht möglich oder spielen Leistung oder feingranulare Logik eine Rolle, wähle stattdessen eine Code-Implementierung. Es gibt eine dritte Implementierungsart: '''integrierte Implementierungen'''. Diese werden vom Systemcode ausgeführt und können nicht bearbeitet werden. Höchstwahrscheinlich verfügen alle vordefinierten Funktionen über eine integrierte Implementierung. In solchen Fällen wird beim Öffnen der Implementierungsseite die Meldung ''"{{int|wikilambda-implementation-selector-none}}"'' angezeigt. <span id="Practice_Test-Driven_Development"></span> == Praxis der testgetriebenen Entwicklung == '''Testgetriebene Entwicklung''' oder '''TDD''' ist eine Methode zur Softwareentwicklung, bei der Tests geschrieben werden, bevor der eigentliche Code geschrieben wird. Tests dienen dazu, die Funktionsweise einer Funktion anhand von Beispielen und deren Funktionsweise zu verstehen. In Wikifunctions bietet das Schreiben von Tests als erste Tätigkeit erhebliche Vorteile. Wenn du an einer Implementierung arbeitest, kannst du deinen Code anhand der vorhandenen Tests ausführen, um sicherzustellen, dass er sich wie erwartet verhält. Dadurch lassen sich Fehler frühzeitig erkennen, noch bevor du deine Implementierung veröffentlichst. Tests sind außerdem ein effektives Mittel, um die benötigte Funktion zu beschreiben. Durch das Schreiben von Tests '''kommunizierst du klar das erwartete Verhalten''' und die Community kann bei der Implementierung helfen oder alternative Implementierungen erstellen. Stell dir vor, du möchtest eine Funktion implementieren, die zwei Zeichenketten mit einem Leerzeichen dazwischen verknüpft. Ein einfacher Test dafür könnte so aussehen: <syntaxhighlight lang="prolog"> join_with_space( "Hello", "world" ) => "Hello world" </syntaxhighlight> Sobald du das grundlegende Verhalten definiert hast, ist es wichtig, auch '''an Randfälle zu denken''' — Situationen, in denen die Eingaben so beschaffen sind, dass ein spezielles Verhalten erforderlich sein könnte. Was passiert beispielsweise, wenn deine erste Zeichenkette mit einem Leerzeichen endet oder deine zweite mit einem Leerzeichen beginnt? Soll die Funktion alle vorhandenen Leerzeichen beibehalten und ein weiteres hinzufügen oder ein sauber formatiertes Ergebnis mit nur einem Leerzeichen zwischen den Wörtern zurückgeben? Je nach deinen Anforderungen solltest du einen Test für einen solchen Fall erstellen. Ein Test für diesen Sonderfall könnte beispielsweise einer der folgenden sein — aber nicht beide!: <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> oder ... <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> Stell sicher, dass deine Tests alle möglichen Sonderfälle abdecken, und sobald du diese hast, stell sicher, dass sie alle mit der Funktion verbunden sind, indem du sie auswählst und auf "Verbinden" klickst. <span id="Code_implementations"></span> == Code-Implementierungen == [[File:Code implementation.png|thumb|alt=Wikifunctions-Code-Editor, der mit einer Funktionsvorlage initialisiert wurde|Beim Hinzufügen einer neuen Code-Implementierung wird die Funktionsvorlage mit den Funktions- und Argumentnamen initialisiert]] Beim Erstellen einer Implementierung mit Code richtet die Wikifunctions-Benutzeroberfläche einen Code-Editor ein, in dem die ausgewählte Sprache für Syntaxhervorhebung und -validierung aktiviert ist. Sobald die zu implementierende Funktion und die Programmiersprache ausgewählt sind, wird dieser Editor mit der korrekten Funktionsvorlage konfiguriert: '''Entferne oder bearbeite sie nicht!''' Platziere deinen Code innerhalb dieser Funktionssignatur. Falls du Hilfsfunktionen benötigst, kannst du diese einfach in deiner Hauptfunktionsdeklaration deklarieren. <span id="Using_input_types_in_your_code"></span> === Verwendung von Eingabetypen in deinem Code === Die Wikifunctions-Typen {{Z|Z6}} und {{Z|Z40}} können in JavaScript und Python3 wie native Typen verwendet werden. Beispielsweise lässt sich eine Zeichenkette verketten oder ein boolescher Wert direkt in einem logischen Ausdruck verwenden. Um andere Typen in deinen Code-Implementierungen zu verwenden, musst du den jeweiligen Typ genauer untersuchen, herausfinden, ob eine Umwandlung in ein natives Äquivalent existiert, und ihn entsprechend behandeln. Nehmen wir beispielsweise an, wir möchten Python-Code schreiben, der eine Eingabe vom Typ {{Z|Z20420}} verarbeitet. Auf der Seite für diesen Typ sehen wir uns die "Typumwandler in Code" an und suchen nach einem Python-Umwandler. Der Umwandler {{Z|Z20424}} wird auf unsere Datumseingabe angewendet, bevor unser Code ausgeführt wird. Unter "nativer Typ" sehen wir, dass unsere Eingabe ein Python-Dictionary ist, und in der Implementierung können wir die zu erwartenden Schlüssel sehen: <syntaxhighlight lang="python3"> return { 'K1': year, 'K2': month, 'K3': day } </syntaxhighlight> Wenn ein Typ keinen Umwandler besitzt, musst du direkt über seine Schlüssel auf seine Bestandteile zugreifen. Nehmen wir beispielsweise an, deine Funktion <code>Z30000</code> hat einen Eingabeparameter <code>Z30000K1</code> vom Typ {{Z|Z11}}. Dieser Typ besitzt zwei Schlüssel: <code>Z11K1</code> für die Sprache (selbst ein Objekt vom Typ {{Z|Z60}}) und <code>Z11K2</code> für den Zeichenketten-Wert. Das Sprachobjekt hat wiederum einen Schlüssel <code>Z60K1</code> für den Sprachcode. Um also eine Zeichenkette mit dem Sprachcode und dem Text zu erhalten, kannst du folgendes schreiben: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1 ) { // z. B. "de: beliebiger Text" return Z30000K1.Z11K1.Z60K1 + ": " + Z30000K1.Z11K2; } </syntaxhighlight> Für eine Kurzübersicht der verfügbaren Typumwandlungen besuche [[Special:MyLanguage/Wikifunctions:Execution targets#Default type conversion|die Tabelle der Standard-Typumwandlungen]]. <span id="Returning_the_right_outputs"></span> === Rückgabe der richtigen Ausgaben === Ähnlich wie bei der Behandlung von Eingaben müssen auch Ausgaben dem in der Funktionsdefinition angegebenen Typ entsprechen. Einige können wie native Typen behandelt werden; daher wird jede Zeichenketten-Ausgabe in ein Wikifunctions-Objekt {{Z|Z6}} und jeder von deiner Implementierung zurückgegebene native boolesche Wert in ein Wikifunctions-Objekt {{Z|Z40}} umgewandelt. Typen mit "Typumwandlern aus Code" wenden die entsprechende Funktion auf die Ausgabe an, um den benötigten Typ zu erzeugen. Am Beispiel von {{Z|Z20420}} transformiert {{Z|Z20443}} die Ausgabe deiner Implementierung – ein Dictionary mit den Schlüsseln K1, K2 und K3 – in die korrekte ZObjekt-Darstellung. Für Typen, die keine Umwandler aus Code haben, kannst du die Ausgabeobjekte sorgfältig erstellen und zurückgeben. Stell dir beispielsweise vor, unsere Funktion <code>Z30000</code> nimmt zwei Zeichenketten als Eingaben entgegen: Sprachcode und Text, und soll ein Objekt {{Z|Z11}} zurückgeben. In Python kannst du dies mit dem Konstruktor <code>ZObject</code> erreichen: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): lang_object = ZObject( {"Z1K1": "Z9", "Z9K1": "Z60"}, Z60K1 = Z30000K1 ) return ZObject( {"Z1K1": "Z9", "Z9K1": "Z11"}, Z11K1 = lang_object, Z11K2 = Z30000K2 ) </syntaxhighlight> Oder in JavaScript: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { const langObject = new ZObject( new Map( [ [ "Z60K1", Z30000K1 ] ] ), { "Z1K1": "Z9", "Z9K1": "Z60" } ); const monolingualKeys = new Map( [ [ "Z11K1", langObject ], [ "Z11K2", Z30000K2 ] ] ); return new ZObject( monolingualKeys, { "Z1K1": "Z9", "Z9K1": "Z11" } ); } </syntaxhighlight> Du kannst mehr über die Klasse <code>ZObject</code> und andere nützliche Konstruktoren auf {{ll|Wikifunctions:Execution_targets#Custom_and_non-built-in_type_conversion}} erfahren. {{phab|T392750}}Stand Mai 2026 kann der Versuch, eine Liste von Listen zurückzugeben, fehlschlagen; daher ist es nicht möglich, solche Funktionen in Code zu implementieren. === Code in Python === In diesem Abschnitt geben wir ein konkretes Beispiel, wie man eine Implementierung in Form von Code in Python erstellt. Angenommen, wir möchten eine Implementierung für eine Funktion erstellen, die zwei Eingabezeichenketten durch Einfügen eines Leerzeichens dazwischen kombiniert und das Ergebnis zurückgibt. Nehmen wir an, die ZID dieser Funktion ist Z30000. Die Implementierung wird über die ZID der Funktion definiert. Das gilt auch für die Argumente der Funktion. Im Fall der Funktion Z30000 mit ihren beiden Argumenten sollte die Funktionsvorlage also so aussehen: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): </syntaxhighlight> Wie bereits erwähnt, wissen wir, dass die Argumente (<code>Z30000K1</code> und <code>Z30000K2</code>) Zeichenketten sind, daher können wir sie genauso behandeln wie native Zeichenketten in Python. Die Funktion sollte außerdem eine Zeichenkette zurückgeben. In unserem Beispiel geben wir einfach die beiden Argumente, getrennt durch ein Leerzeichen, aneinandergereiht zurück: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): return Z30000K1 + " " + Z30000K2 </syntaxhighlight> Da es sich um Python handelt, vergesse nicht, diese Zeile einzurücken. Wenn du unserem Rat gefolgt bist, [[#Practice Test-Driven Development|TDD anzuwenden]], verfügst du bereits über eine Reihe von Tests, von denen du weißt, dass sie funktionieren sollten. In diesem Fall kannst du während der Entwicklung deiner Implementierung auf den kreisförmigen Pfeil im Testbereich klicken und überprüfen, ob deine Implementierung alle Tests besteht. Denke daran, dass die Laufzeit keinen Status hat. Gehe nicht von Werten für globale oder statische Variablen aus. Wenn du weitere Fragen dazu hast, was du in Python tun kannst und was nicht, frage auf [[Wikifunctions:Python implementations]]. === Code in JavaScript === In diesem Abschnitt geben wir ein konkretes Beispiel, wie man eine Implementierung in Form von Code in JavaScript erstellt. Angenommen, wir möchten eine Implementierung für eine Funktion erstellen, die zwei Eingabezeichenketten durch Einfügen eines Leerzeichens dazwischen kombiniert und das Ergebnis zurückgibt. Nehmen wir an, die ZID dieser Funktion ist <code>Z30000</code>. Die Implementierung wird über die ZID der Funktion definiert. Das gilt auch für die Argumente der Funktion. Im Fall der Funktion <code>Z30000</code> mit ihren beiden Argumenten sollte die Funktionsvorlage also so aussehen: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { } </syntaxhighlight> Wir wissen, dass die Argumente (<code>Z30000K1</code> und <code>Z30000K2</code>) Zeichenketten sind, daher können wir sie in JavaScript wie native Zeichenketten behandeln. Die Funktion soll außerdem eine Zeichenkette zurückgeben. Um die Funktion zu vervollständigen, kannst du eine Zeile hinzufügen, die die Eingabezeichenketten verkettet, etwa so: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> Wenn du Tests wie im Abschnitt [[#Practice Test-Driven Development|TDD]] oben empfohlen hast, klicke auf den kreisförmigen Pfeil im Testbereich und prüfe, ob deine Implementierung alle Tests besteht. Denke daran, dass die Laufzeit keinen Status hat. Gehe nicht von Werten für globale oder statische Variablen aus. Wenn du weitere Fragen dazu hast, was du in JavaScript tun kannst und was nicht, frage auf [[Wikifunctions:JavaScript implementations]]. <div lang="en" dir="ltr" class="mw-content-ltr"> === Calling another Wikifunctions function === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> A code implementation can call certain other Wikifunctions functions, receive the output of the call, and use that output in further processing. We refer to such calls as callbacks. At present, due to security and performance concerns, only the following built-in Wikidata fetch and search functions can be called in this way: {{Z|Z6820}}, {{Z|Z6821}}, {{Z|Z6822}}, {{Z|Z6824}}, {{Z|Z6825}}, {{Z|Z6826}}, {{Z|Z6830}}, and {{Z|Z6831}}. This capability is in an initial stage of deployment; we hope to allow calls to a broader range of functions in the future. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Let’s look at a JavaScript implementation containing a callback. This implementation fetches an item from Wikidata, extracts the label of that item in a given language, and returns the label string. The item to fetch is given by argument <code>Z400K1</code>, and the language is given by <code>Z400K2</code>. </div> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const item = Wikifunctions.Call('Z6821', Z400K1); for (const label of item.Z6001K2.Z12K1) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> A callback is made by calling <code>Wikifunctions.Call</code>, as shown in the example. The first argument to <code>Wikifunctions.Call</code> is always the ZID of the function to be called – in this case, {{Z|Z6821}}, which takes a single argument. Following that, the arguments to be passed to that function are listed, separated by commas. Here, that argument, <code>Z400K1</code>, is the same value that was passed to the function <code>Z400</code>. This is a common pattern of argument passing to callbacks, but their arguments can also be built using the <code>ZObject</code> constructor (as explained above), or obtained in other ways. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The value of <code>Z400K1</code> would be an instance of {{Z|Z6091}}, containing the QID of the item to be fetched. Line 2 of the example calls <code>Z6821</code> to fetch that item from Wikidata and assigns the resulting ZObject to the const <code>item</code>. The remaining code iterates over the item’s labels until it finds the one matching the language given by <code>Z400K2</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For the first example above, we have used <code>Z6821</code> for simplicity. However - unless an entire entity is needed by the implementation, it is strongly recommended to use <code>Z6820</code> to retrieve Wikidata items, which can be quite large. Although a call to <code>Z6820</code> is a bit more complex, its parameters allow for fetching selected portions of a Wikidata item, which can greatly improve performance and avoid some errors, by reducing the network bandwidth and processing time that are needed. (<code>Z6820</code> can also be used in place of <code>Z6822</code>, <code>Z6824</code>, <code>Z6825</code>, and <code>Z6826</code>, to get similar bandwidth-reduction benefits.) </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Just below we show how <code>Z6820</code> can be used, in <code>Wikifunctions.Call</code>, to implement the same behavior as above. Note that we use the second argument passed to <code>Z6820</code>, <code>[labelsPart]</code>, to say “Just return the item’s labels”, and we use the third argument, <code>[Z400K2]</code>, to say “Just return labels in the given language”. (This argument would also apply to aliases and descriptions, if they were included in the result.) </div> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const labelsPart = new ZObject( new Map( [ ['Z6030K1', new ZReference('Z6033')] ] ), {Z1K1: 'Z9', Z9K1: 'Z6030'} ); const entities = Wikifunctions.Call( 'Z6820', [Z400K1], [labelsPart], [Z400K2], []); const item = entities.get(Z400K1.Z6091K1); const labels = item.Z6001K2.Z12K1; for (const label of labels) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Other things to note: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Even though code implementations are now able to fetch Wikidata entities, it is recommended that they not be written to return ''entire'' entities. This is because of current limitations on the size of the value returned from a code implementation. To fetch and return an entire large entity, it’s better to call the fetch function from a composition.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Only one callback can execute at a time. For security reasons, it is not possible to use the concurrency features of JavaScript or Python to execute multiple callbacks in parallel.</span> ** <span lang="en" dir="ltr" class="mw-content-ltr">Keep in mind, however, that you can fetch multiple entities at once using Z6820.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">There is currently a 3 MiB limit on the size of Wikidata content that can be returned to a code implementation, by a single callback. The same limit applies to the size of the result returned from a code implementation.</span> <span id="Compositions"></span> == Kompositionen == Im diesem Abschnitt geben wir ein konkretes Beispiel, wie man eine Implementierung in Form einer Komposition erstellt. Angenommen, wir möchten eine Implementierung für eine Funktion erstellen, die zwei Eingabezeichenketten durch Einfügen eines Leerzeichens dazwischen kombiniert und das Ergebnis zurückgibt. Nehmen wir an, die ZID dieser Funktion ist <code>Z30000</code>. Normalerweise ist es sinnvoll, zunächst darüber nachzudenken, wie man vorhandene Funktionen kombinieren kann, um die gewünschte Ausgabe zu erzielen. Manchmal mag dies trivial sein und du kannst einfach mit dem Zusammenstellen und Funktionen fortfahren, aber in vielen Fällen lohnt es sich, die gewünschte Komposition zu notieren. Beispielsweise könnten wir für die angegebene Funktion die vorhandene Funktion {{Z|Z10000}} verwenden. Diese Funktion nimmt zwei Zeichenketten und erstellt daraus eine Zeichenkette. Aber wir müssen dazwischen ein Leerzeichen einfügen. Wir verbinden also zunächst ein Leerzeichen mit dem Ende der ersten Zeichenkette und verbinden dann die zweite Zeichenfolge mit dem Ergebnis dieser ersten Verbindung. Unsere Komposition könnte also so notiert werden: <syntaxhighlight lang="prolog"> join_strings( join_strings( Z30000K1, " " ), Z30000K2 ) </syntaxhighlight> Es gibt mehrere Möglichkeiten, eine Komposition zu schreiben: Beachte, dass dasselbe auch auf folgende Weise erreicht werden kann: <syntaxhighlight lang="prolog"> join_strings( Z30000K1, join_strings( " ", Z30000K2 ) ) </syntaxhighlight> Eine alternative Implementierung könnte auch die vorhandene Funktion {{Z|Z15175}} verwenden, sodass deine Komposition wie folgt aussehen könnte: <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> Wie du siehst, gibt es mehrere Möglichkeiten, dies zu erreichen. Nimm dir also Zeit und erkunde die vorhandenen Funktionen, die im {{ll|Wikifunctions:Catalogue}} verfügbar sind. Versuchen wir, das zweite Beispiel zu erstellen, <code>join_strings(Z30000K1, join_strings(" ", Z30000K2))</code>. Um dies zu erstellen: # Um eine Implementierung hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Implementierungen" auf die Schaltfläche "+". # Stelle sicher, dass die Option "Komposition" unter "Implementierung" ausgewählt ist. # Klicke auf das Symbol "›" oder auf den Link "Funktion auswählen", um die Funktionsdetails anzuzeigen. # Suche unter "Funktion" nach dem Namen der äußersten Funktion, die du verwenden möchtest, in diesem Beispiel "verbinde Zeichenketten". Wähle anschließend die gewünschte Funktion aus der Dropdown-Liste aus. # Du siehst zwei neue Felder, eines für jedes der Argumente, die für die ausgewählte Funktion benötigt werden. # Als erstes Argument möchten wir den ersten Eingabewert für unsere Funktion auswählen: ## Klicke neben "erste Zeichenkette" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus. ## Unter "Schlüssel-ID" kannst du nun die erste Zeichenkette deiner Funktion aus dem Dropdown-Menü auswählen, das alle verfügbaren Eingaben enthält. # Für das zweite Argument möchten wir das Ergebnis eines weiteren Aufrufs von "verbinde Zeichenketten" verwenden: ## Klicke neben "zweite Zeichenkette" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus. ## Suche unter "Funktion" nach der Funktion, die du aufrufen möchtest und wähle sie aus, nämlich "verbinde Zeichenketten". ## Konfiguriere die "erste Zeichenkette" für diesen inneren Funktionsaufruf, indem du einfach ein Leerzeichen in das Textfeld eingibst, und konfiguriere die "zweite Zeichenkette" wie in Schritt 6: Ändere sie mit der Schaltfläche "…" in "Argumentreferenz" und wähle dann das zweite Argument in der Dropdown-Liste aus. Deine Komposition ist nun fertig! Du kannst die Details mithilfe der Pfeiltasten ein- und ausblenden, um dir einen Überblick zu verschaffen. Falls du bereits Tests wie im Abschnitt [[#Practice Test-Driven Development|TDD]] oben empfohlen implementiert hast, klicke im Testbereich auf den kreisförmigen Pfeil und prüfe, ob deine Implementierung die Tests besteht. Sobald deine Komposition die Tests bestanden hat, kannst du sie veröffentlichen. [[File:Composition implementation expanded.png|frame|center|alt=Eine Wikifunctions-Kompositionsimplementierung in ihrer erweiterten Ansicht|Eine Wikifunctions-Kompositionsimplementierung in ihrer erweiterten Ansicht]] [[File:Composition implementation collapsed.png|frame|center|alt=Eine Wikifunctions-Kompositionsimplementierung in ihrer reduzierten Ansicht|Eine Wikifunctions-Kompositionsimplementierung in ihrer reduzierten Ansicht]] <span id="Wikifunctions_error_handling"></span> == Fehlerbehandlung auf Wikifunctions == Als Ersteller einer Wikifunctions-Funktion möchtest du möglicherweise den Benutzer warnen, der deine Funktion aufruft, wenn im Code ein Fehler auftritt oder seine Eingaben bestimmte Kriterien nicht erfüllen. Wenn deine Funktion beispielsweise eine Zeichenkette mit einem Namen erwartet, solltest du prüfen, ob der Name nicht leer ist, und gegebenenfalls eine verständliche Fehlermeldung anzeigen. Hierfür kannst du <code>Wikifunctions.Error()</code> in deinen Code-Implementierungen oder die Funktion {{Z|Z851}} in deinen Kompositionen verwenden. In diesem Abschnitt erfährst du: * Wie man Fehler sowohl aus Code- als auch aus Kompositions-Implementierungen auslöst, * wie man Tests für Fehlerfälle schreibt, und * wie man Fehler abfängt und behandelt, die von Funktionen ausgelöst werden, die man in seinen Kompositionen verwendet. <span id="Throwing_errors_from_code_implementations"></span> === Fehler aus Code-Implementierungen auslösen === Sowohl beim Schreiben von JavaScript- als auch von Python-Code kannst du <code>Wikifunctions.Error()</code> nutzen, um die Ausführung mit einem gewünschten Fehler zu beenden. <code>Wikifunctions.Error()</code> hat zwei Parameter: # Fehlertyp: Eine Zeichenkette, die die ZID des Fehlertyps enthält, den du zurückgeben möchtest. # Fehlerargumente: Eine Liste von Zeichenkettenargumenten zur Erstellung des Fehlers. Gehen wir sie der Reihe nach durch: <span id="Error_type"></span> ==== Fehlertyp ==== Ein Fehlertyp ist ein Objekt, das eine Art von Fehler beschreibt, der im System auftreten kann. Es gibt eine Reihe vordefinierter Fehlertypen, du kannst aber auch eigene Fehlertypen erstellen, die besser zu deinem Anwendungsfall passen. Bei der Verwendung von Fehlern empfiehlt es sich, die verfügbaren Fehlertypen zu durchsuchen, die sich in [[Special:ListObjectsByType/Z50|dieser Liste]] finden. Falls keine passenden Fehler für deinen Fall vorhanden sind, erstelle einen neuen Fehler, indem du zur Erstellungsseite gehst und im Typauswahlfeld "Fehlertyp" auswählst. Lege anschließend die erforderlichen Felder fest: [[File:Error type.png|thumb|alt=Erstellung von Fehlertypen in Wikifunctions|Um einen neuen Fehlertyp (Z50) zu erstellen, bearbeite die Bezeichnung und füge die erforderlichen Schlüssel hinzu.]] * '''Bezeichnung''' – Dies ist der Haupttitel des Fehlers, der eine kurze, aber aussagekräftige Meldung enthalten sollte. Lege die Fehlerbezeichnung im rechten Feld mit dem Titel "Info" fest. * '''Schlüssel''' – Schlüssel enthalten zusätzliche Informationen zur Fehlerursache. Wenn beispielsweise eine Eingabe das falsche Format aufwies, möchtest du den Benutzer möglicherweise über den eingegebenen Inhalt informieren, wenn der Fehler auftritt. Um sie in deinen Implementierungen zu verwenden, müssen Schlüssel vom Zeichenketten sein. Um einen Schlüssel zu erstellen, klicke auf das Symbol "[+]" unterhalb von "Schlüssel", wähle unter "Werttyp" die Option "Zeichenkette" aus und füge eine aussagekräftige Bezeichnung hinzu, beispielsweise "tatsächlich Eingabe". Sobald du alle erforderlichen Schlüssel erstellt hast, kannst du deinen Fehlertyp veröffentlichen und die ID des neu erstellten Objekts speichern. * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error message''' – Error types can contain a multilingual array of HTML parametrized error messages. The parameter notation is $1, $2, etc., where the digit corresponds to the error type key. For example, when creating an error type with one string key "current input", the error message can use the positional parameter "$1", which will be replaced with the value of the "current input" key at the time of rendering the error. To add HTML messages, click on the "[+]" icon below "html fragments", select a language and input the HTML string.</span> <span id="Error_arguments"></span> ==== Fehlerargumente ==== Fehlerargumente entsprechen den Schlüsseln des Fehlertyps und sollten zusätzliche Informationen zum Verständnis des Fehlers liefern. Fehlerargumente sollten immer Zeichenketten sein. <span id="Using_Wikifunctions.Error()"></span> ==== Verwendung von Wikifunctions.Error() ==== Angenommen, du möchtest einen Fehler auslösen, wenn entweder deine erste oder deine zweite Eingabe leer ist. Du hast den Fehlertyp bereits erstellt und ihm wurde die ZID <code>Z30005</code> zugewiesen. Dein Fehlertyp hat zwei Zeichenketten-Schlüssel: * Eingabeschlüssel: Enthält den Schlüssel der fehlerhaften Eingabe * Eingabewert: Enthält den aktuellen Wert der fehlerhaften Eingabe Um einen Fehler in deiner JavaScript-Implementierung auszulösen, solltest du etwa Folgendes tun: <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { // Wenn die erste Eingabe leer ist, löse Fehler Z30005 aus // mit zwei Zeichenketten-Argumenten: [ erster Eingabe-Schlüssel, erster Eingabe-Wert ] Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { // Wenn die zweite Eingabe leer ist, löse Fehler Z30005 aus // mit zwei Zeichenketten-Argumenten: [ zweiter Eingabe-Schlüssel, zweiter Eingabe-Wert ] Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> Um einen Fehler in deiner Python-Implementierung auszulösen, solltest du etwa Folgendes tun: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": # Wenn die erste Eingabe leer ist, löse Fehler Z30005 aus # mit zwei Zeichenketten-Argumenten: [ erster Eingabe-Schlüssel, erster Eingabe-Wert ] Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": # Wenn die zweite Eingabe leer ist, löse Fehler Z30005 aus # mit zwei Zeichenketten-Argumenten: [ erster Eingabe-Schlüssel, erster Eingabe-Wert ] Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> Denke daran, dass der Aufruf von <code>Wikifunctions.Error()</code> die Ausführung beendet! <span id="Throwing_errors_from_compositions"></span> === Fehler aus Kompositionen auslösen === Wenn du eine Kompositionsimplementierung erstellst, kannst du einen Fehler auslösen, indem du die Spezialfunktion {{Z|Z851}} aufrufst. <span id="Throw_Error_function_(Z851)"></span> ==== Funktion Fehler auslösen (Z851) ==== Die Funktion {{Z|Z851}} ähnelt der Methode <code>Wikifunctions.Error()</code> und benötigt zwei Argumente: * '''Fehlertyp''' – Ein Verweis auf den Fehlertyp, den du auslösen möchtest * '''Fehlerparameter''' – Eine Liste mit den Argumenten zur Erstellung deines Fehlers, die ebenfalls Zeichenketten sein sollten. <span id="Using_Throw_Error"></span> ==== Verwendung von Fehler auslösen ==== Angenommen, du möchtest deine Komposition so ändern, dass sie zuerst prüft, ob die Argumente nicht leer sind, und einen Fehler ausgibt, wenn sie ein leeres Argument findet. Wenn dann keines der Argumente leer ist, wird die ursprüngliche Komposition ausgeführt, die wie folgt aussieht: <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> Dazu musst du bedingte Pfade erstellen, für die du die Funktion {{Z|Z802}} verwenden kannst. Stell es dir folgendermaßen vor: * Wenn das erste Argument leer ist, soll ein Fehler für das erste Argument ausgelöst werden * Andernfalls wird mit der Überprüfung des zweiten Arguments fortgefahren * Wenn das zweite Argument leer ist, soll ein Fehler für das zweite Argument ausgelöst werden * Andernfalls wird der Erfolgspfad verfolgt und die verbundenen Zeichenketten mit dem Leerzeichen als Trennzeichen zurückgegeben Oder in funktionalem Pseudocode: <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), throw_error( Z30005, [ "Z30000K1", Z30000K1 ] ), if( is_empty_string( Z30000K2 ), throw_error( Z30005, [ "Z30000K2", Z30000K2 ] ), join_with_separator( Z30000K1, Z30000K2, " " ) ) ) </syntaxhighlight> Lass uns das Schritt für Schritt erstellen: # Um eine Implementierung hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Implementierungen" auf die Schaltfläche "+". # Stelle sicher, dass die Option "Komposition" unter "Implementierung" ausgewählt ist. # Klicke auf das Symbol "›" oder auf den Link "Funktion auswählen", um die Funktionsdetails anzuzeigen. # Suche unter "Funktion" nach der äußersten Funktion, die du verwenden möchtest, in diesem Fall "wenn", und wähle sie aus. # Überprüfe die Gültigkeit des ersten Arguments: ## Klicke neben "Bedingung" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "ist leere Zeichenkette" und wähle sie aus ## Klicke neben "Eingabe" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus ## Wähle unter "Schlüssel-ID" die erste Eingabe aus (z. B. "erste Zeichenkette") ## Du kannst den Funktionsaufruf der "Bedingung" nun bei Bedarf ausblenden, indem du auf den Pfeil nach unten neben "Bedingung" klickst. Es sollte dann etwa Folgendes angezeigt werden: "f(x) ist leere Zeichenkette ( → erste Zeichenkette )" # Fehler auslösen, wenn die Bedingung wahr ist: ## Klicke neben "dann" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "Fehler auslösen" und wähle sie aus ## Suche unter "Fehlertyp" nach deinem Fehlertyp (du kannst die Fehler-ID direkt eingeben, wenn du sie kennst, z. B. Z30005) und wähle ihn aus ## Füge unter "Fehlerparameter" zwei Elemente hinzu, indem du auf die Schaltfläche "+" klickst ## Lege für "Objekt 1" (fehlerhafter Argumentschlüssel) den Typ auf "Zeichenkette" fest und trage die Argumentkennung ein (z. B. "erste Eingabe" oder "Z30000K1") ## Klicke für "Objekt 2" (fehlerhafter Argumentwert) auf die "…" neben "Objekt 2" und wähle "Argumentreferenz" aus ## Wähle unter "Schlüssel-ID" die erste Eingabe aus (z. B. "erste Zeichenkette") ## Du kannst den Funktionsaufruf "dann" nun bei Bedarf ausblenden, indem du auf den Pfeil nach unten neben "dann" klickst. Es sollte dann etwa Folgendes angezeigt werden: "f(x) Fehler auslösen ( ungültiges Format, typisierte Liste ( Objekt, "erste Eingabe", → erste Zeichenkette ) )" # Prüfe das zweite Argument, wenn das erste korrekt war: ## Klicke neben "sonst" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "wenn" und wähle sie aus ## Richte eine "Bedingung" ein, um die Gültigkeit des zweiten Arguments zu überprüfen, indem du das gleiche Verfahren wie in Schritt 5 beschrieben anwendest. ## Richte "dann" so ein, dass beim zweiten Argument ein Fehler ausgelöst wird, indem du das gleiche Verfahren wie in Schritt 6 beschrieben anwendest. # Richte schließlich den Erfolgspfad ein: ## Klicke neben dem verschachtelten "sonst" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der gewünschten Funktion, in diesem Fall "vereinige zwei Zeichenketten mit Trennzeichen", und wähle sie aus ## Klicke neben "erste Zeichenkette" auf die Schaltfläche "…" und setze sie auf "Argumentreferenz", wähle anschließend "erste Zeichenkette" aus ## Klicke neben "zweite Zeichenkette" auf die Schaltfläche "…" und setze sie auf "Argumentreferenz", wähle anschließend "zweite Zeichenkette" aus ## Füge unter "Trennzeichen" ein Leerzeichen in das Textfeld ein Der resultierende Funktionsaufruf sollte folgendermaßen aussehen: [[File:Throw error expanded.png|frame|center|alt=Wikifunctions-Komposition mit der Funktion Fehler auslösen|Wikifunctions-Komposition mit der Funktion Fehler auslösen]] [[File:Throw error collapsed.png|frame|center|alt=Wikifunctions-Komposition mit der Funktion Fehler auslösen in ihrer reduzierten Ansicht|Wikifunctions-Komposition mit der Funktion Fehler auslösen in ihrer reduzierten Ansicht]] <span id="Handling_errors_in_compositions"></span> === Fehlerbehandlung in Kompositionen === Es ist zwar nützlich, Funktionen das Auslösen erwarteter Fehler zu ermöglichen, aber es ist entscheidend, Fehler in den eigenen Kompositionen behandeln zu können, um diese Funktionen sicher verwenden zu können. Angenommen, du möchtest eine neue Funktion "vollständiger Name einer Person" erstellen – wir bezeichnen sie mit der ZID <code>Z30010</code>. Diese Funktion soll den vollständigen Namen einer Person anhand ihres Vor- und Nachnamens zurückgeben. Ist jedoch eines der beiden Felder leer, soll sie stattdessen den Text "Unbekannt" zurückgeben. Du könntest eine Komposition erstellen, indem du unsere Beispielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" oder <code>Z30000</code> verwendest, um den Namen zu generieren. Wenn eine der Eingaben leer ist, weißt du, dass <code>Z30000</code> einen Fehler vom Typ <code>Z30005</code> auslöst. Mithilfe der Funktion {{Z|Z850}} als Wrapper kannst du die Verbindungsoperation ausführen und einen möglichen Fehler abfangen, indem du einfach "Unbekannt" zurückgibst, wenn er auftritt. <span id="Try-Catch_function_(Z850)"></span> ==== Try-Catch-Funktion (Z850) ==== Die Funktion {{Z|Z850}} ist eine integrierte Funktion mit der ZID <code>Z850</code> und benötigt drei Argumente: * '''Funktionsaufruf''' – Der erste Funktionsaufruf, der ausgeführt werden soll. Wenn kein Fehler auftritt, ist die Antwort das Ergebnis dieses Funktionsaufrufs. * '''Fehlertyp''' – Ein Fehlertyp, der abgefangen werden soll, falls er während der Ausführung des ersten Funktionsaufrufs auftritt. * '''Fehlerhandler''' – Ein Funktionsaufruf, der ausgeführt wird, falls der oben genannte Fehler während der Ausführung des ursprünglichen Funktionsaufrufs auftritt. In diesem Fall wird das Ergebnis der Fehlerbehandlung zurückgegeben. <span id="Using_Try-Catch"></span> ==== Verwendung der Try-Catch-Funktion ==== Sobald wir alle Funktionen für unsere Komposition haben, können wir sie folgendermaßen gestalten: <syntaxhighlight lang="prolog"> try_catch( join_with_space( Z30010K1, Z30010K2 ), Z30005, echo( "Unknown" ) ) </syntaxhighlight> Das bedeutet: * Die Funktion "verbinde zwei Zeichenketten mit Leerzeichen" wird mit den beiden Eingaben ausprobiert und wenn alles erfolgreich verläuft, wird das Ergebnis dieser Funktion zurückgegeben * Wenn eine der Eingaben leer ist, löst "verbinde zwei Zeichenketten mit Leerzeichen" einen Fehler vom Typ <code>Z30005</code> aus * Unsere {{Z|Z850}} erkennt dann diesen Fehler und führt die Funktion {{Z|Z801}} aus, die "Unbekannt" zurückgibt Lass uns das Schritt für Schritt erstellen: # Um eine Implementierung hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Implementierungen" auf die Schaltfläche "+". # Stelle sicher, dass die Option "Komposition" unter "Implementierung" ausgewählt ist. # Klicke auf das Symbol "›" oder auf den Link "Funktion auswählen", um die Funktionsdetails anzuzeigen. # Suche unter "Funktion" nach der äußersten Funktion, die du verwenden möchtest, in diesem Fall "Try-Catch-Funktion", und wähle sie aus. # Richte den Hauptfunktionsaufruf ein: ## Klicke unterhalb des Feldes, in dem die "Try-Catch-Funktion" ausgewählt ist, neben dem Schlüssel "Funktionsaufruf" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "verbinde zwei Zeichenketten mit Leerzeichen" und wähle sie aus ## Klicke neben "erste Zeichenkette" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus, wähle anschließend das Argument "erster Name" aus der Dropdown-Liste aus. ## Klicke neben "zweite Zeichenkette" auf die Schaltfläche "…" und wähle "Argumentreferenz" aus, wähle anschließend das Argument "zweiter Name" aus der Dropdown-Liste aus. # Wähle den abzufangenden Fehler aus: ## Suche unter "Fehlertyp" nach "ungültige Zeichenkette" und wähle es aus – du kannst direkt nach der ZID <code>Z30005</code> suchen # Richte den Funktionsaufruf für den Fehlerhandler ein: ## Klicke neben "Fehlerhandler" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "Echo" und wähle sie aus ## Suche unter "Eingabe" und "Typ" den Typ "Zeichenkette" und wähle ihn aus ## Gib nun unter "Eingabe" im Textfeld "Unbekannt" ein Die resultierende Funktion sollte folgendermaßen aussehen: [[File:Try catch expanded.png|frame|center|alt=Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer erweiterten Ansicht|Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer erweiterten Ansicht]] [[File:Try catch collapsed.png|frame|center|alt=Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer reduzierten Ansicht|Wikifunctions-Komposition mit der Try-Catch-Funktion in ihrer reduzierten Ansicht]] <span id="Testing_your_failure_use_cases"></span> === Testen deiner Fehlerfälle === Wie bereits im Abschnitt über die [[#Practice Test-Driven Development|Anwendung von TDD]] erläutert, ist es wichtig, nicht nur die häufigsten Ausführungspfade, sondern auch mögliche Randfälle zu testen. Ebenso wichtig ist es, das Fehlerverhalten zu prüfen. In diesem Abschnitt stellen wir dir die notwendigen Werkzeuge vor, um zu testen, ob deine Funktion bei bestimmten Eingaben fehlschlägt und ob die Fehlermeldung den Erwartungen entspricht. Dazu benötigst du zwei weitere Systemfunktionen: <span id="Is_error_type_(Z852)"></span> ==== ist Fehlertyp (Z852) ==== Die Funktion {{Z|Z852}} ist eine integrierte Funktion mit der ZID <code>Z852</code> und benötigt zwei Argumente: * '''Fehler''' – Ein {{Z|Z5}}-Objekt, das bei einem fehlgeschlagenen Aufruf ausgelöst werden kann. Eine Fehlerinstanz hat einen Typ und einen Wert. * '''Fehlertyp''' – Ein Verweis auf einen {{Z|Z50}}, der mit dem als erstes Argument übergebenen Fehlertyp verglichen wird. Ist dies der Fall, gibt die Funktion wahr zurück. <span id="Get_error_thrown_by_function_call_(Z853)"></span> ==== Fehler erhalten, ausgelöst durch Funktionsaufruf (Z853) ==== Die Funktion {{Z|Z853}} ist eine integrierte Funktion mit der ZID <code>Z853</code> und benötigt ein Argument: * '''Funktionsaufruf''' – Ein Funktionsaufruf, der entweder einen erfolgreichen Wert beliebigen Typs zurückgibt oder einen Fehler auslöst. Diese Funktion gibt ein {{Z|Z882}} zurück, wobei an erster Stelle ein {{Z|Z40}} und an zweiter Stelle ein {{Z|Z1}} steht: * Wenn der Funktionsaufruf erfolgreich ist und somit keinen Fehler auslöst, enthält das zurückgegebene Paar an erster Stelle falsch und an zweiter Stelle leer. * Wenn der Funktionsaufruf einen Fehler auslöst, enthält das zurückgegebene Paar an erster Stelle wahr und an zweiter Stelle den abgefangenen Fehler. Um diese Funktion in deinen Kompositionen zu verwenden, musst du möglicherweise die zusätzlichen Funktionen verwenden: * {{Z|Z821}} und * {{Z|Z822}} <span id="Testing_errors"></span> ==== Fehler testen ==== Angenommen, unsere Zielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" oder <code>Z30000</code> löst einen Fehler vom Typ <code>Z30005</code> aus, und wir möchten dieses Verhalten testen. Dazu müssen wir Folgendes tun: * Einen fehlgeschlagenen Funktionsaufruf auslösen * Den Fehler mit der Funktion {{Z|Z853}} erhalten * Mit {{Z|Z852}} prüfen, ob der Fehler den richtigen Typ hat Tests haben zwei Felder: * '''Aufruf''' – Ein Funktionsaufruf, der mit den zu testenden Eingaben eine Ausgabe erzeugt. Dieser Aufruf gibt einen Wert zurück. * '''Ergebnisprüfung''' – Ein Funktionsaufruf, der überprüft, ob der vom vorherigen Aufruf zurückgegebene Wert dem erwarteten Wert entspricht. Das erste Argument dieses Funktionsaufrufs wird automatisch mit dem Rückgabewert des ersten Aufrufs belegt. Für eine Schritt-für-Schritt-Anleitung zum Erstellen von Tests siehe {{ll|Wikifunctions:Introduction#Create_tests}}. In unserem Beispiel können wir es so strukturieren — aber das ist nicht die einzige Möglichkeit! Der Aufruf, der ein {{Z|Z5}}-Objekt zurückgibt: <syntaxhighlight lang="prolog"> error = get_second_element_of_typed_list( get_error_thrown_by( join_strings_by_whitespace( "", "not empty" ) ) ) </syntaxhighlight> Und die Ergebnisprüfung, die das {{Z|Z5}}-Objekt als erstes Argument verwendet: <syntaxhighlight lang="prolog"> is_error_type( error, Z30005 ) </syntaxhighlight> Lass uns das Schritt für Schritt tun: # Um einen Test hinzuzufügen, klicke auf der Funktionsseite in der Tabelle "Tests" auf die Schaltfläche "+". Die Felder "Aufruf" und "Ergebnisprüfung" enthalten bereits vordefinierte Funktionen. Um die Fehler zu testen, müssen wir diese jedoch ändern. # Als Erstes richten wir den Aufruf ein: ## Klicke unter "Aufruf" auf die Schaltfläche "›", um den Funktionsaufruf zu erweitern. ## Bearbeite das Feld unter "Funktion" und suche die Funktion "erhalte zweites Element eines typisierten Paars" und wähle sie aus ## Klicke anschließend neben "typisiertes Paar" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "Fehler erhalten, ausgelöst durch Funktionsaufruf" und wähle sie aus ## Klicke neben "Funktionsaufruf" auf die Schaltfläche "…" und wähle "Funktionsaufruf" aus ## Suche unter "Funktion" nach der Funktion "verbinde zwei Zeichenketten mit Leerzeichen" (oder nach ZID <code>Z30000</code>) und wähle sie aus ## Lege nun die Eingaben so fest, dass ein Fehler auftritt: Mindestens eine von ihnen muss leer sein. ## Du kannst jetzt deinen "Aufruf" durch erneutes Klicken auf den Pfeil nach unten wieder ausblenden, wenn du möchtest! # Als Nächstes richten wir die Ergebnisprüfung ein: ## Klicke unter "Ergebnisprüfung" auf die Schaltfläche "›", um den Funktionsaufruf zu erweitern. ## Bearbeite das Feld unter "Funktion" und suche die Funktion "ist Fehlertyp" und wähle sie aus ## Du wirst nun nur noch aufgefordert, das zweite Argument zu konfigurieren. Suche unter "Fehlertyp" nach deinem Fehlertyp <code>Z30005</code> und wähle ihn aus. # Und du bist fertig! Du kannst jetzt auf den kreisförmigen Pfeil im Feld "Implementierungen" klicken und solltest grüne Häkchen sehen. Wenn alles geklappt hat, kannst du deinen Test jetzt speichern. Er sollte folgendermaßen aussehen: [[File:Get error expanded.png|frame|center|alt=Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer erweiterten Ansicht|Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer erweiterten Ansicht]] [[File:Get error collapsed.png|frame|center|alt=Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer reduzierten Ansicht|Testen eines Fehlers mit den Funktionen Fehler erhalten und ist Fehlertyp in ihrer reduzierten Ansicht]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Creating actionable error messages === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As described above, Error Types have an optional key <code>Z50K3</code> which contains a multilingual list of HTML strings. When rendering information about an error, the messages stored in the error type can help create a clear, precise, informative, translatable and actionable error message. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For that purpose, error messages can contain parameters like <code>$1</code>, <code>$2</code>, etc., where the digit corresponds to the error type argument and its value in the error instance. These error messages are rendered in Wikifunctions inside the "Details" dialog window after executing a function call. Additionally, these error messages are surfaced in other client interfaces, like Abstract Wikipedia, to provide better guidance to Abstract Content editors. </div> [[File:Wikifunctions actionable error message example in the Details dialog.png|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">The error message is rendered using the HTML message of the error type and the error argument values.</span>]] [[File:Wikifunctions actionable error message example in Abstract Wikipedia.png|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">When available, the HTML error message is rendered in the Abstract Wikipedia preview section.</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> Let's use a real example to understand the benefits of HTML error messages: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The function {{Z|Z37847}} returns the first Lexeme reference given a Wikidata Item reference and a language. When there is no Lexeme for this Item-Language combination, it throws an error of type {{Z|Z28248}}, which has three keys: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K1''' is the input Wikidata item QID</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K2''' is the connecting property, in this case <code>P5137/item for this sense</code></span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K3''' is the language code</span> <div lang="en" dir="ltr" class="mw-content-ltr"> When calling this function for a Wikidata lexeme that doesn't exist, the call will throw an error instance like this: </div> <syntaxhighlight lang="json" highlight="10,12"> { "Z1K1": "Z5", "Z5K1": "Z28248", "Z5K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z885", "Z885K1": "Z28248" }, "Z28248K1": "Q319", "Z28248K2": "P5137", "Z28248K3": "ast" } } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> While the error type label indicates: <code>No matching lexeme for item in language</code>, a better error message should indicate: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">which is the failing item,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">which is the language missing, and</span> * <span lang="en" dir="ltr" class="mw-content-ltr">what are the possible ways to fix it.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The error message <code>Z50K3</code> field can provide this functionality. Whenever an Error Type has an error message for the user language (or any of its fallbacks), the error message shown will be rendered by: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">First, replacing the message parameters with the values of the keys. In our example, any <code>$1</code> will be replaced with the value of <code>Z28248K1</code> ("Q319"), <code>$2</code> with "P5137", and <code>$3</code> with "ast",</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Last, sanitizing and rendering the HTML message.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> So a HTML message like: </div> <syntaxhighlight lang="html"> There is no matching lexeme for the item $1 in "$3".<br> <a href="http://wikidata.org/wiki/$1">Edit in Wikidata</a> </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Will become: </div> : There is no matching lexeme for the item Q319 in "ast" : [[d:Q319|Edit in Wikidata]] <span id="Debugging_your_implementations"></span> == Debuggen deiner Implementierungen == Manchmal läuft etwas schief. Eine Funktion verhält sich möglicherweise anders als erwartet oder ein Wert erscheint merkwürdig. Implementierungen können mitunter sehr komplex sein, und da sie in einer Spielwiesen-Umgebung ausgeführt werden, kann die Fehlersuche extrem schwierig erscheinen. Um das Verständnis der Vorgänge innerhalb eines Funktionsaufrufs zu erleichtern, bietet Wikifunctions einige Debugging-Werkzeuge. Diese Werkzeuge verändern nicht das Ergebnis einer Funktion, sondern fügen den zurückgegebenen Metadaten zusätzliche Informationen hinzu, die du nach dem Ausführen der Funktion einsehen kannst. Du kannst <code>Wikifunctions.Debug()</code> in deinen Code-Implementierungen oder die Funktion {{Z|Z854}} in deinen Kompositionen verwenden. In diesem Abschnitt erfährst du: * Wie man Debug-Meldungen sowohl aus Code- als auch aus Kompositions-Implementierungen hinzufügt, * Wie man die Metadaten manuell oder über die Benutzeroberfläche untersucht, um diese Protokolle einzusehen. <span id="Debugging_your_code_implementations"></span> === Debuggen deiner Code-Implementierungen === Beim Schreiben von Code, sowohl in JavaScript als auch in Python3, kannst du <code>Wikifunctions.Debug()</code> verwenden, um eine Meldung zu deinem Debug-Protokoll hinzuzufügen und die Ausführung fortzusetzen. {{phab|T441028}} <code>Wikifunctions.Debug()</code> hat einen Parameter, der üblicherweise als Zeichenkette erwartet wird. Jedes andere als Parameter übergebene Objekt wird jedoch direkt in eine Zeichenkette umgewandelt. Um zu unseren Code-Implementierungen für unsere Beispielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" Debug-Protokolle hinzuzufügen, können wir dies in JavaScript tun: <syntaxhighlight lang="JavaScript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { Wikifunctions.Debug( `first input is empty "${ Z30000K1 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { Wikifunctions.Debug( `second input is empty "${ Z30000K2 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } Wikifunctions.Debug( "both inputs are fine" ); return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> Und das Gleiche in deiner Python3-Implementierung: <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": Wikifunctions.Debug( 'first input is empty "'+Z30000K1+'"' ) Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": Wikifunctions.Debug( 'second input is empty "'+Z30000K2+'"' ) Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) Wikifunctions.Debug( 'both inputs are fine' ) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> Auf diese Weise fügen wir deinen Debug-Protokollen in jedem Fall eine Meldung hinzu: * Schlägt der Funktionsaufruf bei der Überprüfung der ersten oder zweiten Eingabe fehl, ist das Ergebnis der Ausführung ein Fehler, enthält aber einen informativen Protokolleintrag darüber, welcher Zweig den Fehler verursacht hat. * Wenn der Funktionsaufruf erfolgreich ist — weil beide Eingaben gültig sind — gibt der Funktionsaufruf die verbundene Zeichenkette zurück, aber die zurückgegebenen Metadaten enthalten auch ein Debug-Protokoll. <span id="Debugging_your_compositions"></span> === Debuggen deiner Kompositionen === Zur Unterstützung des Debuggens von Kompositionen stellt Wikifunctions die integrierte Funktion {{Z|Z854}} bereit. Mit dieser Funktion kannst du Debug-Meldungen an die Ausführung jedes Funktionsaufrufs anhängen, der die endgültige Ausgabe erzeugt. Die während der Auswertung gesammelten Debug-Protokolle werden als Teil der Ausführungsmetadaten unter dem Schlüssel <code>executorDebugLogs</code> zurückgegeben. <span id="Add_debug_log_to_function_call_(Z854)"></span> ==== Debug-Protokoll zu Funktionsaufruf hinzufügen (Z854) ==== Die Funktion {{Z|Z854}} ist eine integrierte Funktion mit der ZID <code>Z854</code> und benötigt zwei Argumente: * '''Funktionsaufruf''' – Jede Komposition, die du ausführen möchtest. * '''Debug-Protokoll''' – Eine Zeichenketten-Meldung, die protokolliert wird, wenn der angegebene Funktionsaufruf ausgewertet wird. Wenn der umschlossene Funktionsaufruf ausgeführt wird, wird die bereitgestellte Meldung zu den Ausführungsprotokollen hinzugefügt. Wird dieser Funktionsaufruf nicht ausgeführt oder ist seine Ausführung nicht Teil der endgültigen Ausgabe, erscheint sein Debug-Protokoll nicht in den Metadaten des Endergebnisses. Diese integrierte Funktion ist besonders nützlich, wenn du beobachten möchtest: * Welcher Zweig einer Bedingung ausgeführt wurde, oder * Die Reihenfolge der Auswertung in einer Komposition. <span id="Using_Add_debug_log_to_function_call"></span> ==== Verwendung von Debug-Protokoll zu Funktionsaufruf hinzufügen ==== Angenommen, du möchtest zu unserer Beispielfunktion "verbinde zwei Zeichenketten mit Leerzeichen" oder <code>Z30000</code> Debug-Protokolle hinzufügen, sodass für die verschiedenen möglichen Ergebnisse unterschiedliche Meldungen angezeigt werden. Du könntest unsere integrierte Debugging-Funktion wie folgt verwenden: <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), add_debug_log( throw_error( Z30005, ... ), 'failed on first input' ) if( is_empty_string( Z30000K2 ), add_debug_log( throw_error( Z30005, ... ), 'failed on second input' ), add_debug_log( join_with_separator( Z30000K1, Z30000K2, " " ), 'both inputs are ok!' ) ) ) </syntaxhighlight> Dies bewirkt Folgendes: * Wird die Funktion mit einer leeren ersten Eingabe aufgerufen, gibt sie eine Fehlermeldung zurück und die Metadaten enthalten einen Eintrag <code>executorDebugLogs</code> mit dem Protokoll-Eintrag "Fehler bei erster Eingabe". * Wird der Aufruf mit einer leeren zweiten Eingabe aufgerufen, schlägt der Aufruf ebenfalls fehl, die protokollierte Meldung lautet jedoch "Fehler bei zweiter Eingabe". * Bei Aufruf mit gültigen Eingaben gibt die Funktion eine erfolgreiche Antwort zurück und zusätzlich enthalten die Metadaten im Schlüssel <code>executorDebugLogs</code> "Beide Eingaben sind in Ordnung". So würde diese Komposition aussehen: [[File:Add debug log expanded.png|frame|center|alt=Implementierung der Komposition mit Debug-Protokoll hinzufügen, um alle möglichen Ausführungspfade zu protokollieren|Implementierung der Komposition mit Debug-Protokoll hinzufügen, um alle möglichen Ausführungspfade zu protokollieren]] <span id="Accessing_execution_debug_logs"></span> === Zugriff auf Ausführungs-Debug-Protokolle === Unabhängig davon, ob deine Ausführungsprotokolle über <code>Wikifunctions.Debug()</code> oder die integrierte Funktion {{Z|Z854}} hinzugefügt werden, werden sie als Teil der Antwort-Metadaten zurückgegeben. Um die Protokolle zu sehen, klicke nach dem Ausführen deiner Funktion auf die Schaltfläche "Details", die unten im Abschnitt "Ergebnis" erscheint. Die Fehler- und Debug-Informationen werden oben im Dialogfeld "Details" angezeigt. Dies ist das Ergebnis, das du sehen würdest, wenn du die Komposition aus unserem vorherigen Beispiel mit gültigen und ungültigen Eingaben ausführst: {| class="wikitable" | [[File:Execution logs success.png|frameless|center|alt=Funktions-Metadatendialog für eine erfolgreiche Ausführung mit Debug-Protokollen]] | [[File:Execution logs failure.png|frameless|center|alt=Funktions-Metadatendialog für eine fehlgeschlagene Ausführung mit Debug-Protokollen]] |- | Funktions-Metadatendialog für eine erfolgreiche Ausführung: zeigt keine Fehler an, sondern das Protokoll der erfolgreichen Ausführung: ''"Beide Eingaben sind in Ordnung!"'' | Funktions-Metadatendialog für eine fehlgeschlagene Ausführung: zeigt die Fehlerinformationen und das zusätzliche Ausführungsprotokoll für den ersten Fehlerzweig an: ''"Fehler bei erster Eingabe"'' |} [[Category:How to create implementations| {{#translation:}}]] a2gt14hkq8hbj9zxunpcg89nleynu15 Wikifunctions:How to create implementations/it 4 9368 331116 276452 2026-10-23T08:23:23Z FuzzyBot 207 Updating to match new version of source page 331116 wikitext text/x-wiki <languages/> Questa pagina fornisce una guida più dettagliata al '''creare''' implementazioni, oltre alla panoramica di {{ll|Wikifunctions:Introduction}}. <div lang="en" dir="ltr" class="mw-content-ltr"> == Types of Implementations == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In Wikifunctions, an '''implementation''' can take one of two main forms: '''code''' or '''composition'''. A code implementation directly expresses the function’s logic in any of the available programming languages (currently, Python3 or JavaScript). It’s most useful when the function’s behavior can’t easily be built from existing Wikifunctions, or when precise control over data processing is needed. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> A composition implementation, on the other hand, defines the function entirely by combining other existing functions, without writing code. Compositions are easier to understand, reuse, and translate into other languages automatically, but they depend on suitable building blocks already being available and often are less performant. In general, start by checking whether your goal can be achieved through composition; if it can’t, or if performance or fine-grained logic matters, choose a code implementation instead. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> There's a third type of implementation: '''built-ins'''. These are run by system-built code, and are not editable. Most likely all pre-defined functions will have a built-in implementation. In such cases, when opening the implementation page, you will see a message stating ''"{{int|wikilambda-implementation-selector-none}}"'' </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Practice Test-Driven Development == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> '''Test-Driven Development''', or '''TDD''', is a way of creating software where you write tests before you write the actual code. Tests are just a way of understanding what your function is supposed to do by listing examples and how they should work. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In Wikifunctions, writing tests first offers significant benefits. If you are working on an implementation, you can run your code against the existing tests to check that it behaves as expected. This makes it easier to catch errors early before even publishing your implementation. Tests are also a powerful way to describe the function you need. By writing tests, '''you clearly communicate the expected behavior''', and the community can step in and help with the implementation, or create alternative implementations. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Imagine you want to implement a Function that combines two strings with a space in between. A basic test for this might look like: </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello", "world" ) => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Once you have defined the basic behavior, it's important to '''think about edge cases'''—situations where the inputs are such that you might need some special behavior. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, what if your first string ends in a space, or your second string starts with a space? Should the function keep all existing spaces and add another one, or should it return a neatly spaced result with just a single space between the words? Depending on your requirements, you should build a test for such a case. For example, a test for this edge case could be either one of these — but not both!: </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> or ... </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Make sure that all possible special cases are covered by your tests, and once you have them, make sure that they are all connected to the Function by selecting them and clicking "Connect". </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Code implementations == </div> [[File:Code implementation.png|thumb|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions code editor initialized with a function template</span>|<span lang="en" dir="ltr" class="mw-content-ltr">When adding a new code implementation, the function template is initialized with the function and argument names</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> When creating an implementation using code, the Wikifunctions UI will set up a code editor with the selected language activated for syntax highlighting and validation. When the function to implement and the programming language are selected, this editor will be set with the correct function template: '''do not remove or edit this'''! Keep your code inside this function signature: if you need auxiliary functions, you can simply declare them inside your top-level function declaration. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Using input types in your code === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions types {{Z|Z6}} and {{Z|Z40}} can be used as if they were native types in both JavaScript and Python3. For example, a String input can be concatenated or a Boolean be directly used in a logical expression. To use other types in your code implementations, you will have to look deeper into the type, figure out if it has a conversion to a native equivalent, and treat it accordingly. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, let's say we want to write some Python code that handles an input of type {{Z|Z20420}}. In the page for this type, let's look at its "type converters to code" and search for a Python one. The converter {{Z|Z20424}} will be applied to our date input before our code, so looking at "native type" we know that our input will be a Python ''dict'' and looking at the implementation we can see the keys we can expect: </div> <syntaxhighlight lang="python3"> return { 'K1': year, 'K2': month, 'K3': day } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> When a type doesn't have a converter, you'll have to access its parts directly using its keys. For example, let's assume that your function <code>Z30000</code> has one input <code>Z30000K1</code> of type {{Z|Z11}}. This type has two keys: <code>Z11K1</code> for the language (itself an object of type {{Z|Z60}}), and <code>Z11K2</code> for the string value. Similarly, the language object has a key <code>Z60K1</code> for the language code. So, to get a string with the language code and the text, you can write: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1 ) { // e.g. "en: some text" return Z30000K1.Z11K1.Z60K1 + ": " + Z30000K1.Z11K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> For a quick reference of the available type conversions visit [[Special:MyLanguage/Wikifunctions:Execution targets#Default type conversion|the default type conversion table]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Returning the right outputs === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Similarly to the way you treat inputs, outputs need to match the type specified in the function definition. Some can be treated as simply as native types, so any string output will be converted into a Wikifunctions {{Z|Z6}} object and any native boolean returned by your implementation will be converted into a Wikifunctions {{Z|Z40}} object. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Those types that have "type converters from code" will apply the appropriate function to the output, in order to build the required type. Following the example of {{Z|Z20420}}, the {{Z|Z20443}} will transform the output from your implementation–a dict with K1, K2 and K3 keys–into its correct ZObject representation. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For types that don't have converters from code, you can carefully build and return the output objects. For example, imagine that our function <code>Z30000</code> takes two string inputs: language code and text, and should return a {{Z|Z11}} object. You can do this in Python by using the <code>ZObject</code> constructor: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): lang_object = ZObject( {"Z1K1": "Z9", "Z9K1": "Z60"}, Z60K1 = Z30000K1 ) return ZObject( {"Z1K1": "Z9", "Z9K1": "Z11"}, Z11K1 = lang_object, Z11K2 = Z30000K2 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Or in JavaScript: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { const langObject = new ZObject( new Map( [ [ "Z60K1", Z30000K1 ] ] ), { "Z1K1": "Z9", "Z9K1": "Z60" } ); const monolingualKeys = new Map( [ [ "Z11K1", langObject ], [ "Z11K2", Z30000K2 ] ] ); return new ZObject( monolingualKeys, { "Z1K1": "Z9", "Z9K1": "Z11" } ); } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> You can learn more about the <code>ZObject</code> class and other useful constructors in {{ll|Wikifunctions:Execution_targets#Custom_and_non-built-in_type_conversion}} </div> {{phab|T392750}}<div lang="en" dir="ltr" class="mw-content-ltr"> As of 2026-05, trying to return a list of lists may fail, so you're not able to implement such functions in code. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Code in Python === </div> <div class="mw-translate-fuzzy"> Di seguito diamo un esempio concreto di come creare una implementazione nella forma di Codice in Python. Mettiamo di voler creare una implementazione di una Funzione che accetta due stringhe in input, le combina mettendo uno spazio fra di loro e restituisce il risultato dell'operazione. Assumiamo che lo ZID di quella funzione sia Z11057. </div> <div class="mw-translate-fuzzy"> L'implementazione è definita utilizzando lo ZID della funzione. Lo sono anche gli argomenti della funzione. Quindi nel caso della funzione Z11057 e dei suoi due argomenti, la prima riga risulterà così: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> As we described before, we know that the arguments (<code>Z30000K1</code> and <code>Z30000K2</code>) are Strings, so we can treat them as simply as we use native strings in Python. Also, the function should return a String. For our example, we simply return the two arguments concatenated with a space in between: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): return Z30000K1 + " " + Z30000K2 </syntaxhighlight> Visto che è Python, ricordati di indentare correttamente la riga. <div lang="en" dir="ltr" class="mw-content-ltr"> If you have followed our advice to [[#Practice Test-Driven Development|practice TDD]], you will already have a set of tests that you know should work. If that's the case, while building your implementation you can click on the circular arrow in the Tests panel, and see if your implementation passes all of them. </div> Ricorda che l'ambiente di esecuzione non ha stato. Non dare per certi i valori per variabili globali o statiche. Se hai ulteriori domande su cosa puoi e non puoi fare in Python, chiedi su [[Wikifunctions:Python implementations]]. <div lang="en" dir="ltr" class="mw-content-ltr"> === Code in JavaScript === </div> <div class="mw-translate-fuzzy"> Di seguito forniamo un esempio concreto su come creare una implementazione nella forma di Codice Javascript. Mettiamo di voler creare una implementazione per una Funzione che combina due stringhe di input mettendo uno spazio fra di esse, restituendo il risultato dell'operazione. Supponiamo che lo ZID di quella funzione sia Z11057. </div> <div class="mw-translate-fuzzy"> L'implementazione è definita utilizzando lo ZID della funzione, proprio come lo sono gli argomenti. Quindi nel caso della funzione Z11057 con i suoi due argomenti, la prima riga di codice dovrebbe essere: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> We know that the arguments (<code>Z30000K1</code> and <code>Z30000K2</code>) are Strings, so we can treat them as native strings in JavaScript. Also, the function should return a String. To complete our function, you can then add a line concatenating the input strings, like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> If you have tests as recommended in the [[#Practice Test-Driven Development|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes all of them. </div> Ricorda che l'esecuzione non ha uno stato. Non assumere valori per variabili globali o statiche. Se hai ulteriori domande su cosa puoi o non puoi fare in JavaScript chiedi su [[Wikifunctions:JavaScript implementations]]. <div lang="en" dir="ltr" class="mw-content-ltr"> === Calling another Wikifunctions function === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> A code implementation can call certain other Wikifunctions functions, receive the output of the call, and use that output in further processing. We refer to such calls as callbacks. At present, due to security and performance concerns, only the following built-in Wikidata fetch and search functions can be called in this way: {{Z|Z6820}}, {{Z|Z6821}}, {{Z|Z6822}}, {{Z|Z6824}}, {{Z|Z6825}}, {{Z|Z6826}}, {{Z|Z6830}}, and {{Z|Z6831}}. This capability is in an initial stage of deployment; we hope to allow calls to a broader range of functions in the future. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Let’s look at a JavaScript implementation containing a callback. This implementation fetches an item from Wikidata, extracts the label of that item in a given language, and returns the label string. The item to fetch is given by argument <code>Z400K1</code>, and the language is given by <code>Z400K2</code>. </div> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const item = Wikifunctions.Call('Z6821', Z400K1); for (const label of item.Z6001K2.Z12K1) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> A callback is made by calling <code>Wikifunctions.Call</code>, as shown in the example. The first argument to <code>Wikifunctions.Call</code> is always the ZID of the function to be called – in this case, {{Z|Z6821}}, which takes a single argument. Following that, the arguments to be passed to that function are listed, separated by commas. Here, that argument, <code>Z400K1</code>, is the same value that was passed to the function <code>Z400</code>. This is a common pattern of argument passing to callbacks, but their arguments can also be built using the <code>ZObject</code> constructor (as explained above), or obtained in other ways. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The value of <code>Z400K1</code> would be an instance of {{Z|Z6091}}, containing the QID of the item to be fetched. Line 2 of the example calls <code>Z6821</code> to fetch that item from Wikidata and assigns the resulting ZObject to the const <code>item</code>. The remaining code iterates over the item’s labels until it finds the one matching the language given by <code>Z400K2</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For the first example above, we have used <code>Z6821</code> for simplicity. However - unless an entire entity is needed by the implementation, it is strongly recommended to use <code>Z6820</code> to retrieve Wikidata items, which can be quite large. Although a call to <code>Z6820</code> is a bit more complex, its parameters allow for fetching selected portions of a Wikidata item, which can greatly improve performance and avoid some errors, by reducing the network bandwidth and processing time that are needed. (<code>Z6820</code> can also be used in place of <code>Z6822</code>, <code>Z6824</code>, <code>Z6825</code>, and <code>Z6826</code>, to get similar bandwidth-reduction benefits.) </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Just below we show how <code>Z6820</code> can be used, in <code>Wikifunctions.Call</code>, to implement the same behavior as above. Note that we use the second argument passed to <code>Z6820</code>, <code>[labelsPart]</code>, to say “Just return the item’s labels”, and we use the third argument, <code>[Z400K2]</code>, to say “Just return labels in the given language”. (This argument would also apply to aliases and descriptions, if they were included in the result.) </div> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const labelsPart = new ZObject( new Map( [ ['Z6030K1', new ZReference('Z6033')] ] ), {Z1K1: 'Z9', Z9K1: 'Z6030'} ); const entities = Wikifunctions.Call( 'Z6820', [Z400K1], [labelsPart], [Z400K2], []); const item = entities.get(Z400K1.Z6091K1); const labels = item.Z6001K2.Z12K1; for (const label of labels) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Other things to note: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Even though code implementations are now able to fetch Wikidata entities, it is recommended that they not be written to return ''entire'' entities. This is because of current limitations on the size of the value returned from a code implementation. To fetch and return an entire large entity, it’s better to call the fetch function from a composition.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Only one callback can execute at a time. For security reasons, it is not possible to use the concurrency features of JavaScript or Python to execute multiple callbacks in parallel.</span> ** <span lang="en" dir="ltr" class="mw-content-ltr">Keep in mind, however, that you can fetch multiple entities at once using Z6820.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">There is currently a 3 MiB limit on the size of Wikidata content that can be returned to a code implementation, by a single callback. The same limit applies to the size of the result returned from a code implementation.</span> <span id="Compositions"></span> <div class="mw-translate-fuzzy"> == Composizione == </div> <div class="mw-translate-fuzzy"> In questa sezione presentiamo un esempio concreto su come creare una implementazione nella forma di una composizione. Assumiamo di voler creare un'implementazione per una funzione che concatena le due stringhe in ingresso mettendo uno spazio tra esse, e ne restituisce il risultato. Assumiamo che lo ZID di tale funzione sia Z11057. </div> <div class="mw-translate-fuzzy"> Solitamente è una buona idea iniziare pensando come combinare le funzioni già esistenti per ottenere il risultato desiderato. A volte ciò potrebbe essere triviale, permettendoti quindi comporre direttamente le funzioni, ma in molti casi è utile segnarsi con carta e penna la composizione che vuoi creare: l'interfaccia di composizione di Wikifunctions non è ancora troppo intuitiva. </div> <div class="mw-translate-fuzzy"> Per esempio, per questa funzione, potremmo usare la funzione già esistente [[{{Z|Z10000}}]], che prende in ingresso due stringhe e le concatena. Ma abbiamo bisogno di aggiungere uno spazio tra le due stringhe. Quindi possiamo concatenare la prima stringa con uno spazio, e poi concatenare la stringa risultante con la seconda stringa. La nostra composizione può essere rappresentata come: </div> <syntaxhighlight lang="prolog"> join_strings( join_strings( Z30000K1, " " ), Z30000K2 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> There are multiple ways to write a composition: notice that the same thing could be accomplished with: </div> <syntaxhighlight lang="prolog"> join_strings( Z30000K1, join_strings( " ", Z30000K2 ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> An alternative implementation could also use the existing Function {{Z|Z15175}}, so your composition could be: </div> <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> As you can see, there are multiple ways to accomplish this, so take your time and explore the existing functions available in the {{ll|Wikifunctions:Catalogue}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's try to create the second example, <code>join_strings(Z30000K1, join_strings(" ", Z30000K2))</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In order to create this: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›" icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search for the name of the outermost function you want to use, which in this example is "join two strings". Then, select the wanted function from the dropdown list.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">You will see two new fields, one for each of the arguments needed for the selected function.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">For the first argument, we want to select the first input to our function:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and select "Argument reference".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id" you can now select the first string of your function from the dropdown, which contains all available inputs.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">For the second argument, we want to use the result of another call to "join two strings":</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and select "Function call".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function you want to call, which is again "join two strings".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For this inner function call, configure the "first string" by simply typing a white space in the text field, and configure the "second string" as you did for step 6: change it using the "…" button to "Argument reference", and then select the second argument in the dropdown.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Your composition is now complete! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You can expand and collapse the details using the chevron buttons to see how it looks. If you already have Tests as recommended in the [[#Practice Test-Driven Development|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes the tests. Once your composition passes the tests, go ahead and publish it. </div> [[File:Composition implementation expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its expanded view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its expanded view</span>]] [[File:Composition implementation collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its collapsed view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its collapsed view</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions error handling == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As a Wikifunctions function creator, you might want to warn the user calling your function when something goes wrong in the code, or when their inputs do not fit a certain criteria. For example, if your Function expects a string input to contain a name, you might want to check that the name is not empty and, if it is, show an error message that the person using your Function can understand. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For this purpose, you can use <code>Wikifunctions.Error()</code> from your code implementations or the function {{Z|Z851}} from your compositions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section you will learn: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">How to throw errors from both code and composition implementations,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to write tests for error cases, and</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to catch and handle errors thrown by functions that you are using in your compositions.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Throwing errors from code implementations === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> When writing code, both from JavaScript and Python, you can use <code>Wikifunctions.Error()</code> to end the execution with a wanted error. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> <code>Wikifunctions.Error()</code> has two parameters: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Error type: a string containing the ZID of the error type you want to return.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Error arguments: a list of string arguments to build the error.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's go one by one: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Error type ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> An error type is an object that describes a kind of error that could happen in the system. There are a number of built-in error types but you can also build other error types that are more suited to your use case. When using errors, the best idea is to browse through the available error types, which can be explored in [[Special:ListObjectsByType/Z50|this list]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If there are no errors that fit your case, create a new one by going to the create page, and selecting "Error type" in the type selector. Then, set the necessary fields: </div> [[File:Error type.png|thumb|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Error type creation in Wikifunctions</span>|<span lang="en" dir="ltr" class="mw-content-ltr">To create new Error type (Z50), edit the label and add the necessary keys.</span>]] * <span lang="en" dir="ltr" class="mw-content-ltr">'''Label''' – This is the main title of the error, which should contain a short but descriptive message. Set the error label on the right-side box titled "About".</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Keys''' – Keys contain additional information about what caused the error. For example, if an input had the wrong format, you might want to inform the user of what was the input content when raising the error. To use them in your implementations, keys should be strings. To create a key, click on the "[+]" icon below "keys", select "String" under "value type", and add a label that describes it appropriately, for example "current input". Once you have all the necessary keys, you can Publish your error type and keep the ID of the newly created object.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error message''' – Error types can contain a multilingual array of HTML parametrized error messages. The parameter notation is $1, $2, etc., where the digit corresponds to the error type key. For example, when creating an error type with one string key "current input", the error message can use the positional parameter "$1", which will be replaced with the value of the "current input" key at the time of rendering the error. To add HTML messages, click on the "[+]" icon below "html fragments", select a language and input the HTML string.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Error arguments ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Error arguments correspond to the keys of the Error type, and they should provide additional information to understand the error. Error arguments should always be Strings. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Wikifunctions.Error() ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say that you want an error to be thrown when either your first or your second input are empty. You have already created the error type, and the assigned ZID was <code>Z30005</code>. Your error type has two string keys: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Input key: contains the key of the failing input</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Input value: contains the current value of the failing input</span> <div lang="en" dir="ltr" class="mw-content-ltr"> To raise an error in your JavaScript implementation you should do something like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { // If the first input is empty, raise error Z30005 // with two string args: [ first input key, first input value ] Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { // If the second input is empty, raise error Z30005 // with two string args: [ second input key, second input value ] Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> To raise an error in your Python implementation you should do something like this: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": # If the first input is empty, raise error Z30005 # with two string args: [ first input key, first input value ] Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": # If the second input is empty, raise error Z30005 # with two string args: [ first input key, first input value ] Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Remember that calling <code>Wikifunctions.Error()</code> ends the execution! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Throwing errors from compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If you are creating a composition implementation, you can throw an error by calling the special function {{Z|Z851}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Throw Error function (Z851) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z851}} function is similar to the <code>Wikifunctions.Error()</code> method and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – A reference to the Error type you want to raise</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error parameters''' – A list with the arguments to create your Error, which should also be Strings.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Throw Error ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say you want to modify your composition so that it first checks that the arguments are not empty, and raises an error when it finds an empty one. Then, if none of them are empty, it runs the original composition, which is: </div> <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> To do this, you need to create conditional paths, for which you can use the {{Z|Z802}} function. Think of it like this: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the first argument is empty, throw an error for the first argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Else, proceed to check the second argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the second argument is empty, throw an error for the second argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Else, proceed with the success path and return the joint strings with the space separator</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Or in functional pseudo code: </div> <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), throw_error( Z30005, [ "Z30000K1", Z30000K1 ] ), if( is_empty_string( Z30000K2 ), throw_error( Z30005, [ "Z30000K2", Z30000K2 ] ), join_with_separator( Z30000K1, Z30000K2, " " ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's create this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+” button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›” icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the outermost function you want to use, which in this case is "if".</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Check the validity of the first argument:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "condition", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "is empty string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "input", click on the "…" button and select "argument reference"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id", select the first input (e.g. "first string")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse the "condition" function call if you want, by clicking on the down-chevron next to "condition". You should see something like "f(x) is empty string( → first string )"</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Throw error if the condition is true:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "then", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Throw Error"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error type", search and select your error type (you can directly input the error ID if you know it, e.g. Z30005)</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error parameters", add two items by clicking on the "+" button</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For "Item 1" (offending argument key), set its type to "String" and write the argument identifier (e.g. "first input", or "Z30000K1")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For "Item 2" (offending argument value), click on the "…" next to "Item 2" and select "argument reference"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id", select the first input (e.g. "first string")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse the "then" function call if you want, by clicking on the down-chevron next to "then". You should see something like "f(x) Throw Error( Input was the wrong format, Typed list( Object, "first input", → first string ) )"</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Continue to check the second argument if the first was good:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "else", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "if"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Set up "condition" to check the validity of the second argument by following the same process as described in step 5.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Set up "then" to throw an error for the second argument by following the same process as described in step 6.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Finally, set up the success path:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to the nested "else", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the successful function, which in this case can be "join strings with separator"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and set it to "argument reference", then select "first string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and set it to "argument reference", then select "second string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "separator" add a space into the text field</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The resulting function call should look like this: </div> [[File:Throw error expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function</span>]] [[File:Throw error collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function, in its collapsed view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function, in its collapsed view</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Handling errors in compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> While it is useful to allow functions to raise expected errors, it is crucial to be able to handle errors in your compositions in order to safely use these functions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say you want to create a new function "full name of a person" – we will refer to it with the ZID <code>Z30010</code>. This function should return the full name of a person given a first and last names, but if any of the two fields are empty, it should return the text "Unknown" instead. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You could create a composition using our example function "Join two strings with a space" or <code>Z30000</code> to generate the name. If any of the inputs are empty, you know that <code>Z30000</code> will throw an error of type <code>Z30005</code>. Using the function {{Z|Z850}} as a wrapper, you can attempt the join operation and intercept a possible error to simply return "Unknown" whenever it occurs. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Try-Catch function (Z850) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z850}} function is built-in with ZID <code>Z850</code> and takes three arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – The initial function call to run. If nothing goes wrong, the response will be the result of this function call.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – An error type to catch in case it is thrown during the execution of the first function call.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error handler''' – A function call that will be run in case the error specified above is caught during the execution of the initial function call. If that happens, the result of the error handler will be the value returned.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Try-Catch ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Once we have all the functions for our composition, we can craft it like this: </div> <syntaxhighlight lang="prolog"> try_catch( join_with_space( Z30010K1, Z30010K2 ), Z30005, echo( "Unknown" ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This means that: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">The "Join two strings with a space" function will be tried with the two inputs and, if everything goes well, the output of this function will be returned</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If any of the inputs are blank, "Join two strings with a space" with raise an error of type <code>Z30005</code></span> * <span lang="en" dir="ltr" class="mw-content-ltr">Our {{Z|Z850}} will then detect this error and run the {{Z|Z801}} function to return "Unknown"</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's create this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›” icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the outermost function you want to use, which in this case is "Try-Catch".</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Set the main function call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under the field where the "Try-Catch" function is selected, next to the "function call" key, click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the function "join two strings with space"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and select "argument reference", then select the "first name" argument from the dropdown.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and select "argument reference", then select the "second name" argument from the dropdown.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Select the error to catch:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error type", search and select "bad string input" – you can search directly by its ZID <code>Z30005</code></span> # <span lang="en" dir="ltr" class="mw-content-ltr">Set the error handler function call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "error handler", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "echo"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "input" and "type", search and select the type "String"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now, under "input", type "Unknown" in the text field</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The resulting function should look like this: </div> [[File:Try catch expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in expanded mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in expanded mode</span>]] [[File:Try catch collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in collapsed mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in collapsed mode</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Testing your failure use cases === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As we introduced in the above section about [[#Practice Test-Driven Development|practicing TDD]], it's important to test not only the most common paths, but also the possible edge cases. It is equally important to test failure behavior. In this section we will give you the tools necessary to test that your function fails with a given set of inputs, and that the error thrown is the expected one. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> To do that, you will need other two system functions: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Is error type (Z852) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z852}} function is built-in with ZID <code>Z852</code> and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error''' – An {{Z|Z5}} object, which can be thrown by a failing call. An error instance has a type and a value.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – A reference to an {{Z|Z50}} which will be compared to the type of the Error passed as a first argument. If that's the case, the function will return true.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Get error thrown by function call (Z853) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z853}} function is built-in with ZID <code>Z853</code> and takes one argument: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – A function call which can either return a successful value of any type, or throw an error.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> This function returns a {{Z|Z882}} with a {{Z|Z40}} in first place and an {{Z|Z1}} in the second: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the Function call runs successfully and hence does not throw any error, the returned pair will contain False in the first place, and void in the second.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the Function call throws an error, the returned pair will contain True in the first place, and the caught error in the second.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> To use this function in your compositions, you might need to use the additional functions: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">{{Z|Z821}}, and</span> * {{Z|Z822}} <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Testing errors ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say our target function, "Join two strings with a space" or <code>Z30000</code>, throws an error of type <code>Z30005</code> and we want to test this behavior. To do that we need to: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Throw a failing function call</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Get the error using the function {{Z|Z853}}</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Check that the error is the right type with {{Z|Z852}}</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Tests have two fields: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Call''' – A function call that will produce an output with the inputs you want to test. This call will return a value.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Result validation''' – A function call that will validate that the value returned by the call above is the expected one. The first argument of this function call will be automatically assigned to take the return value of the first call.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> For step-by-step instructions on how to create tests, see {{ll|Wikifunctions:Introduction#Create_tests}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In our example, we can structure it like this — but this is not the only way! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The call, which will return an {{Z|Z5}} object: </div> <syntaxhighlight lang="prolog"> error = get_second_element_of_typed_list( get_error_thrown_by( join_strings_by_whitespace( "", "not empty" ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> And the result validation, which will take the {{Z|Z5}} object as its first argument: </div> <syntaxhighlight lang="prolog"> is_error_type( error, Z30005 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's do this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding a test by clicking on the "+" button in the "Tests" table from your Function page. The "call" and "result validation" fields already have some functions pre-set, but to test the errors we will need to change them.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">First, let's set the call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "call", click the "›" chevron button to expand the function call.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", edit the field and search and select the function "Get second element of a typed pair"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Once selected, next to "Typed pair", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Get error thrown by function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "function call", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Join two strings with a space" (or by ZID <code>Z30000</code>)</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now set the inputs so that they cause a failure: at least one of them should be empty.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse your "call" by clicking again on the down-chevron button if you want!</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Next, let's set the result validation:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "result validation", click the "›" chevron button to expand the function call.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", edit the field and search and select the function "Is error type"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now you will only be asked to configure the second argument. Under "error type", search and select your <code>Z30005</code> error type.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">And you are done! You can now click the circular arrow in the "Implementations" box and you should see green checks.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> If everything went right, you can now save your test. It should look like this: </div> [[File:Get error expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in expanded mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in expanded mode</span>]] [[File:Get error collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in collapsed mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in collapsed mode</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Creating actionable error messages === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As described above, Error Types have an optional key <code>Z50K3</code> which contains a multilingual list of HTML strings. When rendering information about an error, the messages stored in the error type can help create a clear, precise, informative, translatable and actionable error message. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For that purpose, error messages can contain parameters like <code>$1</code>, <code>$2</code>, etc., where the digit corresponds to the error type argument and its value in the error instance. These error messages are rendered in Wikifunctions inside the "Details" dialog window after executing a function call. Additionally, these error messages are surfaced in other client interfaces, like Abstract Wikipedia, to provide better guidance to Abstract Content editors. </div> [[File:Wikifunctions actionable error message example in the Details dialog.png|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">The error message is rendered using the HTML message of the error type and the error argument values.</span>]] [[File:Wikifunctions actionable error message example in Abstract Wikipedia.png|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">When available, the HTML error message is rendered in the Abstract Wikipedia preview section.</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> Let's use a real example to understand the benefits of HTML error messages: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The function {{Z|Z37847}} returns the first Lexeme reference given a Wikidata Item reference and a language. When there is no Lexeme for this Item-Language combination, it throws an error of type {{Z|Z28248}}, which has three keys: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K1''' is the input Wikidata item QID</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K2''' is the connecting property, in this case <code>P5137/item for this sense</code></span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K3''' is the language code</span> <div lang="en" dir="ltr" class="mw-content-ltr"> When calling this function for a Wikidata lexeme that doesn't exist, the call will throw an error instance like this: </div> <syntaxhighlight lang="json" highlight="10,12"> { "Z1K1": "Z5", "Z5K1": "Z28248", "Z5K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z885", "Z885K1": "Z28248" }, "Z28248K1": "Q319", "Z28248K2": "P5137", "Z28248K3": "ast" } } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> While the error type label indicates: <code>No matching lexeme for item in language</code>, a better error message should indicate: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">which is the failing item,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">which is the language missing, and</span> * <span lang="en" dir="ltr" class="mw-content-ltr">what are the possible ways to fix it.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The error message <code>Z50K3</code> field can provide this functionality. Whenever an Error Type has an error message for the user language (or any of its fallbacks), the error message shown will be rendered by: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">First, replacing the message parameters with the values of the keys. In our example, any <code>$1</code> will be replaced with the value of <code>Z28248K1</code> ("Q319"), <code>$2</code> with "P5137", and <code>$3</code> with "ast",</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Last, sanitizing and rendering the HTML message.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> So a HTML message like: </div> <syntaxhighlight lang="html"> There is no matching lexeme for the item $1 in "$3".<br> <a href="http://wikidata.org/wiki/$1">Edit in Wikidata</a> </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Will become: </div> : There is no matching lexeme for the item Q319 in "ast" : [[d:Q319|Edit in Wikidata]] <div lang="en" dir="ltr" class="mw-content-ltr"> == Debugging your implementations == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Sometimes things can go wrong. A function might behave differently than expected or a value might not look quite right. Sometimes implementations are really complex and, because they are run in a sandboxed environment, it can seem really difficult to debug. To help understand what's going on inside a function call, Wikifunctions includes a small set of debugging tools. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> These tools don't change the result of a function, but will add extra information to the returned metadata, which you can observe after running the function. You can use <code>Wikifunctions.Debug()</code> from your code implementations or the function {{Z|Z854}} from your compositions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section you will learn: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">How to add debug messages from both code and composition implementations,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to inspect the metadata manually or via the UI to inspect these logs.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Debugging your code implementations === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> When writing code, both from JavaScript and Python3, you can use <code>Wikifunctions.Debug()</code> to add a message to your debugging log and continue the execution. </div> {{phab|T441028}} <div lang="en" dir="ltr" class="mw-content-ltr"> <code>Wikifunctions.Debug()</code> has one parameter, which is generally expected to be a string. However, any other object passed as parameter will get directly converted into a string. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If we want to add debug logs to our code implementations for our "Join two strings with a space" example function, we can do, in JavaScript: </div> <syntaxhighlight lang="JavaScript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { Wikifunctions.Debug( `first input is empty "${ Z30000K1 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { Wikifunctions.Debug( `second input is empty "${ Z30000K2 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } Wikifunctions.Debug( "both inputs are fine" ); return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> And the same in your Python3 implementation will be: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": Wikifunctions.Debug( 'first input is empty "'+Z30000K1+'"' ) Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": Wikifunctions.Debug( 'second input is empty "'+Z30000K2+'"' ) Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) Wikifunctions.Debug( 'both inputs are fine' ) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This way, no matter what happens, we will be adding one message to your debugging logs: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the function call fails when checking on the first or second input, the result of the execution will be a failure, but it will contain one informative log about what branch caused the failure.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the function call succeeds—because both inputs are valid—the function call will return the joined string, but the returned metadata will also contain a debug log.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Debugging your compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> To support debugging compositions, Wikifunctions provides the built-in function {{Z|Z854}}. This function allows you to attach debug messages to the execution of any function call that generates the final output. The debug logs collected during the evaluation are returned as part of the execution metadata, under the <code>executorDebugLogs</code> key. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Add debug log to function call (Z854) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z854}} function is built-in with ZID <code>Z854</code> and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – Any composition you want to execute.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Debug log''' – A string message that will be recorded if the given function call is evaluated.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> When the wrapped function call runs, the provided message is added to the execution logs. If that function call is not executed, or its execution is not part of the final output, its debug log will not appear in the final result metadata. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You will benefit from this built-in if you want to observe: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Which branch of a conditional was executed, or</span> * <span lang="en" dir="ltr" class="mw-content-ltr">the order of evaluation in a composition.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Add debug log to function call ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say that you want to add debug logs to our example function "Join two strings with a space" or <code>Z30000</code>, so that different messages are added to the different possible outcomes. You could use our debugging builtin like this: </div> <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), add_debug_log( throw_error( Z30005, ... ), 'failed on first input' ) if( is_empty_string( Z30000K2 ), add_debug_log( throw_error( Z30005, ... ), 'failed on second input' ), add_debug_log( join_with_separator( Z30000K1, Z30000K2, " " ), 'both inputs are ok!' ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This way, </div> * <span lang="en" dir="ltr" class="mw-content-ltr">when called with an empty first input, the function will return a failed response, and the metadata will contain an <code>executorDebugLogs</code> entry with the "failed on first input" log.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">When called with an empty second input, the call will also fail, but the logged message will be "failed on second input"</span> * <span lang="en" dir="ltr" class="mw-content-ltr">When called with valid inputs, the function will return a successful response, and additionally the metadata will contain "both inputs are ok" in its <code>executorDebugLogs</code> key.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> This is the way this composition would look: </div> [[File:Add debug log expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Composition implementation using Add debug logs to log all possible execution paths</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Composition implementation using Add debug logs to log all possible execution paths</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Accessing execution debug logs === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Whether your execution logs are added via <code>Wikifunctions.Debug()</code> or via the {{Z|Z854}} built-in function, they are returned as part of the response metadata. To see the logs, once you run your function, click on the "Details" button that appears at the bottom of the "Result" section. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The error and debug information will appear at the top of the "Details" dialog. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> This is what you would see when running the composition from our previous example with valid and invalid inputs: </div> {| class="wikitable" | [[File:Execution logs success.png|frameless|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a successful execution with debug logs</span>]] | [[File:Execution logs failure.png|frameless|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a failed execution with debug logs</span>]] |- | <span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a successful execution: shows no errors, but displays the successful execution log: ''"both inputs are ok!"''</span> | <span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a failed execution: shows the error information, and the additional execution log for the first failure branch: ''"failed on first input"''</span> |} [[Category:How to create implementations| {{#translation:}}]] t6rh15r3i9nsj4xb38ugmk5i2q4xrtm Wikifunctions:How to create implementations/sv 4 9732 331124 276460 2026-10-23T08:23:30Z FuzzyBot 207 Updating to match new version of source page 331124 wikitext text/x-wiki <languages/> Den här sidan ger en mer detaljerad guide till att '''skapa implementeringar''', utöver översikten {{ll|Wikifunctions:Introduction}}. <div lang="en" dir="ltr" class="mw-content-ltr"> == Types of Implementations == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In Wikifunctions, an '''implementation''' can take one of two main forms: '''code''' or '''composition'''. A code implementation directly expresses the function’s logic in any of the available programming languages (currently, Python3 or JavaScript). It’s most useful when the function’s behavior can’t easily be built from existing Wikifunctions, or when precise control over data processing is needed. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> A composition implementation, on the other hand, defines the function entirely by combining other existing functions, without writing code. Compositions are easier to understand, reuse, and translate into other languages automatically, but they depend on suitable building blocks already being available and often are less performant. In general, start by checking whether your goal can be achieved through composition; if it can’t, or if performance or fine-grained logic matters, choose a code implementation instead. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> There's a third type of implementation: '''built-ins'''. These are run by system-built code, and are not editable. Most likely all pre-defined functions will have a built-in implementation. In such cases, when opening the implementation page, you will see a message stating ''"{{int|wikilambda-implementation-selector-none}}"'' </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Practice Test-Driven Development == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> '''Test-Driven Development''', or '''TDD''', is a way of creating software where you write tests before you write the actual code. Tests are just a way of understanding what your function is supposed to do by listing examples and how they should work. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In Wikifunctions, writing tests first offers significant benefits. If you are working on an implementation, you can run your code against the existing tests to check that it behaves as expected. This makes it easier to catch errors early before even publishing your implementation. Tests are also a powerful way to describe the function you need. By writing tests, '''you clearly communicate the expected behavior''', and the community can step in and help with the implementation, or create alternative implementations. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Imagine you want to implement a Function that combines two strings with a space in between. A basic test for this might look like: </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello", "world" ) => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Once you have defined the basic behavior, it's important to '''think about edge cases'''—situations where the inputs are such that you might need some special behavior. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, what if your first string ends in a space, or your second string starts with a space? Should the function keep all existing spaces and add another one, or should it return a neatly spaced result with just a single space between the words? Depending on your requirements, you should build a test for such a case. For example, a test for this edge case could be either one of these — but not both!: </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> or ... </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Make sure that all possible special cases are covered by your tests, and once you have them, make sure that they are all connected to the Function by selecting them and clicking "Connect". </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Code implementations == </div> [[File:Code implementation.png|thumb|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions code editor initialized with a function template</span>|<span lang="en" dir="ltr" class="mw-content-ltr">When adding a new code implementation, the function template is initialized with the function and argument names</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> When creating an implementation using code, the Wikifunctions UI will set up a code editor with the selected language activated for syntax highlighting and validation. When the function to implement and the programming language are selected, this editor will be set with the correct function template: '''do not remove or edit this'''! Keep your code inside this function signature: if you need auxiliary functions, you can simply declare them inside your top-level function declaration. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Using input types in your code === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions types {{Z|Z6}} and {{Z|Z40}} can be used as if they were native types in both JavaScript and Python3. For example, a String input can be concatenated or a Boolean be directly used in a logical expression. To use other types in your code implementations, you will have to look deeper into the type, figure out if it has a conversion to a native equivalent, and treat it accordingly. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, let's say we want to write some Python code that handles an input of type {{Z|Z20420}}. In the page for this type, let's look at its "type converters to code" and search for a Python one. The converter {{Z|Z20424}} will be applied to our date input before our code, so looking at "native type" we know that our input will be a Python ''dict'' and looking at the implementation we can see the keys we can expect: </div> <syntaxhighlight lang="python3"> return { 'K1': year, 'K2': month, 'K3': day } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> When a type doesn't have a converter, you'll have to access its parts directly using its keys. For example, let's assume that your function <code>Z30000</code> has one input <code>Z30000K1</code> of type {{Z|Z11}}. This type has two keys: <code>Z11K1</code> for the language (itself an object of type {{Z|Z60}}), and <code>Z11K2</code> for the string value. Similarly, the language object has a key <code>Z60K1</code> for the language code. So, to get a string with the language code and the text, you can write: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1 ) { // e.g. "en: some text" return Z30000K1.Z11K1.Z60K1 + ": " + Z30000K1.Z11K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> For a quick reference of the available type conversions visit [[Special:MyLanguage/Wikifunctions:Execution targets#Default type conversion|the default type conversion table]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Returning the right outputs === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Similarly to the way you treat inputs, outputs need to match the type specified in the function definition. Some can be treated as simply as native types, so any string output will be converted into a Wikifunctions {{Z|Z6}} object and any native boolean returned by your implementation will be converted into a Wikifunctions {{Z|Z40}} object. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Those types that have "type converters from code" will apply the appropriate function to the output, in order to build the required type. Following the example of {{Z|Z20420}}, the {{Z|Z20443}} will transform the output from your implementation–a dict with K1, K2 and K3 keys–into its correct ZObject representation. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For types that don't have converters from code, you can carefully build and return the output objects. For example, imagine that our function <code>Z30000</code> takes two string inputs: language code and text, and should return a {{Z|Z11}} object. You can do this in Python by using the <code>ZObject</code> constructor: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): lang_object = ZObject( {"Z1K1": "Z9", "Z9K1": "Z60"}, Z60K1 = Z30000K1 ) return ZObject( {"Z1K1": "Z9", "Z9K1": "Z11"}, Z11K1 = lang_object, Z11K2 = Z30000K2 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Or in JavaScript: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { const langObject = new ZObject( new Map( [ [ "Z60K1", Z30000K1 ] ] ), { "Z1K1": "Z9", "Z9K1": "Z60" } ); const monolingualKeys = new Map( [ [ "Z11K1", langObject ], [ "Z11K2", Z30000K2 ] ] ); return new ZObject( monolingualKeys, { "Z1K1": "Z9", "Z9K1": "Z11" } ); } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> You can learn more about the <code>ZObject</code> class and other useful constructors in {{ll|Wikifunctions:Execution_targets#Custom_and_non-built-in_type_conversion}} </div> {{phab|T392750}}<div lang="en" dir="ltr" class="mw-content-ltr"> As of 2026-05, trying to return a list of lists may fail, so you're not able to implement such functions in code. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Code in Python === </div> <div class="mw-translate-fuzzy"> I det följande visar vi ett konkret exempel på hur man skapar en Implementering i form av Python-kod. Säg att vi vill skapa en implementering för en Funktion som kombinerar två strängar med ett mellansteg mellan dem och returnerar resultatet. Låt oss anta att funktionens ZID är Z11057. </div> <div class="mw-translate-fuzzy"> Implementeringen, liksom argumenten, definieras med hjälp av funktionens ZID. I fallet med funktionen Z11057 och dess två argument skall första raden se ut så här: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> As we described before, we know that the arguments (<code>Z30000K1</code> and <code>Z30000K2</code>) are Strings, so we can treat them as simply as we use native strings in Python. Also, the function should return a String. For our example, we simply return the two arguments concatenated with a space in between: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): return Z30000K1 + " " + Z30000K2 </syntaxhighlight> Glöm inte att indentera raden eftersom det är Python. <div lang="en" dir="ltr" class="mw-content-ltr"> If you have followed our advice to [[#Practice Test-Driven Development|practice TDD]], you will already have a set of tests that you know should work. If that's the case, while building your implementation you can click on the circular arrow in the Tests panel, and see if your implementation passes all of them. </div> Kom ihåg att miljön inte bevarar tillstånd. Anta inte värden för globala eller statistka variabler. Om du har ytterligare frågor om vad du kan och inte kan göra i Pyton, fråga på [[Wikifunctions:Python implementations]]. <div lang="en" dir="ltr" class="mw-content-ltr"> === Code in JavaScript === </div> <div class="mw-translate-fuzzy"> I det följande visar vi ett konkret exempel på hur man skapar en Implementering i form av JavaScript-kod. Säg att vi vill skapa en implementering för en Funktion som kombinerar två strängar med ett mellansteg mellan dem och returnerar resultatet. Låt oss anta att funktionens ZID är Z11057. </div> <div class="mw-translate-fuzzy"> Implementeringen, liksom argumenten, definieras med hjälp av funktionens ZID. I fallet med funktionen Z11057 och dess två argument skall första raden se ut så här: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> We know that the arguments (<code>Z30000K1</code> and <code>Z30000K2</code>) are Strings, so we can treat them as native strings in JavaScript. Also, the function should return a String. To complete our function, you can then add a line concatenating the input strings, like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> If you have tests as recommended in the [[#Practice Test-Driven Development|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes all of them. </div> Kom ihåg att miljön inte bevarar tillstånd. Anta inte värden för globala eller statiska variabler. Om du har ytterligare frågor om vad du kan och inte kan göra i JavaScript, fråga på [[Wikifunctions:JavaScript implementations]]. <div lang="en" dir="ltr" class="mw-content-ltr"> === Calling another Wikifunctions function === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> A code implementation can call certain other Wikifunctions functions, receive the output of the call, and use that output in further processing. We refer to such calls as callbacks. At present, due to security and performance concerns, only the following built-in Wikidata fetch and search functions can be called in this way: {{Z|Z6820}}, {{Z|Z6821}}, {{Z|Z6822}}, {{Z|Z6824}}, {{Z|Z6825}}, {{Z|Z6826}}, {{Z|Z6830}}, and {{Z|Z6831}}. This capability is in an initial stage of deployment; we hope to allow calls to a broader range of functions in the future. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Let’s look at a JavaScript implementation containing a callback. This implementation fetches an item from Wikidata, extracts the label of that item in a given language, and returns the label string. The item to fetch is given by argument <code>Z400K1</code>, and the language is given by <code>Z400K2</code>. </div> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const item = Wikifunctions.Call('Z6821', Z400K1); for (const label of item.Z6001K2.Z12K1) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> A callback is made by calling <code>Wikifunctions.Call</code>, as shown in the example. The first argument to <code>Wikifunctions.Call</code> is always the ZID of the function to be called – in this case, {{Z|Z6821}}, which takes a single argument. Following that, the arguments to be passed to that function are listed, separated by commas. Here, that argument, <code>Z400K1</code>, is the same value that was passed to the function <code>Z400</code>. This is a common pattern of argument passing to callbacks, but their arguments can also be built using the <code>ZObject</code> constructor (as explained above), or obtained in other ways. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The value of <code>Z400K1</code> would be an instance of {{Z|Z6091}}, containing the QID of the item to be fetched. Line 2 of the example calls <code>Z6821</code> to fetch that item from Wikidata and assigns the resulting ZObject to the const <code>item</code>. The remaining code iterates over the item’s labels until it finds the one matching the language given by <code>Z400K2</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For the first example above, we have used <code>Z6821</code> for simplicity. However - unless an entire entity is needed by the implementation, it is strongly recommended to use <code>Z6820</code> to retrieve Wikidata items, which can be quite large. Although a call to <code>Z6820</code> is a bit more complex, its parameters allow for fetching selected portions of a Wikidata item, which can greatly improve performance and avoid some errors, by reducing the network bandwidth and processing time that are needed. (<code>Z6820</code> can also be used in place of <code>Z6822</code>, <code>Z6824</code>, <code>Z6825</code>, and <code>Z6826</code>, to get similar bandwidth-reduction benefits.) </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Just below we show how <code>Z6820</code> can be used, in <code>Wikifunctions.Call</code>, to implement the same behavior as above. Note that we use the second argument passed to <code>Z6820</code>, <code>[labelsPart]</code>, to say “Just return the item’s labels”, and we use the third argument, <code>[Z400K2]</code>, to say “Just return labels in the given language”. (This argument would also apply to aliases and descriptions, if they were included in the result.) </div> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const labelsPart = new ZObject( new Map( [ ['Z6030K1', new ZReference('Z6033')] ] ), {Z1K1: 'Z9', Z9K1: 'Z6030'} ); const entities = Wikifunctions.Call( 'Z6820', [Z400K1], [labelsPart], [Z400K2], []); const item = entities.get(Z400K1.Z6091K1); const labels = item.Z6001K2.Z12K1; for (const label of labels) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Other things to note: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Even though code implementations are now able to fetch Wikidata entities, it is recommended that they not be written to return ''entire'' entities. This is because of current limitations on the size of the value returned from a code implementation. To fetch and return an entire large entity, it’s better to call the fetch function from a composition.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Only one callback can execute at a time. For security reasons, it is not possible to use the concurrency features of JavaScript or Python to execute multiple callbacks in parallel.</span> ** <span lang="en" dir="ltr" class="mw-content-ltr">Keep in mind, however, that you can fetch multiple entities at once using Z6820.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">There is currently a 3 MiB limit on the size of Wikidata content that can be returned to a code implementation, by a single callback. The same limit applies to the size of the result returned from a code implementation.</span> <span id="Compositions"></span> <div class="mw-translate-fuzzy"> == Komposition == </div> <div class="mw-translate-fuzzy"> I det följande visar vi ett konkret exempel på hur man kan skapa en Implementering genom komposition. Säg att vi vill skapa en implementering för en Funktion som kombinerar två strängar med ett mellansteg mellan dem och returnerar resultatet. Låt oss anta att funktionens ZID är Z11057. </div> <div class="mw-translate-fuzzy"> Det är ofta en bra idé att första tänka igenom hur man kan kombinera existerande funktioner för att uppnå ett önskat resultat. Ibland kan det vara trivialt och du kan bara direkt kombinera funktioner. I många fall är det dock värt att dokumentera den önskade kompositionen. Wikifunctions har ett kompositionsgränssnitt som ännu inte är så bra för att redigera kompositioner. Därför är det en bra idé att först komma fram till exakt vad du vill skapa. </div> <div class="mw-translate-fuzzy"> Till exempel, för den givna Funktionen skulle vi kunna använda den existerande [[{{Z|Z10000}}|''Funktionen för att konkatenera strängar'']]. Den funktionen tar två strängar och sätter ihop dem till en sträng. Men vi behöver lägga till ett mellansteg. Därför konkatenerar vi först den första strängen med ett mellansteg och sedan konkatenerar vi resultatet med den andra strängen. Vår komposition bör alltså se ut så här: </div> <syntaxhighlight lang="prolog"> join_strings( join_strings( Z30000K1, " " ), Z30000K2 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> There are multiple ways to write a composition: notice that the same thing could be accomplished with: </div> <syntaxhighlight lang="prolog"> join_strings( Z30000K1, join_strings( " ", Z30000K2 ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> An alternative implementation could also use the existing Function {{Z|Z15175}}, so your composition could be: </div> <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> As you can see, there are multiple ways to accomplish this, so take your time and explore the existing functions available in the {{ll|Wikifunctions:Catalogue}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's try to create the second example, <code>join_strings(Z30000K1, join_strings(" ", Z30000K2))</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In order to create this: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›" icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search for the name of the outermost function you want to use, which in this example is "join two strings". Then, select the wanted function from the dropdown list.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">You will see two new fields, one for each of the arguments needed for the selected function.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">For the first argument, we want to select the first input to our function:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and select "Argument reference".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id" you can now select the first string of your function from the dropdown, which contains all available inputs.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">For the second argument, we want to use the result of another call to "join two strings":</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and select "Function call".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function you want to call, which is again "join two strings".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For this inner function call, configure the "first string" by simply typing a white space in the text field, and configure the "second string" as you did for step 6: change it using the "…" button to "Argument reference", and then select the second argument in the dropdown.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Your composition is now complete! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You can expand and collapse the details using the chevron buttons to see how it looks. If you already have Tests as recommended in the [[#Practice Test-Driven Development|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes the tests. Once your composition passes the tests, go ahead and publish it. </div> [[File:Composition implementation expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its expanded view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its expanded view</span>]] [[File:Composition implementation collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its collapsed view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its collapsed view</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions error handling == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As a Wikifunctions function creator, you might want to warn the user calling your function when something goes wrong in the code, or when their inputs do not fit a certain criteria. For example, if your Function expects a string input to contain a name, you might want to check that the name is not empty and, if it is, show an error message that the person using your Function can understand. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For this purpose, you can use <code>Wikifunctions.Error()</code> from your code implementations or the function {{Z|Z851}} from your compositions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section you will learn: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">How to throw errors from both code and composition implementations,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to write tests for error cases, and</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to catch and handle errors thrown by functions that you are using in your compositions.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Throwing errors from code implementations === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> When writing code, both from JavaScript and Python, you can use <code>Wikifunctions.Error()</code> to end the execution with a wanted error. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> <code>Wikifunctions.Error()</code> has two parameters: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Error type: a string containing the ZID of the error type you want to return.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Error arguments: a list of string arguments to build the error.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's go one by one: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Error type ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> An error type is an object that describes a kind of error that could happen in the system. There are a number of built-in error types but you can also build other error types that are more suited to your use case. When using errors, the best idea is to browse through the available error types, which can be explored in [[Special:ListObjectsByType/Z50|this list]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If there are no errors that fit your case, create a new one by going to the create page, and selecting "Error type" in the type selector. Then, set the necessary fields: </div> [[File:Error type.png|thumb|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Error type creation in Wikifunctions</span>|<span lang="en" dir="ltr" class="mw-content-ltr">To create new Error type (Z50), edit the label and add the necessary keys.</span>]] * <span lang="en" dir="ltr" class="mw-content-ltr">'''Label''' – This is the main title of the error, which should contain a short but descriptive message. Set the error label on the right-side box titled "About".</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Keys''' – Keys contain additional information about what caused the error. For example, if an input had the wrong format, you might want to inform the user of what was the input content when raising the error. To use them in your implementations, keys should be strings. To create a key, click on the "[+]" icon below "keys", select "String" under "value type", and add a label that describes it appropriately, for example "current input". Once you have all the necessary keys, you can Publish your error type and keep the ID of the newly created object.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error message''' – Error types can contain a multilingual array of HTML parametrized error messages. The parameter notation is $1, $2, etc., where the digit corresponds to the error type key. For example, when creating an error type with one string key "current input", the error message can use the positional parameter "$1", which will be replaced with the value of the "current input" key at the time of rendering the error. To add HTML messages, click on the "[+]" icon below "html fragments", select a language and input the HTML string.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Error arguments ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Error arguments correspond to the keys of the Error type, and they should provide additional information to understand the error. Error arguments should always be Strings. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Wikifunctions.Error() ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say that you want an error to be thrown when either your first or your second input are empty. You have already created the error type, and the assigned ZID was <code>Z30005</code>. Your error type has two string keys: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Input key: contains the key of the failing input</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Input value: contains the current value of the failing input</span> <div lang="en" dir="ltr" class="mw-content-ltr"> To raise an error in your JavaScript implementation you should do something like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { // If the first input is empty, raise error Z30005 // with two string args: [ first input key, first input value ] Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { // If the second input is empty, raise error Z30005 // with two string args: [ second input key, second input value ] Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> To raise an error in your Python implementation you should do something like this: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": # If the first input is empty, raise error Z30005 # with two string args: [ first input key, first input value ] Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": # If the second input is empty, raise error Z30005 # with two string args: [ first input key, first input value ] Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Remember that calling <code>Wikifunctions.Error()</code> ends the execution! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Throwing errors from compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If you are creating a composition implementation, you can throw an error by calling the special function {{Z|Z851}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Throw Error function (Z851) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z851}} function is similar to the <code>Wikifunctions.Error()</code> method and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – A reference to the Error type you want to raise</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error parameters''' – A list with the arguments to create your Error, which should also be Strings.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Throw Error ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say you want to modify your composition so that it first checks that the arguments are not empty, and raises an error when it finds an empty one. Then, if none of them are empty, it runs the original composition, which is: </div> <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> To do this, you need to create conditional paths, for which you can use the {{Z|Z802}} function. Think of it like this: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the first argument is empty, throw an error for the first argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Else, proceed to check the second argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the second argument is empty, throw an error for the second argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Else, proceed with the success path and return the joint strings with the space separator</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Or in functional pseudo code: </div> <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), throw_error( Z30005, [ "Z30000K1", Z30000K1 ] ), if( is_empty_string( Z30000K2 ), throw_error( Z30005, [ "Z30000K2", Z30000K2 ] ), join_with_separator( Z30000K1, Z30000K2, " " ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's create this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+” button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›” icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the outermost function you want to use, which in this case is "if".</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Check the validity of the first argument:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "condition", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "is empty string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "input", click on the "…" button and select "argument reference"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id", select the first input (e.g. "first string")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse the "condition" function call if you want, by clicking on the down-chevron next to "condition". You should see something like "f(x) is empty string( → first string )"</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Throw error if the condition is true:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "then", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Throw Error"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error type", search and select your error type (you can directly input the error ID if you know it, e.g. Z30005)</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error parameters", add two items by clicking on the "+" button</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For "Item 1" (offending argument key), set its type to "String" and write the argument identifier (e.g. "first input", or "Z30000K1")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For "Item 2" (offending argument value), click on the "…" next to "Item 2" and select "argument reference"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id", select the first input (e.g. "first string")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse the "then" function call if you want, by clicking on the down-chevron next to "then". You should see something like "f(x) Throw Error( Input was the wrong format, Typed list( Object, "first input", → first string ) )"</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Continue to check the second argument if the first was good:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "else", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "if"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Set up "condition" to check the validity of the second argument by following the same process as described in step 5.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Set up "then" to throw an error for the second argument by following the same process as described in step 6.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Finally, set up the success path:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to the nested "else", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the successful function, which in this case can be "join strings with separator"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and set it to "argument reference", then select "first string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and set it to "argument reference", then select "second string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "separator" add a space into the text field</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The resulting function call should look like this: </div> [[File:Throw error expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function</span>]] [[File:Throw error collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function, in its collapsed view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function, in its collapsed view</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Handling errors in compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> While it is useful to allow functions to raise expected errors, it is crucial to be able to handle errors in your compositions in order to safely use these functions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say you want to create a new function "full name of a person" – we will refer to it with the ZID <code>Z30010</code>. This function should return the full name of a person given a first and last names, but if any of the two fields are empty, it should return the text "Unknown" instead. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You could create a composition using our example function "Join two strings with a space" or <code>Z30000</code> to generate the name. If any of the inputs are empty, you know that <code>Z30000</code> will throw an error of type <code>Z30005</code>. Using the function {{Z|Z850}} as a wrapper, you can attempt the join operation and intercept a possible error to simply return "Unknown" whenever it occurs. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Try-Catch function (Z850) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z850}} function is built-in with ZID <code>Z850</code> and takes three arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – The initial function call to run. If nothing goes wrong, the response will be the result of this function call.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – An error type to catch in case it is thrown during the execution of the first function call.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error handler''' – A function call that will be run in case the error specified above is caught during the execution of the initial function call. If that happens, the result of the error handler will be the value returned.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Try-Catch ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Once we have all the functions for our composition, we can craft it like this: </div> <syntaxhighlight lang="prolog"> try_catch( join_with_space( Z30010K1, Z30010K2 ), Z30005, echo( "Unknown" ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This means that: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">The "Join two strings with a space" function will be tried with the two inputs and, if everything goes well, the output of this function will be returned</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If any of the inputs are blank, "Join two strings with a space" with raise an error of type <code>Z30005</code></span> * <span lang="en" dir="ltr" class="mw-content-ltr">Our {{Z|Z850}} will then detect this error and run the {{Z|Z801}} function to return "Unknown"</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's create this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›” icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the outermost function you want to use, which in this case is "Try-Catch".</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Set the main function call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under the field where the "Try-Catch" function is selected, next to the "function call" key, click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the function "join two strings with space"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and select "argument reference", then select the "first name" argument from the dropdown.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and select "argument reference", then select the "second name" argument from the dropdown.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Select the error to catch:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error type", search and select "bad string input" – you can search directly by its ZID <code>Z30005</code></span> # <span lang="en" dir="ltr" class="mw-content-ltr">Set the error handler function call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "error handler", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "echo"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "input" and "type", search and select the type "String"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now, under "input", type "Unknown" in the text field</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The resulting function should look like this: </div> [[File:Try catch expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in expanded mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in expanded mode</span>]] [[File:Try catch collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in collapsed mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in collapsed mode</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Testing your failure use cases === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As we introduced in the above section about [[#Practice Test-Driven Development|practicing TDD]], it's important to test not only the most common paths, but also the possible edge cases. It is equally important to test failure behavior. In this section we will give you the tools necessary to test that your function fails with a given set of inputs, and that the error thrown is the expected one. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> To do that, you will need other two system functions: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Is error type (Z852) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z852}} function is built-in with ZID <code>Z852</code> and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error''' – An {{Z|Z5}} object, which can be thrown by a failing call. An error instance has a type and a value.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – A reference to an {{Z|Z50}} which will be compared to the type of the Error passed as a first argument. If that's the case, the function will return true.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Get error thrown by function call (Z853) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z853}} function is built-in with ZID <code>Z853</code> and takes one argument: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – A function call which can either return a successful value of any type, or throw an error.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> This function returns a {{Z|Z882}} with a {{Z|Z40}} in first place and an {{Z|Z1}} in the second: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the Function call runs successfully and hence does not throw any error, the returned pair will contain False in the first place, and void in the second.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the Function call throws an error, the returned pair will contain True in the first place, and the caught error in the second.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> To use this function in your compositions, you might need to use the additional functions: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">{{Z|Z821}}, and</span> * {{Z|Z822}} <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Testing errors ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say our target function, "Join two strings with a space" or <code>Z30000</code>, throws an error of type <code>Z30005</code> and we want to test this behavior. To do that we need to: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Throw a failing function call</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Get the error using the function {{Z|Z853}}</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Check that the error is the right type with {{Z|Z852}}</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Tests have two fields: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Call''' – A function call that will produce an output with the inputs you want to test. This call will return a value.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Result validation''' – A function call that will validate that the value returned by the call above is the expected one. The first argument of this function call will be automatically assigned to take the return value of the first call.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> For step-by-step instructions on how to create tests, see {{ll|Wikifunctions:Introduction#Create_tests}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In our example, we can structure it like this — but this is not the only way! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The call, which will return an {{Z|Z5}} object: </div> <syntaxhighlight lang="prolog"> error = get_second_element_of_typed_list( get_error_thrown_by( join_strings_by_whitespace( "", "not empty" ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> And the result validation, which will take the {{Z|Z5}} object as its first argument: </div> <syntaxhighlight lang="prolog"> is_error_type( error, Z30005 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's do this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding a test by clicking on the "+" button in the "Tests" table from your Function page. The "call" and "result validation" fields already have some functions pre-set, but to test the errors we will need to change them.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">First, let's set the call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "call", click the "›" chevron button to expand the function call.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", edit the field and search and select the function "Get second element of a typed pair"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Once selected, next to "Typed pair", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Get error thrown by function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "function call", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Join two strings with a space" (or by ZID <code>Z30000</code>)</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now set the inputs so that they cause a failure: at least one of them should be empty.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse your "call" by clicking again on the down-chevron button if you want!</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Next, let's set the result validation:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "result validation", click the "›" chevron button to expand the function call.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", edit the field and search and select the function "Is error type"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now you will only be asked to configure the second argument. Under "error type", search and select your <code>Z30005</code> error type.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">And you are done! You can now click the circular arrow in the "Implementations" box and you should see green checks.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> If everything went right, you can now save your test. It should look like this: </div> [[File:Get error expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in expanded mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in expanded mode</span>]] [[File:Get error collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in collapsed mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in collapsed mode</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Creating actionable error messages === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As described above, Error Types have an optional key <code>Z50K3</code> which contains a multilingual list of HTML strings. When rendering information about an error, the messages stored in the error type can help create a clear, precise, informative, translatable and actionable error message. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For that purpose, error messages can contain parameters like <code>$1</code>, <code>$2</code>, etc., where the digit corresponds to the error type argument and its value in the error instance. These error messages are rendered in Wikifunctions inside the "Details" dialog window after executing a function call. Additionally, these error messages are surfaced in other client interfaces, like Abstract Wikipedia, to provide better guidance to Abstract Content editors. </div> [[File:Wikifunctions actionable error message example in the Details dialog.png|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">The error message is rendered using the HTML message of the error type and the error argument values.</span>]] [[File:Wikifunctions actionable error message example in Abstract Wikipedia.png|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">When available, the HTML error message is rendered in the Abstract Wikipedia preview section.</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> Let's use a real example to understand the benefits of HTML error messages: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The function {{Z|Z37847}} returns the first Lexeme reference given a Wikidata Item reference and a language. When there is no Lexeme for this Item-Language combination, it throws an error of type {{Z|Z28248}}, which has three keys: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K1''' is the input Wikidata item QID</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K2''' is the connecting property, in this case <code>P5137/item for this sense</code></span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K3''' is the language code</span> <div lang="en" dir="ltr" class="mw-content-ltr"> When calling this function for a Wikidata lexeme that doesn't exist, the call will throw an error instance like this: </div> <syntaxhighlight lang="json" highlight="10,12"> { "Z1K1": "Z5", "Z5K1": "Z28248", "Z5K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z885", "Z885K1": "Z28248" }, "Z28248K1": "Q319", "Z28248K2": "P5137", "Z28248K3": "ast" } } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> While the error type label indicates: <code>No matching lexeme for item in language</code>, a better error message should indicate: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">which is the failing item,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">which is the language missing, and</span> * <span lang="en" dir="ltr" class="mw-content-ltr">what are the possible ways to fix it.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The error message <code>Z50K3</code> field can provide this functionality. Whenever an Error Type has an error message for the user language (or any of its fallbacks), the error message shown will be rendered by: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">First, replacing the message parameters with the values of the keys. In our example, any <code>$1</code> will be replaced with the value of <code>Z28248K1</code> ("Q319"), <code>$2</code> with "P5137", and <code>$3</code> with "ast",</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Last, sanitizing and rendering the HTML message.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> So a HTML message like: </div> <syntaxhighlight lang="html"> There is no matching lexeme for the item $1 in "$3".<br> <a href="http://wikidata.org/wiki/$1">Edit in Wikidata</a> </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Will become: </div> : There is no matching lexeme for the item Q319 in "ast" : [[d:Q319|Edit in Wikidata]] <div lang="en" dir="ltr" class="mw-content-ltr"> == Debugging your implementations == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Sometimes things can go wrong. A function might behave differently than expected or a value might not look quite right. Sometimes implementations are really complex and, because they are run in a sandboxed environment, it can seem really difficult to debug. To help understand what's going on inside a function call, Wikifunctions includes a small set of debugging tools. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> These tools don't change the result of a function, but will add extra information to the returned metadata, which you can observe after running the function. You can use <code>Wikifunctions.Debug()</code> from your code implementations or the function {{Z|Z854}} from your compositions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section you will learn: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">How to add debug messages from both code and composition implementations,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to inspect the metadata manually or via the UI to inspect these logs.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Debugging your code implementations === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> When writing code, both from JavaScript and Python3, you can use <code>Wikifunctions.Debug()</code> to add a message to your debugging log and continue the execution. </div> {{phab|T441028}} <div lang="en" dir="ltr" class="mw-content-ltr"> <code>Wikifunctions.Debug()</code> has one parameter, which is generally expected to be a string. However, any other object passed as parameter will get directly converted into a string. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If we want to add debug logs to our code implementations for our "Join two strings with a space" example function, we can do, in JavaScript: </div> <syntaxhighlight lang="JavaScript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { Wikifunctions.Debug( `first input is empty "${ Z30000K1 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { Wikifunctions.Debug( `second input is empty "${ Z30000K2 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } Wikifunctions.Debug( "both inputs are fine" ); return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> And the same in your Python3 implementation will be: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": Wikifunctions.Debug( 'first input is empty "'+Z30000K1+'"' ) Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": Wikifunctions.Debug( 'second input is empty "'+Z30000K2+'"' ) Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) Wikifunctions.Debug( 'both inputs are fine' ) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This way, no matter what happens, we will be adding one message to your debugging logs: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the function call fails when checking on the first or second input, the result of the execution will be a failure, but it will contain one informative log about what branch caused the failure.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the function call succeeds—because both inputs are valid—the function call will return the joined string, but the returned metadata will also contain a debug log.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Debugging your compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> To support debugging compositions, Wikifunctions provides the built-in function {{Z|Z854}}. This function allows you to attach debug messages to the execution of any function call that generates the final output. The debug logs collected during the evaluation are returned as part of the execution metadata, under the <code>executorDebugLogs</code> key. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Add debug log to function call (Z854) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z854}} function is built-in with ZID <code>Z854</code> and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – Any composition you want to execute.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Debug log''' – A string message that will be recorded if the given function call is evaluated.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> When the wrapped function call runs, the provided message is added to the execution logs. If that function call is not executed, or its execution is not part of the final output, its debug log will not appear in the final result metadata. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You will benefit from this built-in if you want to observe: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Which branch of a conditional was executed, or</span> * <span lang="en" dir="ltr" class="mw-content-ltr">the order of evaluation in a composition.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Add debug log to function call ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say that you want to add debug logs to our example function "Join two strings with a space" or <code>Z30000</code>, so that different messages are added to the different possible outcomes. You could use our debugging builtin like this: </div> <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), add_debug_log( throw_error( Z30005, ... ), 'failed on first input' ) if( is_empty_string( Z30000K2 ), add_debug_log( throw_error( Z30005, ... ), 'failed on second input' ), add_debug_log( join_with_separator( Z30000K1, Z30000K2, " " ), 'both inputs are ok!' ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This way, </div> * <span lang="en" dir="ltr" class="mw-content-ltr">when called with an empty first input, the function will return a failed response, and the metadata will contain an <code>executorDebugLogs</code> entry with the "failed on first input" log.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">When called with an empty second input, the call will also fail, but the logged message will be "failed on second input"</span> * <span lang="en" dir="ltr" class="mw-content-ltr">When called with valid inputs, the function will return a successful response, and additionally the metadata will contain "both inputs are ok" in its <code>executorDebugLogs</code> key.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> This is the way this composition would look: </div> [[File:Add debug log expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Composition implementation using Add debug logs to log all possible execution paths</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Composition implementation using Add debug logs to log all possible execution paths</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Accessing execution debug logs === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Whether your execution logs are added via <code>Wikifunctions.Debug()</code> or via the {{Z|Z854}} built-in function, they are returned as part of the response metadata. To see the logs, once you run your function, click on the "Details" button that appears at the bottom of the "Result" section. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The error and debug information will appear at the top of the "Details" dialog. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> This is what you would see when running the composition from our previous example with valid and invalid inputs: </div> {| class="wikitable" | [[File:Execution logs success.png|frameless|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a successful execution with debug logs</span>]] | [[File:Execution logs failure.png|frameless|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a failed execution with debug logs</span>]] |- | <span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a successful execution: shows no errors, but displays the successful execution log: ''"both inputs are ok!"''</span> | <span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a failed execution: shows the error information, and the additional execution log for the first failure branch: ''"failed on first input"''</span> |} [[Category:How to create implementations| {{#translation:}}]] fgnwabr497tob7rht1jisp0btsd49j8 Wikifunctions:What Wikifunctions is not/en 4 9903 331056 190620 2026-10-23T08:06:04Z FuzzyBot 207 Updating to match new version of source page 331056 wikitext text/x-wiki <languages/> {{shortcut|[[WF:NOT]]}} {{Draft}} Wikifunctions is a new kind of website, aiming for a new community. We very much hope to work together with many tools, sites, communities, and kinds of systems that are out there: we want to play together with IDEs, with cloud computing platforms, with app development sites, and many more. But we also aim to be a novel thing and we hope to shape a new unique space out for us: a Wikimedia project for everyone to collaboratively create and maintain a library of code functions to support the Wikimedia projects and beyond, for everyone to call and re-use in the world's natural and programming languages. The scope of the project is within bounds, though. So, let us also explore '''what Wikifunctions is not'''. == Wikifunctions is not an encyclopædia of algorithms == This means that we will '''not''' concentrate on having pages for famous and not-so famous algorithms such as [[w:Euclidean algorithm|Euclid's]], [[w:Newton's method|Newton's]], or [[w:Dijkstra's algorithm|Dijkstra's algorithm]], aiming to represent all existing algorithms faithfully and in their historical context. Yes, we expect to have a function for the [[w:Greatest common divisor|greatest common divisor]] (GCD) of two integers. And there might be one or more implementations which are based on Euclid's algorithm to calculate the GCD. But Wikifunctions' main goal is not to gather algorithms, and it would not be incomplete if it didn't include some, and used alternatives instead to compute the GCD. If you are looking for that, many Wikipedias are actually [[w:List of algorithms|great resources]]. Unlike an encyclopedic overview of existing algorithms, Wikifunctions will also invite original work. We will not be restricted to functions that have been published elsewhere first, and we do not require for every function and implementation to be based on previously published work. Wikifunctions, much like Wikibooks and very unlike Wikipedia, will be open to novel contributions. The main criteria for implementations will be: under which conditions can we run a given implementation, and what resources is it expected to take? == Wikifunctions is not an app development site == We do not expect to make it possible to create full-fledged, stand-alone apps within Wikifunctions — there will be no place to store state, we don't aim to allow calling external APIs or directly cause changes to other sites, and we don't aim to package up apps with icons and UX, etc. We absolutely expect Wikifunctions to be a very useful resource for app developers, and can very much imagine apps that are basically wrappers around one or more functions from Wikifunctions, but these would still need code and other assets which wouldn't be part of Wikifunctions. We are not competing in the area of no-code or low-code development sites. == Wikifunctions is not a code hosting service == Wikifunctions will host code — but not for whole projects, merely for individual functions. There won't be libraries, apps, or services developed on Wikifunctions with bug-trackers, forums, etc. There won't be a Web-based version control system such as ''Mercurial'' or ''Git'' running against Wikifunctions. Again, we hope that there will be libraries, apps, and services that will rely on functions available in Wikifunctions, but they would be developed on a different site, such as ''Gerrit'', ''GitHub'', or ''GitLab''. == Wikifunctions is not a programming language, nor is trying to evangelise a particular language == Wikifunctions will allow for functions to be implemented in a multitude of programming languages. The possibility to compose functions together to create higher level functions may look a little bit like a new programming language, but it will be extremely limited compared to most other programming languages, since we only allow for nested function calls and that's it. == Wikifunctions is not an Integrated Development Environment (IDE) == We won't provide you with an interface for creating and developing software projects, interfacing with build, testing, and source control systems. == Wikifunctions is not a question-and-answer website == We are not competing with ''Stack Overflow'' and similar websites, where a developer would ask how to achieve a certain task and have community members discuss and answer the question. We won't contain code snippets to help answer the question, but we will organize code within our website to enable the evaluation of functions within a library of functions. == Wikifunctions is not a cloud computing platform == We do not provide computing resources and access to services and APIs so that you can run your computational needs on our platform, either for money or for free. Use of Wikifunctions's evaluation platform is to improve access to knowledge for everyone. == Wikifunctions is not a code snippet website == We are not competing with code snippet sites such as GitHub Gists, [[w:Rosetta_Code|Rosetta Code]], [https://esolangs.org/ esolangs.org], or [http://helloworldcollection.de/ helloworldcollection.de]. Wikifunctions differs in that it allows running code and composing existing functions together to create new ones. As well, Wikifunctions is for useful and meaningful code, not temporary, arbitrary snippets that other platforms may accept. == Wikifunctions is not a code education platform == We are not focused on teaching people how to code, the material in Wikifunctions will not be laid out in a pedagogical order, and we also won't make sure to comprehensively cover all topics important for coding. In fact, we aim for Wikifunctions to be usable for people who don't know how to code and who don't need to learn how to code to use most of Wikifunctions effectively. Though the Wikifunctions community may well help each other in sharing best practices, style guides, and tips on how to use the site in different languages, these will be aimed at the purpose of serving the world's knowledge. == Wikifunctions is not (only) the boiler room for Abstract Wikipedia == [[File:Mechanical_room_in_basement._Wayne_N._Aspinall_Federal_Building_and_U.S._Courthouse,_Grand_Junction,_Colorado_LCCN2014650034.tif|thumb|A '[[d:Q6804549|boiler room]]', where unsightly-but-vital machinery is hidden]] Natural language generation (NLG) is the focus of {{SITENAME}} as of 2026, and the site began as part of the wider [[meta:Special:MyLanguage/Abstract_Wikipedia|Abstract Wikipedia project]], but NLG is far from the only field in which functions are being developed. That is to say, WF is necessary for AW, but AW is not necessary for WF. On top of the computer science staples of Boolean logic, arithmetic, and list manipulation, we have useful functions relating to disciplines such as [[Z16718|chemistry]], [[Z35550|dimensional analysis]], [[Z20074|electrical engineering]], [[Z22162|genomics]], [[Z10393|information theory]], [[Z26830|meteorology]], [[Z13955|number theory]], [[Z27919|physiology]], [[Z20094|probability]], [[Z24497|quantum mechanics]], [[Z14226|railroad engineering]], [[Z28600|timekeeping/chronometry]], and [[Z26841|trigonometry]]. [[Category:Project concept{{#translation:}}]] bqddmdk695nc8xl1gwc3k5eyf29qcwg Wikifunctions:What Wikifunctions is not/de 4 9998 331054 190639 2026-10-23T08:06:04Z FuzzyBot 207 Updating to match new version of source page 331054 wikitext text/x-wiki <languages/> {{shortcut|[[WF:NOT]]}} {{Draft}} Wikifunctions ist, soweit wir das beurteilen können, eine neue Art von Webseite, die auf eine neue Gemeinschaft abzielt. Wir hoffen sehr, mit vielen Werkzeugen, Webseiten, Gemeinschaften und Systemtypen zusammenzuarbeiten, die es gibt: Wir möchten mit IDEs, mit Cloud-Computing-Plattformen, mit Seiten zur App-Entwicklung und vielem mehr zusammenarbeiten. Aber wir wollen auch etwas Neues sein und hoffen, einen neuen, einzigartigen Raum für uns zu schaffen: Ein Wikimedia-Projekt, bei dem alle gemeinsam eine Bibliothek von Codefunktionen erstellen und pflegen können, die jeder in den natürlichen Sprachen und Programmiersprachen der Welt aufrufen und wiederverwenden kann, um die Wikimedia-Projekte und darüber hinaus zu unterstützen. Der Umfang des Projekts hat jedoch auch Grenzen. Lass uns also auch untersuchen, '''was Wikifunctions nicht ist'''. <span id="Wikifunctions_is_not_an_encyclopædia_of_algorithms"></span> == Wikifunctions ist keine Enzyklopädie von Algorithmen == Das bedeutet, dass wir '''keine''' Seiten für berühmte und weniger berühmte Algorithmen haben werden, wie den [[:de:Euklidischer Algorithmus|euklidischen Algorithmus]], das [[:de:Newtonverfahren|Newtonverfahren]] oder den [[:de:Dijkstra-Algorithmus|Dijkstra-Algorithmus]] mit dem Ziel, alle existierenden Algorithmen originalgetreu und in ihrem historischen Kontext darzustellen. Ja, wir erwarten eine Funktion für den [[:de:Größter gemeinsamer Teiler|größten gemeinsamen Teiler]] (ggT) zweier Ganzzahlen. Und es könnte eine oder mehrere Implementierungen geben, die auf dem euklidischen Algorithmus zur Berechnung des ggT basieren. Aber Wikifunctions wäre nicht unvollständig, wenn dies nicht der Fall wäre und wir stattdessen alternative Algorithmen zur Berechnung des ggT hätten. Wenn du danach suchst, sind viele Wikipedias tatsächlich [[:de:Liste von Algorithmen|großartige Ressourcen]]. Im Gegensatz zu einem enzyklopädischen Überblick über bestehende Algorithmen lädt Wikifunctions auch zu eigenen Werken ein. Wir beschränken uns nicht auf Funktionen, die zuerst an anderer Stelle veröffentlicht wurden, und wir verlangen nicht, dass jede Funktion und Implementierung auf zuvor veröffentlichten Arbeiten basiert. Wikifunctions ist, ähnlich wie Wikibooks und ganz im Gegensatz zu Wikipedia, offen für neuartige Beiträge. Die Hauptkriterien für Implementierungen werden sein: Unter welchen Bedingungen können wir eine bestimmte Implementierung ausführen und welche Ressourcen werden voraussichtlich dafür benötigt? <span id="Wikifunctions_is_not_an_app_development_site"></span> == Wikifunctions ist keine Seite zur App-Entwicklung == Wir gehen nicht davon aus, dass es möglich sein wird, vollwertige, eigenständige Apps innerhalb von Wikifunctions zu erstellen — es wird keinen Ort zum Speichern des Status geben, wir streben nicht danach, den Aufruf externer APIs zu ermöglichen oder direkte Änderungen an anderen Webseiten vorzunehmen und wir versuchen nicht, Apps mit Symbolen und UX, etc. zu verpacken. Wir gehen definitiv davon aus, dass Wikifunctions eine sehr nützliche Ressource für App-Entwickler ist, und ich kann mir sehr gut Apps vorstellen, die im Grunde genommen Wrapper für eine oder mehrere Funktionen von Wikifunctions sind, aber diese würden dennoch Code und andere Hilfsmittel benötigen, die nicht Teil von Wikifunctions wären. Wir konkurrieren in dem Bereich nicht mit No-Code- oder Low-Code-Plattformen. <span id="Wikifunctions_is_not_a_code_hosting_service"></span> == Wikifunctions ist kein Dienst zur Bereitstellung von Code == Wikifunctions wird Code bereitstellen — aber nicht für ganze Projekte, sondern nur für einzelne Funktionen. Es wird keine auf Wikifunctions entwickelten Bibliotheken, Apps oder Dienste mit Fehler-Verfolgung, Foren, etc. geben. Es wird für Wikifunctions kein webbasiertes System zur Versionskontrolle wie ''Mercurial'' oder ''Git'' geben. Auch hier hoffen wir, dass es Bibliotheken, Apps und Dienste geben wird, die auf den in Wikifunctions verfügbaren Funktionen basieren, dass diese jedoch auf einer anderen Seiten entwickelt werden, wie ''Gerrit'', ''GitHub'' oder ''GitLab''. <span id="Wikifunctions_is_not_a_programming_language,_nor_is_trying_to_evangelise_a_particular_language"></span> == Wikifunctions ist keine Programmiersprache und versucht nicht, eine bestimmte Sprache zu verbreiten == Wikifunctions ermöglicht die Implementierung von Funktionen in einer Vielzahl von Programmiersprachen. Die Möglichkeit, Funktionen zusammenzusetzen, um Funktionen auf höherer Ebene zu erstellen, mag ein wenig wie eine neue Programmiersprache aussehen, wird aber im Vergleich zu den meisten anderen Programmiersprachen äußerst eingeschränkt sein, da wir nur verschachtelte Funktionsaufrufe zulassen und mehr nicht. <span id="Wikifunctions_is_not_an_Integrated_Development_Environment_(IDE)"></span> == Wikifunctions ist keine Integrierte Entwicklungsumgebung (IDE) == Wir stellen dir keine Oberfläche zum Erstellen und Entwickeln von Softwareprojekten und zur Anbindung an Build-, Test- und Versionskontrollsysteme zur Verfügung. <span id="Wikifunctions_is_not_a_question-and-answer_website"></span> == Wikifunctions ist keine Frage-und-Antwort-Seite == Wir konkurrieren nicht mit ''StackOverflow'' und ähnlichen Webseiten, auf denen ein Entwickler fragt, wie eine bestimmte Aufgabe gelöst werden kann, und die Mitglieder der Gemeinschaft die Frage diskutieren und beantworten. Wir werden keine Codeausschnitte zur Beantwortung der Frage haben, aber wir werden Code auf unserer Webseite organisieren, um die Auswertung von Funktionen innerhalb einer Funktionsbibliothek zu ermöglichen. <span id="Wikifunctions_is_not_a_cloud_computing_platform"></span> == Wikifunctions ist keine Cloud-Computing-Plattform == Wir stellen keine Rechenressourcen und keinen Zugang zu Diensten und APIs zur Verfügung, damit du deine Rechenanforderungen auf unserer Plattform ausführen kannst, weder gegen Geld noch kostenlos. Durch die Nutzung der Auswertungsplattform von Wikifunctions soll der Zugang zu Wissen für alle verbessert werden. <span id="Wikifunctions_is_not_a_code_snippet_website"></span> == Wikifunctions ist keine Seite für Code-Schnipsel == Wir konkurrieren nicht mit Seiten für Code-Schnipsel wie GitHub Gists, [[:de:Rosetta Code|Rosetta Code]], [https://esolangs.org/ esolangs.org] oder [http://helloworldcollection.de/ helloworldcollection.de]. Wikifunctions unterscheidet sich dadurch, dass es das Ausführen von Code und das Zusammensetzen vorhandener Funktionen zum Erstellen neuer Funktionen ermöglicht. Außerdem ist Wikifunctions für nützlichen und aussagekräftigen Code gedacht, nicht für temporäre, willkürliche Schnipsel, die andere Plattformen möglicherweise akzeptieren. <span id="Wikifunctions_is_not_a_code_education_platform"></span> == Wikifunctions ist keine Code-Lernplattform == Es geht uns nicht darum, den Leuten das Programmieren beizubringen, das Material in Wikifunctions wird nicht in einer pädagogischen Reihenfolge angelegt und wir werden auch nicht sicherstellen, dass alle für das Programmieren wichtigen Themen umfassend behandelt werden. Tatsächlich ist es unser Ziel, dass Wikifunctions für Leute nutzbar ist, die nicht wissen, wie man programmiert und die nicht lernen müssen, wie man programmiert, um den größten Teil von Wikifunctions effektiv nutzen zu können. Auch wenn sich die Wikifunctions-Gemeinschaft möglicherweise gegenseitig beim Austausch von besten Vorgehensweisen, Gestaltungsrichtlinien und Tipps zur Nutzung der Seite in verschiedenen Sprachen unterstützt, so zielen diese doch darauf ab, dem weltweiten Wissen zu dienen. <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not (only) the boiler room for Abstract Wikipedia == </div> [[File:Mechanical_room_in_basement._Wayne_N._Aspinall_Federal_Building_and_U.S._Courthouse,_Grand_Junction,_Colorado_LCCN2014650034.tif|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">A '[[d:Q6804549|boiler room]]', where unsightly-but-vital machinery is hidden</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> Natural language generation (NLG) is the focus of {{SITENAME}} as of 2026, and the site began as part of the wider [[meta:Special:MyLanguage/Abstract_Wikipedia|Abstract Wikipedia project]], but NLG is far from the only field in which functions are being developed. That is to say, WF is necessary for AW, but AW is not necessary for WF. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> On top of the computer science staples of Boolean logic, arithmetic, and list manipulation, we have useful functions relating to disciplines such as [[Z16718|chemistry]], [[Z35550|dimensional analysis]], [[Z20074|electrical engineering]], [[Z22162|genomics]], [[Z10393|information theory]], [[Z26830|meteorology]], [[Z13955|number theory]], [[Z27919|physiology]], [[Z20094|probability]], [[Z24497|quantum mechanics]], [[Z14226|railroad engineering]], [[Z28600|timekeeping/chronometry]], and [[Z26841|trigonometry]]. </div> [[Category:Project concept{{#translation:}}]] 20htjcx1pi69v41c6ayhxmspxtj12z1 Wikifunctions:What Wikifunctions is not/uk 4 11281 331071 190634 2026-10-23T08:06:09Z FuzzyBot 207 Updating to match new version of source page 331071 wikitext text/x-wiki <languages/> {{shortcut|[[WF:NOT]]}} {{Draft}} Вікіфункції - це, наскільки ми можемо сказати, новий вид веб-сайту, спрямований на нову спільноту. Ми дуже сподіваємося працювати разом з багатьма інструментами, сайтами, спільнотами та системами, які там є: ми хочемо займатися разом з IDE, з платформами хмарних обчислень, з сайтами розробки додатків та багато іншого. <div lang="en" dir="ltr" class="mw-content-ltr"> But we also aim to be a novel thing and we hope to shape a new unique space out for us: a Wikimedia project for everyone to collaboratively create and maintain a library of code functions to support the Wikimedia projects and beyond, for everyone to call and re-use in the world's natural and programming languages. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The scope of the project is within bounds, though. So, let us also explore '''what Wikifunctions is not'''. </div> <span id="Wikifunctions_is_not_an_encyclopædia_of_algorithms"></span> == Вікіфункції не є енциклопедією алгоритмів == <div lang="en" dir="ltr" class="mw-content-ltr"> This means that we will '''not''' concentrate on having pages for famous and not-so famous algorithms such as [[w:Euclidean algorithm|Euclid's]], [[w:Newton's method|Newton's]], or [[w:Dijkstra's algorithm|Dijkstra's algorithm]], aiming to represent all existing algorithms faithfully and in their historical context. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Yes, we expect to have a function for the [[w:Greatest common divisor|greatest common divisor]] (GCD) of two integers. And there might be one or more implementations which are based on Euclid's algorithm to calculate the GCD. But Wikifunctions' main goal is not to gather algorithms, and it would not be incomplete if it didn't include some, and used alternatives instead to compute the GCD. If you are looking for that, many Wikipedias are actually [[w:List of algorithms|great resources]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Unlike an encyclopedic overview of existing algorithms, Wikifunctions will also invite original work. We will not be restricted to functions that have been published elsewhere first, and we do not require for every function and implementation to be based on previously published work. Wikifunctions, much like Wikibooks and very unlike Wikipedia, will be open to novel contributions. The main criteria for implementations will be: under which conditions can we run a given implementation, and what resources is it expected to take? </div> <span id="Wikifunctions_is_not_an_app_development_site"></span> == Вікіфункції не є сайтом для розробки програм == <div lang="en" dir="ltr" class="mw-content-ltr"> We do not expect to make it possible to create full-fledged, stand-alone apps within Wikifunctions — there will be no place to store state, we don't aim to allow calling external APIs or directly cause changes to other sites, and we don't aim to package up apps with icons and UX, etc. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We absolutely expect Wikifunctions to be a very useful resource for app developers, and can very much imagine apps that are basically wrappers around one or more functions from Wikifunctions, but these would still need code and other assets which wouldn't be part of Wikifunctions. We are not competing in the area of no-code or low-code development sites. </div> <span id="Wikifunctions_is_not_a_code_hosting_service"></span> == Вікіфункції не є службою розміщення коду == Вікіфункції розміщуватимуть код — але не для цілих проектів, а лише для окремих функцій. Не буде бібліотек, програм чи служб, розроблених на Вікіфункціях із засобами відстеження помилок, форумами тощо. Не буде веб-систем контролю версій, таких як ''mercurial'' або ''git'', що працюють із Вікіфункціями. <div lang="en" dir="ltr" class="mw-content-ltr"> Again, we hope that there will be libraries, apps, and services that will rely on functions available in Wikifunctions, but they would be developed on a different site, such as ''Gerrit'', ''GitHub'', or ''GitLab''. </div> <span id="Wikifunctions_is_not_a_programming_language,_nor_is_trying_to_evangelise_a_particular_language"></span> == Вікіфункції не є мовою програмування і не намагаються проповідувати певну мову == <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions will allow for functions to be implemented in a multitude of programming languages. The possibility to compose functions together to create higher level functions may look a little bit like a new programming language, but it will be extremely limited compared to most other programming languages, since we only allow for nested function calls and that's it. </div> <span id="Wikifunctions_is_not_an_Integrated_Development_Environment_(IDE)"></span> == Вікіфункції не є інтегрованим середовищем розробки (IDE) == <div lang="en" dir="ltr" class="mw-content-ltr"> We won't provide you with an interface for creating and developing software projects, interfacing with build, testing, and source control systems. </div> <span id="Wikifunctions_is_not_a_question-and-answer_website"></span> == Вікіфункції не є вебсайтом запитань і відповідей == <div lang="en" dir="ltr" class="mw-content-ltr"> We are not competing with ''Stack Overflow'' and similar websites, where a developer would ask how to achieve a certain task and have community members discuss and answer the question. We won't contain code snippets to help answer the question, but we will organize code within our website to enable the evaluation of functions within a library of functions. </div> <span id="Wikifunctions_is_not_a_cloud_computing_platform"></span> == Вікіфункції не є платформою хмарних обчислень == <div lang="en" dir="ltr" class="mw-content-ltr"> We do not provide computing resources and access to services and APIs so that you can run your computational needs on our platform, either for money or for free. Use of Wikifunctions's evaluation platform is to improve access to knowledge for everyone. </div> <span id="Wikifunctions_is_not_a_code_snippet_website"></span> == Вікіфункції не є вебсайтом із фрагментами коду == <div lang="en" dir="ltr" class="mw-content-ltr"> We are not competing with code snippet sites such as GitHub Gists, [[w:Rosetta_Code|Rosetta Code]], [https://esolangs.org/ esolangs.org], or [http://helloworldcollection.de/ helloworldcollection.de]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions differs in that it allows running code and composing existing functions together to create new ones. As well, Wikifunctions is for useful and meaningful code, not temporary, arbitrary snippets that other platforms may accept. </div> <span id="Wikifunctions_is_not_a_code_education_platform"></span> == Вікіфункції не є освітньою платформою для програмування == <div lang="en" dir="ltr" class="mw-content-ltr"> We are not focused on teaching people how to code, the material in Wikifunctions will not be laid out in a pedagogical order, and we also won't make sure to comprehensively cover all topics important for coding. In fact, we aim for Wikifunctions to be usable for people who don't know how to code and who don't need to learn how to code to use most of Wikifunctions effectively. Though the Wikifunctions community may well help each other in sharing best practices, style guides, and tips on how to use the site in different languages, these will be aimed at the purpose of serving the world's knowledge. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not (only) the boiler room for Abstract Wikipedia == </div> [[File:Mechanical_room_in_basement._Wayne_N._Aspinall_Federal_Building_and_U.S._Courthouse,_Grand_Junction,_Colorado_LCCN2014650034.tif|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">A '[[d:Q6804549|boiler room]]', where unsightly-but-vital machinery is hidden</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> Natural language generation (NLG) is the focus of {{SITENAME}} as of 2026, and the site began as part of the wider [[meta:Special:MyLanguage/Abstract_Wikipedia|Abstract Wikipedia project]], but NLG is far from the only field in which functions are being developed. That is to say, WF is necessary for AW, but AW is not necessary for WF. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> On top of the computer science staples of Boolean logic, arithmetic, and list manipulation, we have useful functions relating to disciplines such as [[Z16718|chemistry]], [[Z35550|dimensional analysis]], [[Z20074|electrical engineering]], [[Z22162|genomics]], [[Z10393|information theory]], [[Z26830|meteorology]], [[Z13955|number theory]], [[Z27919|physiology]], [[Z20094|probability]], [[Z24497|quantum mechanics]], [[Z14226|railroad engineering]], [[Z28600|timekeeping/chronometry]], and [[Z26841|trigonometry]]. </div> [[Category:Project concept{{#translation:}}]] jmhzrjd7vp1nyccpcva4p0scpgluiqe Wikifunctions:Naming conventions 4 11299 331141 325769 2026-10-23T08:29:28Z Ameisenigel 44 331141 wikitext text/x-wiki <languages/> {{shortcut|[[WF:NC]]}} {{Draft}} <translate> <!--T:1--> The page aims to sum up some conventions related to how are objects named at Wikifunctions. Since it's still a young project, there are not many guidelines defined yet. == Capitalization == <!--T:2--> <!--T:3--> Some languages use capital and small letters. Labels of objects should be written in such languages as if they were an ordinary phrase. Use of [[:w:en:Title case|Title case]] is discouraged. For example, instead of ''Calculate A Distance Between Earth And Sun On a Given Date'', type something like ''calculate a distance between Earth and Sun on a given date''. <!--T:14--> Capitalize only proper nouns and other words as required by the rules of the language in which you are writing. For example, this applies to nouns in German, and to some classes of words in English, such as days of week and names of languages. Don't capitalize those things if the rules of your language don't require this. When naming a foreign language in a label, use the label language's capitalization conventions (for example, "Toki Pona" should be capitalized in an English label). Abbreviations should use their conventional form; for example, in English, use "[[:en:RSA (cryptosystem)|RSA]]" and not "rsa" for the encryption algorithm name. <!--T:4--> By convention, names of objects that describe data types, should have their first letter capitalized (for example, <tvar name="1">[[Z1]]</tvar> or <tvar name="2">[[Z8]]</tvar>). == Search characters == <!--T:12--> <!--T:13--> The search engine uses a few characters as modifiers, so avoid these at the start of a word. These characters are: <tvar name="1"><code>~ * \? - " !</code></tvar>. <!--T:15--> Note that “?” on its own (rather than “\?”) is not a modifier. It is, however, a “greyspace” character. Other “greyspace” characters are <tvar name="chars"><code>~ ! @ # $ % ^ & ( ) _ + - = { } | [ ] \ : " ; ' < > ? , . /</code></tvar>. The search engine treats these (singly or in combination) as part of the word boundary. This is not generally a problem, but if they are likely to be significant in searches, you should avoid them at the start or end of a word (or between words), unless necessary (for example, <tvar name="2">[[Z11729]]</tvar>). See [[<tvar name="1">:mw:Special:MyLanguage/Help:CirrusSearch</tvar>|Help:CirrusSearch]] for details of how to search for text containing any of these characters. == Implementation names == <!--T:5--> <!--T:6--> When creating an Implementation, please mention the language you used in its name (Python/JavaScript/Composition). If there are more than one implementation in the same language, it's recommended to give a little detail in the title of what makes this implementation different. For example, naming the algorithm name (if one exists). == Test cases == <!--T:7--> <!--T:8--> Labels of a test case should provide some clue about what you are checking there. It doesn't have to include values for every input and output, but should at least specify a domain that you're checking. For instance, you might want to say that this test checks the behavior of a string function when it's given letters from the Cyrillic alphabet, or of a mathematical function when a fraction or complex number is passed. <!--T:9--> If the test case is related to a string function, and you include a string argument in the test case name, please surround the argument in quotes or mark it in some other way so it will be clear what the value is. It's especially helpful if the value has significant whitespace at the beginning or end (for example, when testing a text-trimming function). == Configuration of functions for given languages == <!--T:22--> </translate> * <translate><!--T:17--> Should start with "config for."</translate> ** <translate><!--T:18--> If the configuration is a display function, it should be "config for displaying", followed by the exact name of the type.</translate> ** <translate><!--T:19--> If the configuration is a read function, it should be "config for reading", following by the exact name of the type.</translate> <translate> == Types == <!--T:23--> </translate> * <translate><!--T:20--> Should be in sentence case (e.g. Rational number)</translate> ** <translate><!--T:21--> This rule should not be followed if the type name is used outside of Wikifunctions and more often than not is in a snake-case form (e.g. <tvar name="1">{{Z|Z20838}}</tvar>)</translate> <translate> == Multi-lingual labels == <!--T:10--> </translate> {{Phab|T359663}} <translate> <!--T:11--> Labels in ''multiple languages'' (using the <tvar name="1"><code>mul</code></tvar> language code, per [[<tvar name="3">d:Special:MyLanguage/Help:Default values for labels and aliases</tvar>|Wikidata's convention]]) can be used to specify the label in a way that doesn't involve words, for example as a mathematical expression. See <tvar name="2">{{Z|10512}}</tvar> for an example. At the moment of writing, the software doesn't use these labels as a fallback though. </translate> <translate> == language-specific local naming conventions == <!--T:24--> <!--T:25--> Some languages may have their own language-specific naming conventions (these should probably be decided through discussions within the community that speaks the language, though many are likely drafts). </translate> * [[Wikifunctions:Naming conventions/日本語]] (Japanese) [[Category:Policy{{#translation:}}]] 19a1lu57ytglhacl3eak4azvmidfi81 Wikifunctions:What Wikifunctions is not/he 4 11383 331060 190625 2026-10-23T08:06:06Z FuzzyBot 207 Updating to match new version of source page 331060 wikitext text/x-wiki <languages/> {{shortcut|[[WF:NOT]]}} {{Draft}} <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions is a new kind of website, aiming for a new community. We very much hope to work together with many tools, sites, communities, and kinds of systems that are out there: we want to play together with IDEs, with cloud computing platforms, with app development sites, and many more. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> But we also aim to be a novel thing and we hope to shape a new unique space out for us: a Wikimedia project for everyone to collaboratively create and maintain a library of code functions to support the Wikimedia projects and beyond, for everyone to call and re-use in the world's natural and programming languages. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The scope of the project is within bounds, though. So, let us also explore '''what Wikifunctions is not'''. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not an encyclopædia of algorithms == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> This means that we will '''not''' concentrate on having pages for famous and not-so famous algorithms such as [[w:Euclidean algorithm|Euclid's]], [[w:Newton's method|Newton's]], or [[w:Dijkstra's algorithm|Dijkstra's algorithm]], aiming to represent all existing algorithms faithfully and in their historical context. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Yes, we expect to have a function for the [[w:Greatest common divisor|greatest common divisor]] (GCD) of two integers. And there might be one or more implementations which are based on Euclid's algorithm to calculate the GCD. But Wikifunctions' main goal is not to gather algorithms, and it would not be incomplete if it didn't include some, and used alternatives instead to compute the GCD. If you are looking for that, many Wikipedias are actually [[w:List of algorithms|great resources]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Unlike an encyclopedic overview of existing algorithms, Wikifunctions will also invite original work. We will not be restricted to functions that have been published elsewhere first, and we do not require for every function and implementation to be based on previously published work. Wikifunctions, much like Wikibooks and very unlike Wikipedia, will be open to novel contributions. The main criteria for implementations will be: under which conditions can we run a given implementation, and what resources is it expected to take? </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not an app development site == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We do not expect to make it possible to create full-fledged, stand-alone apps within Wikifunctions — there will be no place to store state, we don't aim to allow calling external APIs or directly cause changes to other sites, and we don't aim to package up apps with icons and UX, etc. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We absolutely expect Wikifunctions to be a very useful resource for app developers, and can very much imagine apps that are basically wrappers around one or more functions from Wikifunctions, but these would still need code and other assets which wouldn't be part of Wikifunctions. We are not competing in the area of no-code or low-code development sites. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a code hosting service == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions will host code — but not for whole projects, merely for individual functions. There won't be libraries, apps, or services developed on Wikifunctions with bug-trackers, forums, etc. There won't be a Web-based version control system such as ''Mercurial'' or ''Git'' running against Wikifunctions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Again, we hope that there will be libraries, apps, and services that will rely on functions available in Wikifunctions, but they would be developed on a different site, such as ''Gerrit'', ''GitHub'', or ''GitLab''. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a programming language, nor is trying to evangelise a particular language == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions will allow for functions to be implemented in a multitude of programming languages. The possibility to compose functions together to create higher level functions may look a little bit like a new programming language, but it will be extremely limited compared to most other programming languages, since we only allow for nested function calls and that's it. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not an Integrated Development Environment (IDE) == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We won't provide you with an interface for creating and developing software projects, interfacing with build, testing, and source control systems. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a question-and-answer website == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We are not competing with ''Stack Overflow'' and similar websites, where a developer would ask how to achieve a certain task and have community members discuss and answer the question. We won't contain code snippets to help answer the question, but we will organize code within our website to enable the evaluation of functions within a library of functions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a cloud computing platform == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We do not provide computing resources and access to services and APIs so that you can run your computational needs on our platform, either for money or for free. Use of Wikifunctions's evaluation platform is to improve access to knowledge for everyone. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a code snippet website == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We are not competing with code snippet sites such as GitHub Gists, [[w:Rosetta_Code|Rosetta Code]], [https://esolangs.org/ esolangs.org], or [http://helloworldcollection.de/ helloworldcollection.de]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions differs in that it allows running code and composing existing functions together to create new ones. As well, Wikifunctions is for useful and meaningful code, not temporary, arbitrary snippets that other platforms may accept. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a code education platform == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We are not focused on teaching people how to code, the material in Wikifunctions will not be laid out in a pedagogical order, and we also won't make sure to comprehensively cover all topics important for coding. In fact, we aim for Wikifunctions to be usable for people who don't know how to code and who don't need to learn how to code to use most of Wikifunctions effectively. Though the Wikifunctions community may well help each other in sharing best practices, style guides, and tips on how to use the site in different languages, these will be aimed at the purpose of serving the world's knowledge. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not (only) the boiler room for Abstract Wikipedia == </div> [[File:Mechanical_room_in_basement._Wayne_N._Aspinall_Federal_Building_and_U.S._Courthouse,_Grand_Junction,_Colorado_LCCN2014650034.tif|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">A '[[d:Q6804549|boiler room]]', where unsightly-but-vital machinery is hidden</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> Natural language generation (NLG) is the focus of {{SITENAME}} as of 2026, and the site began as part of the wider [[meta:Special:MyLanguage/Abstract_Wikipedia|Abstract Wikipedia project]], but NLG is far from the only field in which functions are being developed. That is to say, WF is necessary for AW, but AW is not necessary for WF. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> On top of the computer science staples of Boolean logic, arithmetic, and list manipulation, we have useful functions relating to disciplines such as [[Z16718|chemistry]], [[Z35550|dimensional analysis]], [[Z20074|electrical engineering]], [[Z22162|genomics]], [[Z10393|information theory]], [[Z26830|meteorology]], [[Z13955|number theory]], [[Z27919|physiology]], [[Z20094|probability]], [[Z24497|quantum mechanics]], [[Z14226|railroad engineering]], [[Z28600|timekeeping/chronometry]], and [[Z26841|trigonometry]]. </div> [[Category:Project concept{{#translation:}}]] 2smnim7o7mo0nxlwhsyst4ch1dm8174 Wikifunctions:What Wikifunctions is not/ja 4 11559 331063 190628 2026-10-23T08:06:07Z FuzzyBot 207 Updating to match new version of source page 331063 wikitext text/x-wiki <languages/> {{shortcut|[[WF:NOT]]}} {{Draft}} <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions is a new kind of website, aiming for a new community. We very much hope to work together with many tools, sites, communities, and kinds of systems that are out there: we want to play together with IDEs, with cloud computing platforms, with app development sites, and many more. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> But we also aim to be a novel thing and we hope to shape a new unique space out for us: a Wikimedia project for everyone to collaboratively create and maintain a library of code functions to support the Wikimedia projects and beyond, for everyone to call and re-use in the world's natural and programming languages. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The scope of the project is within bounds, though. So, let us also explore '''what Wikifunctions is not'''. </div> <span id="Wikifunctions_is_not_an_encyclopædia_of_algorithms"></span> == ウィキファンクションズはアルゴリズムの百科事典ではありません == <div lang="en" dir="ltr" class="mw-content-ltr"> This means that we will '''not''' concentrate on having pages for famous and not-so famous algorithms such as [[w:Euclidean algorithm|Euclid's]], [[w:Newton's method|Newton's]], or [[w:Dijkstra's algorithm|Dijkstra's algorithm]], aiming to represent all existing algorithms faithfully and in their historical context. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Yes, we expect to have a function for the [[w:Greatest common divisor|greatest common divisor]] (GCD) of two integers. And there might be one or more implementations which are based on Euclid's algorithm to calculate the GCD. But Wikifunctions' main goal is not to gather algorithms, and it would not be incomplete if it didn't include some, and used alternatives instead to compute the GCD. If you are looking for that, many Wikipedias are actually [[w:List of algorithms|great resources]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Unlike an encyclopedic overview of existing algorithms, Wikifunctions will also invite original work. We will not be restricted to functions that have been published elsewhere first, and we do not require for every function and implementation to be based on previously published work. Wikifunctions, much like Wikibooks and very unlike Wikipedia, will be open to novel contributions. The main criteria for implementations will be: under which conditions can we run a given implementation, and what resources is it expected to take? </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not an app development site == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We do not expect to make it possible to create full-fledged, stand-alone apps within Wikifunctions — there will be no place to store state, we don't aim to allow calling external APIs or directly cause changes to other sites, and we don't aim to package up apps with icons and UX, etc. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We absolutely expect Wikifunctions to be a very useful resource for app developers, and can very much imagine apps that are basically wrappers around one or more functions from Wikifunctions, but these would still need code and other assets which wouldn't be part of Wikifunctions. We are not competing in the area of no-code or low-code development sites. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a code hosting service == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions will host code — but not for whole projects, merely for individual functions. There won't be libraries, apps, or services developed on Wikifunctions with bug-trackers, forums, etc. There won't be a Web-based version control system such as ''Mercurial'' or ''Git'' running against Wikifunctions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Again, we hope that there will be libraries, apps, and services that will rely on functions available in Wikifunctions, but they would be developed on a different site, such as ''Gerrit'', ''GitHub'', or ''GitLab''. </div> <span id="Wikifunctions_is_not_a_programming_language,_nor_is_trying_to_evangelise_a_particular_language"></span> == ウィキファンクションズはプログラミング言語ではなく、特定の言語を広めようとしていません == <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions will allow for functions to be implemented in a multitude of programming languages. The possibility to compose functions together to create higher level functions may look a little bit like a new programming language, but it will be extremely limited compared to most other programming languages, since we only allow for nested function calls and that's it. </div> <span id="Wikifunctions_is_not_an_Integrated_Development_Environment_(IDE)"></span> == ウィキファンクションズは統合開発環境(IDE)ではありません == <div lang="en" dir="ltr" class="mw-content-ltr"> We won't provide you with an interface for creating and developing software projects, interfacing with build, testing, and source control systems. </div> <span id="Wikifunctions_is_not_a_question-and-answer_website"></span> == ウィキファンクションズはQ&Aサイトではありません == <div lang="en" dir="ltr" class="mw-content-ltr"> We are not competing with ''Stack Overflow'' and similar websites, where a developer would ask how to achieve a certain task and have community members discuss and answer the question. We won't contain code snippets to help answer the question, but we will organize code within our website to enable the evaluation of functions within a library of functions. </div> <span id="Wikifunctions_is_not_a_cloud_computing_platform"></span> == ウィキファンクションズはクラウドコンピューティングプラットフォームではありません == <div lang="en" dir="ltr" class="mw-content-ltr"> We do not provide computing resources and access to services and APIs so that you can run your computational needs on our platform, either for money or for free. Use of Wikifunctions's evaluation platform is to improve access to knowledge for everyone. </div> <span id="Wikifunctions_is_not_a_code_snippet_website"></span> == ウィキファンクションズはコードスニペットサイトではありません == <div lang="en" dir="ltr" class="mw-content-ltr"> We are not competing with code snippet sites such as GitHub Gists, [[w:Rosetta_Code|Rosetta Code]], [https://esolangs.org/ esolangs.org], or [http://helloworldcollection.de/ helloworldcollection.de]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions differs in that it allows running code and composing existing functions together to create new ones. As well, Wikifunctions is for useful and meaningful code, not temporary, arbitrary snippets that other platforms may accept. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a code education platform == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We are not focused on teaching people how to code, the material in Wikifunctions will not be laid out in a pedagogical order, and we also won't make sure to comprehensively cover all topics important for coding. In fact, we aim for Wikifunctions to be usable for people who don't know how to code and who don't need to learn how to code to use most of Wikifunctions effectively. Though the Wikifunctions community may well help each other in sharing best practices, style guides, and tips on how to use the site in different languages, these will be aimed at the purpose of serving the world's knowledge. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not (only) the boiler room for Abstract Wikipedia == </div> [[File:Mechanical_room_in_basement._Wayne_N._Aspinall_Federal_Building_and_U.S._Courthouse,_Grand_Junction,_Colorado_LCCN2014650034.tif|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">A '[[d:Q6804549|boiler room]]', where unsightly-but-vital machinery is hidden</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> Natural language generation (NLG) is the focus of {{SITENAME}} as of 2026, and the site began as part of the wider [[meta:Special:MyLanguage/Abstract_Wikipedia|Abstract Wikipedia project]], but NLG is far from the only field in which functions are being developed. That is to say, WF is necessary for AW, but AW is not necessary for WF. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> On top of the computer science staples of Boolean logic, arithmetic, and list manipulation, we have useful functions relating to disciplines such as [[Z16718|chemistry]], [[Z35550|dimensional analysis]], [[Z20074|electrical engineering]], [[Z22162|genomics]], [[Z10393|information theory]], [[Z26830|meteorology]], [[Z13955|number theory]], [[Z27919|physiology]], [[Z20094|probability]], [[Z24497|quantum mechanics]], [[Z14226|railroad engineering]], [[Z28600|timekeeping/chronometry]], and [[Z26841|trigonometry]]. </div> [[Category:Project concept{{#translation:}}]] movicl6qhj2z81pyjygxjt2vutby2en Wikifunctions:What Wikifunctions is not/fr 4 11767 331059 246678 2026-10-23T08:06:05Z FuzzyBot 207 Updating to match new version of source page 331059 wikitext text/x-wiki <languages/> {{shortcut|[[WF:NOT]]}} {{Draft}} Wikifunctions est un nouveau type de site web, destiné à une nouvelle communauté. Nous espérons vivement travailler avec de nombreux outils, sites, communautés et types de systèmes existants : nous voulons jouer avec les IDE, les plateformes de cloud computing, les sites de développement d'applications, et bien d'autres encore. Mais nous visons également à être une chose nouvelle et nous espérons façonner un nouvel espace unique pour nous : un projet Wikimedia pour que tout le monde crée et maintienne en collaboration une bibliothèque de fonctions de code pour soutenir les projets Wikimedia et au-delà, pour que tout le monde puisse appeler et réutiliser dans les langages naturels et de programmation du monde entier. Les objectifs du projet sont néanmoins limités. Alors, explorons aussi '''ce que Wikifunctions n'est pas'''. <span id="Wikifunctions_is_not_an_encyclopædia_of_algorithms"></span> == Wikifunctions n'est pas une encyclopédie d'algorithmes == Cela signifie que nous n'allons pas nous concentrer d'avoir des pages pour les algorithmes célèbres et moins célèbres tels que [[w:Euclidean algorithm|l'algorithme d'Euclide]], [[w:Newton's method|la méthode de Newton]], ou [[w:Dijkstra's algorithm|l'algorithme de Dijkstra]], afin de représenter tous les algorithmes existants fidèlement et dans leur contexte historique. Oui, nous nous attendons à avoir une fonction pour le [[w:Greatest common divisor|plus grand commun diviseur]] (PGCD) de deux entiers. Et il pourrait y avoir ou non une ou plusieurs implémentations basées sur l'algorithme d'Euclide pour calculer le PGCD. Mais Wikifunctions ne serait pas incomplet si ce n'était pas le cas, et si, au lieu de cela, nous avions d'autres algorithmes pour calculer le PGCD. Si vous cherchez cela, de nombreuses Wikipédias sont en fait [[w:List of algorithms|d'excellentes ressources]]. À la différence d'un aperçu encyclopédique des algorithmes existants, Wikifunctions invitera également à des travaux originaux. Nous ne serons pas limités aux fonctions qui ont été publiées ailleurs en premier, et nous n'exigeons pas que chaque fonction et implémentation soit basée sur un travail déjà publié. Wikifunctions, à l'instar des Wikibooks et à la différence de Wikipédia, sera ouverte aux nouvelles contributions. Les principaux critères d'évaluation des implémentations seront les suivants : dans quelles conditions une implémentation donnée peut-elle être exécutée et quelles sont les ressources qu'elle est censée nécessiter ? <span id="Wikifunctions_is_not_an_app_development_site"></span> == Wikifunctions n'est pas un site de développement d'applications == Nous ne prévoyons pas de rendre possible la création d'applications autonomes à part entière au sein de Wikifunctions &mdash; il n'y aura pas d'endroit pour stocker l'état, nous ne visons pas à permettre l'appel d'API externes ou à provoquer directement des changements sur d'autres sites, et nous ne visons pas à empaqueter les applications avec des icônes et UX, etc. Nous nous attendons à ce que Wikifunctions soit une ressource très utile pour les développeurs d'applications, et nous pouvons très bien imaginer des applications qui sont essentiellement des enveloppes autour d'une ou plusieurs fonctions de Wikifunctions, mais elles nécessiteraient toujours du code et d'autres ressources qui ne feraient pas partie de Wikifunctions. Nous ne sommes pas en concurrence dans le domaine des sites de développement sans code ou à faible code. <span id="Wikifunctions_is_not_a_code_hosting_service"></span> == Wikifunctions n'est pas un service d'hébergement de code == Wikifunctions hébergera du code - mais pas pour des projets entiers, simplement pour des fonctions individuelles. Il n'y aura pas de bibliothèques, d'applications ou de services développés sur Wikifunctions avec des systèmes de suivi des bogues, des forums, etc. Il n'y aura pas de système de contrôle de version basé sur le web tel que ''Mercurial'' ou ''Git'' fonctionnant avec Wikifunctions. Encore une fois, nous espérons qu'il y aura des bibliothèques, des applications et des services qui s'appuieront sur les fonctions disponibles dans Wikifunctions, mais qu'ils seront développés sur un site différent, comme ''Gerrit'', ''GitHub'', ou ''GitLab''. <span id="Wikifunctions_is_not_a_programming_language,_nor_is_trying_to_evangelise_a_particular_language"></span> == Wikifunctions n'est pas un langage de programmation, et n'essaie pas de promouvoir un langage particulier == Wikifunctions permettra de mettre en œuvre des fonctions dans une multitude de langages de programmation. La possibilité de composer des fonctions ensemble pour créer des fonctions de plus haut niveau peut ressembler un peu à un nouveau langage de programmation, mais elle sera extrêmement limitée par rapport à la plupart des autres langages de programmation, puisque nous n'autorisons que les appels de fonctions imbriquées, et c'est tout. <span id="Wikifunctions_is_not_an_Integrated_Development_Environment_(IDE)"></span> == Wikifunctions n'est pas un Environnement de Développement Intégré (IDE) == Nous ne vous fournirons pas d'interface pour la création et le développement de projets logiciels, ni d'interface avec les systèmes de construction, de test et de contrôle des sources. <span id="Wikifunctions_is_not_a_question-and-answer_website"></span> == Wikifunctions n'est pas un site de questions-réponses == Nous ne sommes pas en concurrence avec ''Stack Overflow'' ou d'autres sites Internet similaires, où un développeur demande comment réaliser une certaine tâche et où les membres de la communauté discutent et répondent à la question. Nous ne contiendrons pas d'extraits de code pour aider à répondre à la question, mais nous organiserons le code au sein de notre site web pour permettre l'évaluation des fonctions au sein d'une bibliothèque de fonctions. <span id="Wikifunctions_is_not_a_cloud_computing_platform"></span> == Wikifunctions n'est pas une plateforme de cloud computing == Nous ne fournissons pas de ressources informatiques ni d'accès aux services ni aux API pour que vous puissiez exécuter vos besoins informatiques sur notre plateforme, que ce soit à titre onéreux ou gratuit. L'utilisation de la plateforme d'évaluation de Wikifunctions vise à améliorer l'accès à la connaissance pour tous. <span id="Wikifunctions_is_not_a_code_snippet_website"></span> == Wikifunctions n'est pas un site d'extraits de code == Nous ne sommes pas en concurrence avec des sites d'extraits de code tels que Github Gist, [[w:Rosetta_Code|Rosette de code]]'', ''[https://esolangs.org/ esolangs.org]'', or ''[http://helloworldcollection.de/ helloworldcollection.de]' Wikifunctions diffère en ce qu'il permet d'exécuter du code et de composer des fonctions existantes ensemble pour en créer de nouvelles. De plus, Wikifunctions est destiné à des codes utiles et significatifs, pas temporaires ni arbitraires que d'autres plateformes peuvent accepter. <span id="Wikifunctions_is_not_a_code_education_platform"></span> == Wikifunctions n'est pas une plateforme de formation au codage == Nous n'avons pas pour vocation d'enseigner le codage, le contenu de Wikifunctions ne sera pas présenté dans un ordre pédagogique et nous ne nous assurerons pas non plus de couvrir de manière exhaustive tous les sujets importants pour le codage. En fait, nous voulons que Wikifunctions soit utilisable par des personnes qui ne savent pas coder et qui n'ont pas besoin d'apprendre à coder pour utiliser la quasi-totalité de Wikifunctions de manière efficace. Bien que la communauté de Wikifunctions puisse s'entraider en partageant les meilleures pratiques, les guides de style et les conseils sur la façon d'utiliser le site dans différentes langues, ceux-ci seront destinés à servir la connaissance du monde. <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not (only) the boiler room for Abstract Wikipedia == </div> [[File:Mechanical_room_in_basement._Wayne_N._Aspinall_Federal_Building_and_U.S._Courthouse,_Grand_Junction,_Colorado_LCCN2014650034.tif|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">A '[[d:Q6804549|boiler room]]', where unsightly-but-vital machinery is hidden</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> Natural language generation (NLG) is the focus of {{SITENAME}} as of 2026, and the site began as part of the wider [[meta:Special:MyLanguage/Abstract_Wikipedia|Abstract Wikipedia project]], but NLG is far from the only field in which functions are being developed. That is to say, WF is necessary for AW, but AW is not necessary for WF. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> On top of the computer science staples of Boolean logic, arithmetic, and list manipulation, we have useful functions relating to disciplines such as [[Z16718|chemistry]], [[Z35550|dimensional analysis]], [[Z20074|electrical engineering]], [[Z22162|genomics]], [[Z10393|information theory]], [[Z26830|meteorology]], [[Z13955|number theory]], [[Z27919|physiology]], [[Z20094|probability]], [[Z24497|quantum mechanics]], [[Z14226|railroad engineering]], [[Z28600|timekeeping/chronometry]], and [[Z26841|trigonometry]]. </div> [[Category:Project concept{{#translation:}}]] t3odjphni4i0qub68kjh4rwde9qipwc Wikifunctions:What Wikifunctions is not/en-gb 4 11981 331055 190619 2026-10-23T08:06:04Z FuzzyBot 207 Updating to match new version of source page 331055 wikitext text/x-wiki <languages/> {{shortcut|[[WF:NOT]]}} {{Draft}} Wikifunctions is, as far as we can tell, a new kind of website, aiming for a new community. We very much hope to work together with many tools, sites, communities, and kind of systems that are out there: we want to play together with IDEs, with cloud computing platforms, with app development sites, and many more. But we also aim to be a novel thing and we hope to shape a new unique space out for us: a Wikimedia project for everyone to collaboratively create and maintain a library of code functions to support the Wikimedia projects and beyond, for everyone to call and re-use in the world's natural and programming languages. <div class="mw-translate-fuzzy"> So, without further ado, let us also explore '''what Wikifunctions is not'''. </div> <span id="Wikifunctions_is_not_an_encyclopædia_of_algorithms"></span> == Wikifunctions is not an encyclopaedia of algorithms == This means that we will '''not''' have pages for famous and not-so famous algorithms such as [[w:Euclidean algorithm|Euclid's]], [[w:Newton's method|Newton's]], or [[w:Dijkstra's algorithm|Dijkstra's algorithm]], aiming to represent all existing algorithms faithfully and in their historical context. Yes, we expect to have a function for the [[w:Greatest common divisor|greatest common divisor]] (GCD) of two integers. And there might or might not be one or more implementations which are based on Euclid's algorithm to calculate the GCD. But Wikifunctions would not be incomplete if it didn't, and if, instead, we had alternative algorithms to calculate the GCD. If you are looking for that, many Wikipedias are actually [[w:List of algorithms|great resources]]. Unlike an encyclopaedic overview of existing algorithms, Wikifunctions will also invite original work. We will not be restricted to functions that have been published elsewhere first, and we do not require for every function and implementation to be based on previously published work. Wikifunctions, much like Wikibooks and very unlike Wikipedia, will be open to novel contributions. The main criteria for implementations will be: under which conditions can we run a given implementation, and what resources is it expected to take? == Wikifunctions is not an app development site == We do not expect to make it possible to create full-fledged, stand-alone apps within Wikifunctions — there will be no place to store state, we don't aim to allow calling external APIs or directly cause changes to other sites, and we don't aim to package up apps with icons and UX, etc. We absolutely expect Wikifunctions to be a very useful resource for app developers, and I can very much imagine apps that are basically wrappers around one or more functions from Wikifunctions, but these would still need code and other assets which wouldn't be part of Wikifunctions. We are not competing in the area of no-code or low-code development sites. == Wikifunctions is not a code hosting service == Wikifunctions will host code — but not for whole projects, merely for individual functions. There won't be libraries, apps, or services developed on Wikifunctions with bug-trackers, forums, etc. There won't be a Web-based version control system such as ''mercurial'' or ''git'' running against Wikifunctions. Again, we hope that there will be libraries, apps, and services that will rely on functions available in Wikifunctions, but they would be developed on a different site, such as ''Gerrit'', ''GitHub'', or ''GitLab''. == Wikifunctions is not a programming language, nor is trying to evangelise a particular language == Wikifunctions will allow for functions to be implemented in a multitude of programming languages. The possibility to compose functions together to create higher level functions may look a little bit like a new programming language, but it will be extremely limited compared to most other programming languages, since we only allow for nested function calls and that's it. == Wikifunctions is not an Integrated Development Environment (IDE) == We won't provide you with an interface for creating and developing software projects, interfacing with build, testing, and source control systems. == Wikifunctions is not a question-and-answer website == We are not competing with ''StackOverflow'' and similar websites, where a developer would ask how to achieve a certain task and have community members discuss and answer the question. We won't contain code snippets to help answer the question, but we will organise code within our website to enable the evaluation of functions within a library of functions. == Wikifunctions is not a cloud computing platform == We do not provide computing resources and access to services and APIs so that you can run your computational needs on our platform, either for money or for free. Use of Wikifunctions's evaluation platform is to improve access to knowledge for everyone. == Wikifunctions is not a code snippet website == <div class="mw-translate-fuzzy"> We are not competing with sites such as ''gist'', or sites such as ''[$1 rosettacode.org]'', ''[https://esolangs.org/ esolangs.org]'', or ''[http://helloworldcollection.de/ helloworldcollection.de]'', where code snippets are collected either to share them quickly with others or around a specific theme in different programming languages. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions differs in that it allows running code and composing existing functions together to create new ones. As well, Wikifunctions is for useful and meaningful code, not temporary, arbitrary snippets that other platforms may accept. </div> == Wikifunctions is not a code education platform == We are not in the business of teaching people how to code, the material in Wikifunctions will not be laid out in a pedagogical order, and we also won't make sure to comprehensively cover all topics important for coding. In fact, we aim for Wikifunctions to be usable for people who don't know how to code and who don't need to learn how to code to use most of Wikifunctions effectively. Though the Wikifunctions community may well help each other in sharing best practices, style guides, and tips on how to use the site in different languages, these will be aimed at the purpose of serving the world's knowledge. <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not (only) the boiler room for Abstract Wikipedia == </div> [[File:Mechanical_room_in_basement._Wayne_N._Aspinall_Federal_Building_and_U.S._Courthouse,_Grand_Junction,_Colorado_LCCN2014650034.tif|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">A '[[d:Q6804549|boiler room]]', where unsightly-but-vital machinery is hidden</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> Natural language generation (NLG) is the focus of {{SITENAME}} as of 2026, and the site began as part of the wider [[meta:Special:MyLanguage/Abstract_Wikipedia|Abstract Wikipedia project]], but NLG is far from the only field in which functions are being developed. That is to say, WF is necessary for AW, but AW is not necessary for WF. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> On top of the computer science staples of Boolean logic, arithmetic, and list manipulation, we have useful functions relating to disciplines such as [[Z16718|chemistry]], [[Z35550|dimensional analysis]], [[Z20074|electrical engineering]], [[Z22162|genomics]], [[Z10393|information theory]], [[Z26830|meteorology]], [[Z13955|number theory]], [[Z27919|physiology]], [[Z20094|probability]], [[Z24497|quantum mechanics]], [[Z14226|railroad engineering]], [[Z28600|timekeeping/chronometry]], and [[Z26841|trigonometry]]. </div> [[Category:Project concept{{#translation:}}]] 1l06pm4iq9hzzusz3avp92u1gf4rf5r Wikifunctions:How to create implementations/en-gb 4 12322 331112 296939 2026-10-23T08:23:21Z FuzzyBot 207 Updating to match new version of source page 331112 wikitext text/x-wiki <languages/> <div lang="en" dir="ltr" class="mw-content-ltr"> This page provides a more detailed guide to '''creating implementations''', beyond the overview at {{ll|Wikifunctions:Introduction}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Types of Implementations == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In Wikifunctions, an '''implementation''' can take one of two main forms: '''code''' or '''composition'''. A code implementation directly expresses the function’s logic in any of the available programming languages (currently, Python3 or JavaScript). It’s most useful when the function’s behavior can’t easily be built from existing Wikifunctions, or when precise control over data processing is needed. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> A composition implementation, on the other hand, defines the function entirely by combining other existing functions, without writing code. Compositions are easier to understand, reuse, and translate into other languages automatically, but they depend on suitable building blocks already being available and often are less performant. In general, start by checking whether your goal can be achieved through composition; if it can’t, or if performance or fine-grained logic matters, choose a code implementation instead. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> There's a third type of implementation: '''built-ins'''. These are run by system-built code, and are not editable. Most likely all pre-defined functions will have a built-in implementation. In such cases, when opening the implementation page, you will see a message stating ''"{{int|wikilambda-implementation-selector-none}}"'' </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Practice Test-Driven Development == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> '''Test-Driven Development''', or '''TDD''', is a way of creating software where you write tests before you write the actual code. Tests are just a way of understanding what your function is supposed to do by listing examples and how they should work. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In Wikifunctions, writing tests first offers significant benefits. If you are working on an implementation, you can run your code against the existing tests to check that it behaves as expected. This makes it easier to catch errors early before even publishing your implementation. Tests are also a powerful way to describe the function you need. By writing tests, '''you clearly communicate the expected behavior''', and the community can step in and help with the implementation, or create alternative implementations. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Imagine you want to implement a Function that combines two strings with a space in between. A basic test for this might look like: </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello", "world" ) => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Once you have defined the basic behavior, it's important to '''think about edge cases'''—situations where the inputs are such that you might need some special behavior. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, what if your first string ends in a space, or your second string starts with a space? Should the function keep all existing spaces and add another one, or should it return a neatly spaced result with just a single space between the words? Depending on your requirements, you should build a test for such a case. For example, a test for this edge case could be either one of these — but not both!: </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> or ... </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Make sure that all possible special cases are covered by your tests, and once you have them, make sure that they are all connected to the Function by selecting them and clicking "Connect". </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Code implementations == </div> [[File:Code implementation.png|thumb|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions code editor initialized with a function template</span>|<span lang="en" dir="ltr" class="mw-content-ltr">When adding a new code implementation, the function template is initialized with the function and argument names</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> When creating an implementation using code, the Wikifunctions UI will set up a code editor with the selected language activated for syntax highlighting and validation. When the function to implement and the programming language are selected, this editor will be set with the correct function template: '''do not remove or edit this'''! Keep your code inside this function signature: if you need auxiliary functions, you can simply declare them inside your top-level function declaration. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Using input types in your code === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions types {{Z|Z6}} and {{Z|Z40}} can be used as if they were native types in both JavaScript and Python3. For example, a String input can be concatenated or a Boolean be directly used in a logical expression. To use other types in your code implementations, you will have to look deeper into the type, figure out if it has a conversion to a native equivalent, and treat it accordingly. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, let's say we want to write some Python code that handles an input of type {{Z|Z20420}}. In the page for this type, let's look at its "type converters to code" and search for a Python one. The converter {{Z|Z20424}} will be applied to our date input before our code, so looking at "native type" we know that our input will be a Python ''dict'' and looking at the implementation we can see the keys we can expect: </div> <syntaxhighlight lang="python3"> return { 'K1': year, 'K2': month, 'K3': day } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> When a type doesn't have a converter, you'll have to access its parts directly using its keys. For example, let's assume that your function <code>Z30000</code> has one input <code>Z30000K1</code> of type {{Z|Z11}}. This type has two keys: <code>Z11K1</code> for the language (itself an object of type {{Z|Z60}}), and <code>Z11K2</code> for the string value. Similarly, the language object has a key <code>Z60K1</code> for the language code. So, to get a string with the language code and the text, you can write: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1 ) { // e.g. "en: some text" return Z30000K1.Z11K1.Z60K1 + ": " + Z30000K1.Z11K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> For a quick reference of the available type conversions visit [[Special:MyLanguage/Wikifunctions:Execution targets#Default type conversion|the default type conversion table]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Returning the right outputs === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Similarly to the way you treat inputs, outputs need to match the type specified in the function definition. Some can be treated as simply as native types, so any string output will be converted into a Wikifunctions {{Z|Z6}} object and any native boolean returned by your implementation will be converted into a Wikifunctions {{Z|Z40}} object. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Those types that have "type converters from code" will apply the appropriate function to the output, in order to build the required type. Following the example of {{Z|Z20420}}, the {{Z|Z20443}} will transform the output from your implementation–a dict with K1, K2 and K3 keys–into its correct ZObject representation. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For types that don't have converters from code, you can carefully build and return the output objects. For example, imagine that our function <code>Z30000</code> takes two string inputs: language code and text, and should return a {{Z|Z11}} object. You can do this in Python by using the <code>ZObject</code> constructor: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): lang_object = ZObject( {"Z1K1": "Z9", "Z9K1": "Z60"}, Z60K1 = Z30000K1 ) return ZObject( {"Z1K1": "Z9", "Z9K1": "Z11"}, Z11K1 = lang_object, Z11K2 = Z30000K2 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Or in JavaScript: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { const langObject = new ZObject( new Map( [ [ "Z60K1", Z30000K1 ] ] ), { "Z1K1": "Z9", "Z9K1": "Z60" } ); const monolingualKeys = new Map( [ [ "Z11K1", langObject ], [ "Z11K2", Z30000K2 ] ] ); return new ZObject( monolingualKeys, { "Z1K1": "Z9", "Z9K1": "Z11" } ); } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> You can learn more about the <code>ZObject</code> class and other useful constructors in {{ll|Wikifunctions:Execution_targets#Custom_and_non-built-in_type_conversion}} </div> {{phab|T392750}}<div lang="en" dir="ltr" class="mw-content-ltr"> As of 2026-05, trying to return a list of lists may fail, so you're not able to implement such functions in code. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Code in Python === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section, we give a concrete example on how to create an implementation in the form of Code in Python. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is Z30000. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The implementation is defined using the ZID of the function. So are the arguments of the function. So in the case of the function Z30000 with its two arguments, the function template should look like this: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> As we described before, we know that the arguments (<code>Z30000K1</code> and <code>Z30000K2</code>) are Strings, so we can treat them as simply as we use native strings in Python. Also, the function should return a String. For our example, we simply return the two arguments concatenated with a space in between: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Since this is Python, do not forget to indent this line. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If you have followed our advice to [[#Practice Test-Driven Development|practice TDD]], you will already have a set of tests that you know should work. If that's the case, while building your implementation you can click on the circular arrow in the Tests panel, and see if your implementation passes all of them. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Remember that the runtime has no state. Don’t assume values for global or static variables. If you have further questions about what you can and cannot do in Python, ask on [[Wikifunctions:Python implementations]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Code in JavaScript === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section, we give a concrete example on how to create an implementation in the form of Code in JavaScript. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is <code>Z30000</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The implementation is defined using the ZID of the function. So are the arguments of the function. So in the case of the function <code>Z30000</code> with its two arguments, the function template should look like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> We know that the arguments (<code>Z30000K1</code> and <code>Z30000K2</code>) are Strings, so we can treat them as native strings in JavaScript. Also, the function should return a String. To complete our function, you can then add a line concatenating the input strings, like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> If you have tests as recommended in the [[#Practice Test-Driven Development|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes all of them. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Remember that the runtime has no state. Don’t assume values for global or static variables. If you have further questions about what you can and cannot do in JavaScript, ask on [[Wikifunctions:JavaScript implementations]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Calling another Wikifunctions function === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> A code implementation can call certain other Wikifunctions functions, receive the output of the call, and use that output in further processing. We refer to such calls as callbacks. At present, due to security and performance concerns, only the following built-in Wikidata fetch and search functions can be called in this way: {{Z|Z6820}}, {{Z|Z6821}}, {{Z|Z6822}}, {{Z|Z6824}}, {{Z|Z6825}}, {{Z|Z6826}}, {{Z|Z6830}}, and {{Z|Z6831}}. This capability is in an initial stage of deployment; we hope to allow calls to a broader range of functions in the future. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Let’s look at a JavaScript implementation containing a callback. This implementation fetches an item from Wikidata, extracts the label of that item in a given language, and returns the label string. The item to fetch is given by argument <code>Z400K1</code>, and the language is given by <code>Z400K2</code>. </div> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const item = Wikifunctions.Call('Z6821', Z400K1); for (const label of item.Z6001K2.Z12K1) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> A callback is made by calling <code>Wikifunctions.Call</code>, as shown in the example. The first argument to <code>Wikifunctions.Call</code> is always the ZID of the function to be called – in this case, {{Z|Z6821}}, which takes a single argument. Following that, the arguments to be passed to that function are listed, separated by commas. Here, that argument, <code>Z400K1</code>, is the same value that was passed to the function <code>Z400</code>. This is a common pattern of argument passing to callbacks, but their arguments can also be built using the <code>ZObject</code> constructor (as explained above), or obtained in other ways. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The value of <code>Z400K1</code> would be an instance of {{Z|Z6091}}, containing the QID of the item to be fetched. Line 2 of the example calls <code>Z6821</code> to fetch that item from Wikidata and assigns the resulting ZObject to the const <code>item</code>. The remaining code iterates over the item’s labels until it finds the one matching the language given by <code>Z400K2</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For the first example above, we have used <code>Z6821</code> for simplicity. However - unless an entire entity is needed by the implementation, it is strongly recommended to use <code>Z6820</code> to retrieve Wikidata items, which can be quite large. Although a call to <code>Z6820</code> is a bit more complex, its parameters allow for fetching selected portions of a Wikidata item, which can greatly improve performance and avoid some errors, by reducing the network bandwidth and processing time that are needed. (<code>Z6820</code> can also be used in place of <code>Z6822</code>, <code>Z6824</code>, <code>Z6825</code>, and <code>Z6826</code>, to get similar bandwidth-reduction benefits.) </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Just below we show how <code>Z6820</code> can be used, in <code>Wikifunctions.Call</code>, to implement the same behavior as above. Note that we use the second argument passed to <code>Z6820</code>, <code>[labelsPart]</code>, to say “Just return the item’s labels”, and we use the third argument, <code>[Z400K2]</code>, to say “Just return labels in the given language”. (This argument would also apply to aliases and descriptions, if they were included in the result.) </div> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const labelsPart = new ZObject( new Map( [ ['Z6030K1', new ZReference('Z6033')] ] ), {Z1K1: 'Z9', Z9K1: 'Z6030'} ); const entities = Wikifunctions.Call( 'Z6820', [Z400K1], [labelsPart], [Z400K2], []); const item = entities.get(Z400K1.Z6091K1); const labels = item.Z6001K2.Z12K1; for (const label of labels) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Other things to note: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Even though code implementations are now able to fetch Wikidata entities, it is recommended that they not be written to return ''entire'' entities. This is because of current limitations on the size of the value returned from a code implementation. To fetch and return an entire large entity, it’s better to call the fetch function from a composition.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Only one callback can execute at a time. For security reasons, it is not possible to use the concurrency features of JavaScript or Python to execute multiple callbacks in parallel.</span> ** <span lang="en" dir="ltr" class="mw-content-ltr">Keep in mind, however, that you can fetch multiple entities at once using Z6820.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">There is currently a 3 MiB limit on the size of Wikidata content that can be returned to a code implementation, by a single callback. The same limit applies to the size of the result returned from a code implementation.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> == Compositions == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section, we give a concrete example on how to create an implementation in the form of a composition. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is <code>Z30000</code>. </div> <div class="mw-translate-fuzzy"> It is usually a good idea to first think about how to combine existing functions in order to create the desired output. Sometimes this might be trivial and you can just go ahead with composing functions, but in many cases it is worthwhile to note the desired composition down. The Wikifunctions composition interface is not very good yet at editing compositions, so it is a good idea to first figure out what exactly you want to create. </div> <div class="mw-translate-fuzzy"> For example, for the given Function, we could use the existing [[{{Z|Z10000}}|''Function to concatenate strings'']]. That Function takes two strings and makes one string out of them. But we need to add a space in between. So we first concatenate a space to the end of the first string, and then concatenate the second string to the result of that first concatenation. So our composition could be noted down like this: </div> <syntaxhighlight lang="prolog"> join_strings( join_strings( Z30000K1, " " ), Z30000K2 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> There are multiple ways to write a composition: notice that the same thing could be accomplished with: </div> <syntaxhighlight lang="prolog"> join_strings( Z30000K1, join_strings( " ", Z30000K2 ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> An alternative implementation could also use the existing Function {{Z|Z15175}}, so your composition could be: </div> <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> As you can see, there are multiple ways to accomplish this, so take your time and explore the existing functions available in the {{ll|Wikifunctions:Catalogue}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's try to create the second example, <code>join_strings(Z30000K1, join_strings(" ", Z30000K2))</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In order to create this: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›" icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search for the name of the outermost function you want to use, which in this example is "join two strings". Then, select the wanted function from the dropdown list.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">You will see two new fields, one for each of the arguments needed for the selected function.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">For the first argument, we want to select the first input to our function:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and select "Argument reference".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id" you can now select the first string of your function from the dropdown, which contains all available inputs.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">For the second argument, we want to use the result of another call to "join two strings":</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and select "Function call".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function you want to call, which is again "join two strings".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For this inner function call, configure the "first string" by simply typing a white space in the text field, and configure the "second string" as you did for step 6: change it using the "…" button to "Argument reference", and then select the second argument in the dropdown.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Your composition is now complete! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You can expand and collapse the details using the chevron buttons to see how it looks. If you already have Tests as recommended in the [[#Practice Test-Driven Development|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes the tests. Once your composition passes the tests, go ahead and publish it. </div> [[File:Composition implementation expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its expanded view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its expanded view</span>]] [[File:Composition implementation collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its collapsed view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its collapsed view</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions error handling == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As a Wikifunctions function creator, you might want to warn the user calling your function when something goes wrong in the code, or when their inputs do not fit a certain criteria. For example, if your Function expects a string input to contain a name, you might want to check that the name is not empty and, if it is, show an error message that the person using your Function can understand. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For this purpose, you can use <code>Wikifunctions.Error()</code> from your code implementations or the function {{Z|Z851}} from your compositions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section you will learn: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">How to throw errors from both code and composition implementations,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to write tests for error cases, and</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to catch and handle errors thrown by functions that you are using in your compositions.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Throwing errors from code implementations === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> When writing code, both from JavaScript and Python, you can use <code>Wikifunctions.Error()</code> to end the execution with a wanted error. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> <code>Wikifunctions.Error()</code> has two parameters: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Error type: a string containing the ZID of the error type you want to return.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Error arguments: a list of string arguments to build the error.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's go one by one: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Error type ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> An error type is an object that describes a kind of error that could happen in the system. There are a number of built-in error types but you can also build other error types that are more suited to your use case. When using errors, the best idea is to browse through the available error types, which can be explored in [[Special:ListObjectsByType/Z50|this list]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If there are no errors that fit your case, create a new one by going to the create page, and selecting "Error type" in the type selector. Then, set the necessary fields: </div> [[File:Error type.png|thumb|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Error type creation in Wikifunctions</span>|<span lang="en" dir="ltr" class="mw-content-ltr">To create new Error type (Z50), edit the label and add the necessary keys.</span>]] * <span lang="en" dir="ltr" class="mw-content-ltr">'''Label''' – This is the main title of the error, which should contain a short but descriptive message. Set the error label on the right-side box titled "About".</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Keys''' – Keys contain additional information about what caused the error. For example, if an input had the wrong format, you might want to inform the user of what was the input content when raising the error. To use them in your implementations, keys should be strings. To create a key, click on the "[+]" icon below "keys", select "String" under "value type", and add a label that describes it appropriately, for example "current input". Once you have all the necessary keys, you can Publish your error type and keep the ID of the newly created object.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error message''' – Error types can contain a multilingual array of HTML parametrized error messages. The parameter notation is $1, $2, etc., where the digit corresponds to the error type key. For example, when creating an error type with one string key "current input", the error message can use the positional parameter "$1", which will be replaced with the value of the "current input" key at the time of rendering the error. To add HTML messages, click on the "[+]" icon below "html fragments", select a language and input the HTML string.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Error arguments ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Error arguments correspond to the keys of the Error type, and they should provide additional information to understand the error. Error arguments should always be Strings. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Wikifunctions.Error() ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say that you want an error to be thrown when either your first or your second input are empty. You have already created the error type, and the assigned ZID was <code>Z30005</code>. Your error type has two string keys: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Input key: contains the key of the failing input</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Input value: contains the current value of the failing input</span> <div lang="en" dir="ltr" class="mw-content-ltr"> To raise an error in your JavaScript implementation you should do something like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { // If the first input is empty, raise error Z30005 // with two string args: [ first input key, first input value ] Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { // If the second input is empty, raise error Z30005 // with two string args: [ second input key, second input value ] Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> To raise an error in your Python implementation you should do something like this: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": # If the first input is empty, raise error Z30005 # with two string args: [ first input key, first input value ] Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": # If the second input is empty, raise error Z30005 # with two string args: [ first input key, first input value ] Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Remember that calling <code>Wikifunctions.Error()</code> ends the execution! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Throwing errors from compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If you are creating a composition implementation, you can throw an error by calling the special function {{Z|Z851}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Throw Error function (Z851) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z851}} function is similar to the <code>Wikifunctions.Error()</code> method and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – A reference to the Error type you want to raise</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error parameters''' – A list with the arguments to create your Error, which should also be Strings.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Throw Error ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say you want to modify your composition so that it first checks that the arguments are not empty, and raises an error when it finds an empty one. Then, if none of them are empty, it runs the original composition, which is: </div> <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> To do this, you need to create conditional paths, for which you can use the {{Z|Z802}} function. Think of it like this: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the first argument is empty, throw an error for the first argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Else, proceed to check the second argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the second argument is empty, throw an error for the second argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Else, proceed with the success path and return the joint strings with the space separator</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Or in functional pseudo code: </div> <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), throw_error( Z30005, [ "Z30000K1", Z30000K1 ] ), if( is_empty_string( Z30000K2 ), throw_error( Z30005, [ "Z30000K2", Z30000K2 ] ), join_with_separator( Z30000K1, Z30000K2, " " ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's create this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+” button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›” icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the outermost function you want to use, which in this case is "if".</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Check the validity of the first argument:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "condition", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "is empty string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "input", click on the "…" button and select "argument reference"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id", select the first input (e.g. "first string")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse the "condition" function call if you want, by clicking on the down-chevron next to "condition". You should see something like "f(x) is empty string( → first string )"</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Throw error if the condition is true:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "then", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Throw Error"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error type", search and select your error type (you can directly input the error ID if you know it, e.g. Z30005)</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error parameters", add two items by clicking on the "+" button</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For "Item 1" (offending argument key), set its type to "String" and write the argument identifier (e.g. "first input", or "Z30000K1")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For "Item 2" (offending argument value), click on the "…" next to "Item 2" and select "argument reference"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id", select the first input (e.g. "first string")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse the "then" function call if you want, by clicking on the down-chevron next to "then". You should see something like "f(x) Throw Error( Input was the wrong format, Typed list( Object, "first input", → first string ) )"</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Continue to check the second argument if the first was good:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "else", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "if"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Set up "condition" to check the validity of the second argument by following the same process as described in step 5.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Set up "then" to throw an error for the second argument by following the same process as described in step 6.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Finally, set up the success path:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to the nested "else", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the successful function, which in this case can be "join strings with separator"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and set it to "argument reference", then select "first string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and set it to "argument reference", then select "second string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "separator" add a space into the text field</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The resulting function call should look like this: </div> [[File:Throw error expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function</span>]] [[File:Throw error collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function, in its collapsed view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function, in its collapsed view</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Handling errors in compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> While it is useful to allow functions to raise expected errors, it is crucial to be able to handle errors in your compositions in order to safely use these functions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say you want to create a new function "full name of a person" – we will refer to it with the ZID <code>Z30010</code>. This function should return the full name of a person given a first and last names, but if any of the two fields are empty, it should return the text "Unknown" instead. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You could create a composition using our example function "Join two strings with a space" or <code>Z30000</code> to generate the name. If any of the inputs are empty, you know that <code>Z30000</code> will throw an error of type <code>Z30005</code>. Using the function {{Z|Z850}} as a wrapper, you can attempt the join operation and intercept a possible error to simply return "Unknown" whenever it occurs. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Try-Catch function (Z850) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z850}} function is built-in with ZID <code>Z850</code> and takes three arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – The initial function call to run. If nothing goes wrong, the response will be the result of this function call.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – An error type to catch in case it is thrown during the execution of the first function call.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error handler''' – A function call that will be run in case the error specified above is caught during the execution of the initial function call. If that happens, the result of the error handler will be the value returned.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Try-Catch ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Once we have all the functions for our composition, we can craft it like this: </div> <syntaxhighlight lang="prolog"> try_catch( join_with_space( Z30010K1, Z30010K2 ), Z30005, echo( "Unknown" ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This means that: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">The "Join two strings with a space" function will be tried with the two inputs and, if everything goes well, the output of this function will be returned</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If any of the inputs are blank, "Join two strings with a space" with raise an error of type <code>Z30005</code></span> * <span lang="en" dir="ltr" class="mw-content-ltr">Our {{Z|Z850}} will then detect this error and run the {{Z|Z801}} function to return "Unknown"</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's create this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›” icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the outermost function you want to use, which in this case is "Try-Catch".</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Set the main function call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under the field where the "Try-Catch" function is selected, next to the "function call" key, click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the function "join two strings with space"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and select "argument reference", then select the "first name" argument from the dropdown.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and select "argument reference", then select the "second name" argument from the dropdown.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Select the error to catch:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error type", search and select "bad string input" – you can search directly by its ZID <code>Z30005</code></span> # <span lang="en" dir="ltr" class="mw-content-ltr">Set the error handler function call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "error handler", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "echo"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "input" and "type", search and select the type "String"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now, under "input", type "Unknown" in the text field</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The resulting function should look like this: </div> [[File:Try catch expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in expanded mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in expanded mode</span>]] [[File:Try catch collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in collapsed mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in collapsed mode</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Testing your failure use cases === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As we introduced in the above section about [[#Practice Test-Driven Development|practicing TDD]], it's important to test not only the most common paths, but also the possible edge cases. It is equally important to test failure behavior. In this section we will give you the tools necessary to test that your function fails with a given set of inputs, and that the error thrown is the expected one. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> To do that, you will need other two system functions: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Is error type (Z852) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z852}} function is built-in with ZID <code>Z852</code> and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error''' – An {{Z|Z5}} object, which can be thrown by a failing call. An error instance has a type and a value.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – A reference to an {{Z|Z50}} which will be compared to the type of the Error passed as a first argument. If that's the case, the function will return true.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Get error thrown by function call (Z853) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z853}} function is built-in with ZID <code>Z853</code> and takes one argument: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – A function call which can either return a successful value of any type, or throw an error.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> This function returns a {{Z|Z882}} with a {{Z|Z40}} in first place and an {{Z|Z1}} in the second: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the Function call runs successfully and hence does not throw any error, the returned pair will contain False in the first place, and void in the second.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the Function call throws an error, the returned pair will contain True in the first place, and the caught error in the second.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> To use this function in your compositions, you might need to use the additional functions: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">{{Z|Z821}}, and</span> * {{Z|Z822}} <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Testing errors ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say our target function, "Join two strings with a space" or <code>Z30000</code>, throws an error of type <code>Z30005</code> and we want to test this behavior. To do that we need to: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Throw a failing function call</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Get the error using the function {{Z|Z853}}</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Check that the error is the right type with {{Z|Z852}}</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Tests have two fields: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Call''' – A function call that will produce an output with the inputs you want to test. This call will return a value.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Result validation''' – A function call that will validate that the value returned by the call above is the expected one. The first argument of this function call will be automatically assigned to take the return value of the first call.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> For step-by-step instructions on how to create tests, see {{ll|Wikifunctions:Introduction#Create_tests}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In our example, we can structure it like this — but this is not the only way! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The call, which will return an {{Z|Z5}} object: </div> <syntaxhighlight lang="prolog"> error = get_second_element_of_typed_list( get_error_thrown_by( join_strings_by_whitespace( "", "not empty" ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> And the result validation, which will take the {{Z|Z5}} object as its first argument: </div> <syntaxhighlight lang="prolog"> is_error_type( error, Z30005 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's do this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding a test by clicking on the "+" button in the "Tests" table from your Function page. The "call" and "result validation" fields already have some functions pre-set, but to test the errors we will need to change them.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">First, let's set the call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "call", click the "›" chevron button to expand the function call.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", edit the field and search and select the function "Get second element of a typed pair"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Once selected, next to "Typed pair", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Get error thrown by function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "function call", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Join two strings with a space" (or by ZID <code>Z30000</code>)</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now set the inputs so that they cause a failure: at least one of them should be empty.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse your "call" by clicking again on the down-chevron button if you want!</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Next, let's set the result validation:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "result validation", click the "›" chevron button to expand the function call.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", edit the field and search and select the function "Is error type"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now you will only be asked to configure the second argument. Under "error type", search and select your <code>Z30005</code> error type.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">And you are done! You can now click the circular arrow in the "Implementations" box and you should see green checks.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> If everything went right, you can now save your test. It should look like this: </div> [[File:Get error expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in expanded mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in expanded mode</span>]] [[File:Get error collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in collapsed mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in collapsed mode</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Creating actionable error messages === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As described above, Error Types have an optional key <code>Z50K3</code> which contains a multilingual list of HTML strings. When rendering information about an error, the messages stored in the error type can help create a clear, precise, informative, translatable and actionable error message. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For that purpose, error messages can contain parameters like <code>$1</code>, <code>$2</code>, etc., where the digit corresponds to the error type argument and its value in the error instance. These error messages are rendered in Wikifunctions inside the "Details" dialog window after executing a function call. Additionally, these error messages are surfaced in other client interfaces, like Abstract Wikipedia, to provide better guidance to Abstract Content editors. </div> [[File:Wikifunctions actionable error message example in the Details dialog.png|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">The error message is rendered using the HTML message of the error type and the error argument values.</span>]] [[File:Wikifunctions actionable error message example in Abstract Wikipedia.png|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">When available, the HTML error message is rendered in the Abstract Wikipedia preview section.</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> Let's use a real example to understand the benefits of HTML error messages: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The function {{Z|Z37847}} returns the first Lexeme reference given a Wikidata Item reference and a language. When there is no Lexeme for this Item-Language combination, it throws an error of type {{Z|Z28248}}, which has three keys: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K1''' is the input Wikidata item QID</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K2''' is the connecting property, in this case <code>P5137/item for this sense</code></span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K3''' is the language code</span> <div lang="en" dir="ltr" class="mw-content-ltr"> When calling this function for a Wikidata lexeme that doesn't exist, the call will throw an error instance like this: </div> <syntaxhighlight lang="json" highlight="10,12"> { "Z1K1": "Z5", "Z5K1": "Z28248", "Z5K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z885", "Z885K1": "Z28248" }, "Z28248K1": "Q319", "Z28248K2": "P5137", "Z28248K3": "ast" } } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> While the error type label indicates: <code>No matching lexeme for item in language</code>, a better error message should indicate: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">which is the failing item,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">which is the language missing, and</span> * <span lang="en" dir="ltr" class="mw-content-ltr">what are the possible ways to fix it.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The error message <code>Z50K3</code> field can provide this functionality. Whenever an Error Type has an error message for the user language (or any of its fallbacks), the error message shown will be rendered by: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">First, replacing the message parameters with the values of the keys. In our example, any <code>$1</code> will be replaced with the value of <code>Z28248K1</code> ("Q319"), <code>$2</code> with "P5137", and <code>$3</code> with "ast",</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Last, sanitizing and rendering the HTML message.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> So a HTML message like: </div> <syntaxhighlight lang="html"> There is no matching lexeme for the item $1 in "$3".<br> <a href="http://wikidata.org/wiki/$1">Edit in Wikidata</a> </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Will become: </div> : There is no matching lexeme for the item Q319 in "ast" : [[d:Q319|Edit in Wikidata]] <div lang="en" dir="ltr" class="mw-content-ltr"> == Debugging your implementations == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Sometimes things can go wrong. A function might behave differently than expected or a value might not look quite right. Sometimes implementations are really complex and, because they are run in a sandboxed environment, it can seem really difficult to debug. To help understand what's going on inside a function call, Wikifunctions includes a small set of debugging tools. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> These tools don't change the result of a function, but will add extra information to the returned metadata, which you can observe after running the function. You can use <code>Wikifunctions.Debug()</code> from your code implementations or the function {{Z|Z854}} from your compositions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section you will learn: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">How to add debug messages from both code and composition implementations,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to inspect the metadata manually or via the UI to inspect these logs.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Debugging your code implementations === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> When writing code, both from JavaScript and Python3, you can use <code>Wikifunctions.Debug()</code> to add a message to your debugging log and continue the execution. </div> {{phab|T441028}} <div lang="en" dir="ltr" class="mw-content-ltr"> <code>Wikifunctions.Debug()</code> has one parameter, which is generally expected to be a string. However, any other object passed as parameter will get directly converted into a string. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If we want to add debug logs to our code implementations for our "Join two strings with a space" example function, we can do, in JavaScript: </div> <syntaxhighlight lang="JavaScript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { Wikifunctions.Debug( `first input is empty "${ Z30000K1 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { Wikifunctions.Debug( `second input is empty "${ Z30000K2 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } Wikifunctions.Debug( "both inputs are fine" ); return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> And the same in your Python3 implementation will be: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": Wikifunctions.Debug( 'first input is empty "'+Z30000K1+'"' ) Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": Wikifunctions.Debug( 'second input is empty "'+Z30000K2+'"' ) Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) Wikifunctions.Debug( 'both inputs are fine' ) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This way, no matter what happens, we will be adding one message to your debugging logs: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the function call fails when checking on the first or second input, the result of the execution will be a failure, but it will contain one informative log about what branch caused the failure.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the function call succeeds—because both inputs are valid—the function call will return the joined string, but the returned metadata will also contain a debug log.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Debugging your compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> To support debugging compositions, Wikifunctions provides the built-in function {{Z|Z854}}. This function allows you to attach debug messages to the execution of any function call that generates the final output. The debug logs collected during the evaluation are returned as part of the execution metadata, under the <code>executorDebugLogs</code> key. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Add debug log to function call (Z854) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z854}} function is built-in with ZID <code>Z854</code> and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – Any composition you want to execute.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Debug log''' – A string message that will be recorded if the given function call is evaluated.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> When the wrapped function call runs, the provided message is added to the execution logs. If that function call is not executed, or its execution is not part of the final output, its debug log will not appear in the final result metadata. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You will benefit from this built-in if you want to observe: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Which branch of a conditional was executed, or</span> * <span lang="en" dir="ltr" class="mw-content-ltr">the order of evaluation in a composition.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Add debug log to function call ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say that you want to add debug logs to our example function "Join two strings with a space" or <code>Z30000</code>, so that different messages are added to the different possible outcomes. You could use our debugging builtin like this: </div> <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), add_debug_log( throw_error( Z30005, ... ), 'failed on first input' ) if( is_empty_string( Z30000K2 ), add_debug_log( throw_error( Z30005, ... ), 'failed on second input' ), add_debug_log( join_with_separator( Z30000K1, Z30000K2, " " ), 'both inputs are ok!' ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This way, </div> * <span lang="en" dir="ltr" class="mw-content-ltr">when called with an empty first input, the function will return a failed response, and the metadata will contain an <code>executorDebugLogs</code> entry with the "failed on first input" log.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">When called with an empty second input, the call will also fail, but the logged message will be "failed on second input"</span> * <span lang="en" dir="ltr" class="mw-content-ltr">When called with valid inputs, the function will return a successful response, and additionally the metadata will contain "both inputs are ok" in its <code>executorDebugLogs</code> key.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> This is the way this composition would look: </div> [[File:Add debug log expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Composition implementation using Add debug logs to log all possible execution paths</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Composition implementation using Add debug logs to log all possible execution paths</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Accessing execution debug logs === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Whether your execution logs are added via <code>Wikifunctions.Debug()</code> or via the {{Z|Z854}} built-in function, they are returned as part of the response metadata. To see the logs, once you run your function, click on the "Details" button that appears at the bottom of the "Result" section. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The error and debug information will appear at the top of the "Details" dialog. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> This is what you would see when running the composition from our previous example with valid and invalid inputs: </div> {| class="wikitable" | [[File:Execution logs success.png|frameless|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a successful execution with debug logs</span>]] | [[File:Execution logs failure.png|frameless|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a failed execution with debug logs</span>]] |- | <span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a successful execution: shows no errors, but displays the successful execution log: ''"both inputs are ok!"''</span> | <span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a failed execution: shows the error information, and the additional execution log for the first failure branch: ''"failed on first input"''</span> |} [[Category:How to create implementations| {{#translation:}}]] qhm1shtdyiu897ifgudbzh4it5i46dg Wikifunctions:Naming conventions/en 4 13267 331144 325774 2026-10-23T08:29:48Z FuzzyBot 207 Updating to match new version of source page 331144 wikitext text/x-wiki <languages/> {{shortcut|[[WF:NC]]}} {{Draft}} The page aims to sum up some conventions related to how are objects named at Wikifunctions. Since it's still a young project, there are not many guidelines defined yet. == Capitalization == Some languages use capital and small letters. Labels of objects should be written in such languages as if they were an ordinary phrase. Use of [[:w:en:Title case|Title case]] is discouraged. For example, instead of ''Calculate A Distance Between Earth And Sun On a Given Date'', type something like ''calculate a distance between Earth and Sun on a given date''. Capitalize only proper nouns and other words as required by the rules of the language in which you are writing. For example, this applies to nouns in German, and to some classes of words in English, such as days of week and names of languages. Don't capitalize those things if the rules of your language don't require this. When naming a foreign language in a label, use the label language's capitalization conventions (for example, "Toki Pona" should be capitalized in an English label). Abbreviations should use their conventional form; for example, in English, use "[[:en:RSA (cryptosystem)|RSA]]" and not "rsa" for the encryption algorithm name. By convention, names of objects that describe data types, should have their first letter capitalized (for example, [[Z1]] or [[Z8]]). == Search characters == The search engine uses a few characters as modifiers, so avoid these at the start of a word. These characters are: <code>~ * \? - " !</code>. Note that “?” on its own (rather than “\?”) is not a modifier. It is, however, a “greyspace” character. Other “greyspace” characters are <code>~ ! @ # $ % ^ & ( ) _ + - = { } | [ ] \ : " ; ' < > ? , . /</code>. The search engine treats these (singly or in combination) as part of the word boundary. This is not generally a problem, but if they are likely to be significant in searches, you should avoid them at the start or end of a word (or between words), unless necessary (for example, [[Z11729]]). See [[:mw:Special:MyLanguage/Help:CirrusSearch|Help:CirrusSearch]] for details of how to search for text containing any of these characters. == Implementation names == When creating an Implementation, please mention the language you used in its name (Python/JavaScript/Composition). If there are more than one implementation in the same language, it's recommended to give a little detail in the title of what makes this implementation different. For example, naming the algorithm name (if one exists). == Test cases == Labels of a test case should provide some clue about what you are checking there. It doesn't have to include values for every input and output, but should at least specify a domain that you're checking. For instance, you might want to say that this test checks the behavior of a string function when it's given letters from the Cyrillic alphabet, or of a mathematical function when a fraction or complex number is passed. If the test case is related to a string function, and you include a string argument in the test case name, please surround the argument in quotes or mark it in some other way so it will be clear what the value is. It's especially helpful if the value has significant whitespace at the beginning or end (for example, when testing a text-trimming function). == Configuration of functions for given languages == * Should start with "config for." ** If the configuration is a display function, it should be "config for displaying", followed by the exact name of the type. ** If the configuration is a read function, it should be "config for reading", following by the exact name of the type. == Types == * Should be in sentence case (e.g. Rational number) ** This rule should not be followed if the type name is used outside of Wikifunctions and more often than not is in a snake-case form (e.g. {{Z|Z20838}}) == Multi-lingual labels == {{Phab|T359663}} Labels in ''multiple languages'' (using the <code>mul</code> language code, per [[d:Special:MyLanguage/Help:Default values for labels and aliases|Wikidata's convention]]) can be used to specify the label in a way that doesn't involve words, for example as a mathematical expression. See {{Z|10512}} for an example. At the moment of writing, the software doesn't use these labels as a fallback though. == language-specific local naming conventions == Some languages may have their own language-specific naming conventions (these should probably be decided through discussions within the community that speaks the language, though many are likely drafts). * [[Wikifunctions:Naming conventions/日本語]] (Japanese) [[Category:Policy{{#translation:}}]] goyi1vmd94uypas7rsd9f1hp6ywvdqa Wikifunctions:Naming conventions/pl 4 13313 331148 325780 2026-10-23T08:29:50Z FuzzyBot 207 Updating to match new version of source page 331148 wikitext text/x-wiki <languages/> {{shortcut|[[WF:NC]]}} {{Draft}} Strona ma na celu podsumowanie niektórych konwencji związanych z nazwami obiektów na Wikifunkcjach. Ponieważ jest to wciąż młody projekt, nie ma jeszcze określonych wielu wytycznych. <span id="Capitalization"></span> == Kapitalizacja == <div class="mw-translate-fuzzy"> Etykiety obiektów należy pisać tak, jakby były zwykłą frazą. Nie zaleca się używania Wielkich Liter w tytule (np. „Oblicz Odległość Między Ziemią A Słońcem W Podanym Dniu”). Zamiast tego wpisz coś w rodzaju „oblicz odległość między Ziemią a Słońcem w podanym dniu”. </div> <div class="mw-translate-fuzzy"> Używaj wielkich liter tylko dla rzeczowników własnych i innych wyrazów, jeśli wymagają tego reguły gramatyki danego języka (np. rzeczowniki w języku niemieckim lub nazwy własne, jak dni tygodnia w języku angielskim) lub konwencje (w języku angielskim używaj „[[:pl:RSA (kryptografia)|RSA]]”, a nie „rsa”). </div> Zgodnie z konwencją, nazwy obiektów opisujących typy danych powinny mieć pierwszą literę pisaną wielką literą (np. [[Z1]] czy [[Z8]]). <div lang="en" dir="ltr" class="mw-content-ltr"> == Search characters == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The search engine uses a few characters as modifiers, so avoid these at the start of a word. These characters are: <code>~ * \? - " !</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Note that “?” on its own (rather than “\?”) is not a modifier. It is, however, a “greyspace” character. Other “greyspace” characters are <code>~ ! @ # $ % ^ & ( ) _ + - = { } | [ ] \ : " ; ' < > ? , . /</code>. The search engine treats these (singly or in combination) as part of the word boundary. This is not generally a problem, but if they are likely to be significant in searches, you should avoid them at the start or end of a word (or between words), unless necessary (for example, [[Z11729]]). See [[:mw:Special:MyLanguage/Help:CirrusSearch|Help:CirrusSearch]] for details of how to search for text containing any of these characters. </div> <span id="Implementation_names"></span> == Nazwy implementacji == Tworząc implementacje, uwzględnij w ich nazwach zastosowany język programowania (Python/JavaScript/Złożenie). Jeśli istnieje wiele implementacji w danym języku, warto również określić w etykiecie, co odróżnia je od pozostałych, np. z jakiego algorytmu skorzystano (o ile ma on swoją nazwę). <span id="Test_cases"></span> == Przypadki testowe == Etykiety przypadków testowych powinny wskazywać na to, co on sprawdza. Nie trzeba koniecznie podawać wartości każdego argumentu i oczekiwanego wyjścia, ale należy wskazać choćby dziedzinę, poddaną sprawdzeniu. Na przykład możesz wskazać, że dany przypadek sprawdza zachowanie funkcji tekstowej, gdy dostanie litery z cyrylicy. Albo funkcji matematycznej, kiedy przekaże się jej ułamek czy liczbę zespoloną. Jeśli przypadek testowy dotyczy funkcji tekstowej i umieszczasz wartość argumentu w nazwie przypadku, otocz tę wartość cudzysłowami lub w inny sposób określ, że to jest wartość. Pomaga to szczególnie, gdy ten ciąg zawiera znaczące białe znaki na początku lub na końcu (np. przy testowaniu funkcji ucinającej je). <div lang="en" dir="ltr" class="mw-content-ltr"> == Configuration of functions for given languages == </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Should start with "config for."</span> ** <span lang="en" dir="ltr" class="mw-content-ltr">If the configuration is a display function, it should be "config for displaying", followed by the exact name of the type.</span> ** <span lang="en" dir="ltr" class="mw-content-ltr">If the configuration is a read function, it should be "config for reading", following by the exact name of the type.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> == Types == </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Should be in sentence case (e.g. Rational number)</span> ** <span lang="en" dir="ltr" class="mw-content-ltr">This rule should not be followed if the type name is used outside of Wikifunctions and more often than not is in a snake-case form (e.g. {{Z|Z20838}})</span> <span id="Multi-lingual_labels"></span> == Etykiety wielojęzykowe == {{Phab|T359663}} <div class="mw-translate-fuzzy"> Etykiety w ''wielu językach'' (korzystające z kodu języka <code>mul</code>) mogą być stosowane do określenia etykiety niewykorzystującej słów, np. wyrażenia matematycznego. Zobacz na przykład {{Z|10512}}. W chwili pisania, oprogramowanie nie korzysta jednak z tego typu etykiet w przypadku gdy nie jest dostępna etykieta w Twoim języku. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == language-specific local naming conventions == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Some languages may have their own language-specific naming conventions (these should probably be decided through discussions within the community that speaks the language, though many are likely drafts). </div> * [[Wikifunctions:Naming conventions/日本語]] (Japanese) [[Category:Policy{{#translation:}}]] 0ixczxbh92xzd8dw3x7jdwc1w2zu7mk Wikifunctions:Naming conventions/de 4 14738 331138 325773 2026-10-23T08:27:18Z Ameisenigel 44 Created page with "== Sprachspezifische lokale Namenskonventionen ==" 331138 wikitext text/x-wiki <languages/> {{shortcut|[[WF:NC]]}} {{Draft}} Diese Seite soll einige Konventionen zur Benennung von Objekten in Wikifunctions zusammenfassen. Da das Projekt noch jung ist, sind noch nicht viele Leitlinien definiert. <span id="Capitalization"></span> == Großschreibung == In einigen Sprachen werden Groß- und Kleinbuchstaben verwendet. Bezeichnungen von Objekten sollten in solchen Sprachen so geschrieben werden, als wären sie ein gewöhnlicher Satz. Von der Verwendung der [[:en:Title case|Großschreibung]] wird abgeraten. Gib statt ''Die Entfernung Zwischen Erde Und Sonne An Einem Bestimmten Datum Berechnen'' etwas ein wie ''Entfernung zwischen Erde und Sonne an einem bestimmten Datum berechnen''. Schreibe nur Eigennamen und andere Wörter groß, wenn dies von den Regeln der Sprache, in der du schreibst, verlangt wird. Dies gilt beispielsweise für Nomen im Deutschen und für einige Wortklassen im Englischen, wie Wochentage und Sprachnamen. Schreibe diese Dinge nicht groß, wenn die Regeln deiner Sprache dies nicht verlangen. Bei der Angabe einer Fremdsprache in einer Bezeichnung sind die Großschreibungsregeln der jeweiligen Sprache zu beachten (beispielsweise sollte "Toki Pona" in einer englischen Bezeichnung großgeschrieben werden). Abkürzungen sollten ihre konventionelle Form verwenden; verwende beispielsweise im Englischen "[[:de:RSA-Kryptosystem|RSA]]" und nicht "rsa" für den Namen des Verschlüsselungsalgorithmus. Gemäß der Konvention sollte bei Namen von Objekten, die Datentypen beschreiben, der Anfangsbuchstabe groß geschrieben werden (''z. B.'' [[Z1]] oder [[Z8]]). <span id="Search_characters"></span> == Suchzeichen == Die Suchmaschine verwendet einige Zeichen als Modifikatoren, vermeide diese also am Anfang eines Wortes. Diese Zeichen sind: <code>~ * \? - " !</code>. Beachte, dass "?" allein (und nicht "\?") kein Modifikator ist. Es ist jedoch ein Zeichen im "Graubereich". Andere Zeichen im "Graubereich" sind <code>~ ! @ # $ % ^ & ( ) _ + - = { } | [ ] \ : " ; ' < > ? , . /</code>. Die Suchmaschine behandelt diese (einzeln oder in Kombination) als Teil der Wortgrenze. Dies ist im Allgemeinen kein Problem, aber wenn sie bei der Suche wahrscheinlich eine Rolle spielen, solltest du sie am Anfang oder Ende eines Wortes (oder zwischen Wörtern) vermeiden, sofern sie nicht zwingend erforderlich sind (zum Beispiel [[Z11729]]). Siehe [[:mw:Special:MyLanguage/Help:CirrusSearch|Hilfe:CirrusSearch]] für Details zur Suche nach Text, der eines dieser Zeichen enthält. <span id="Implementation_names"></span> == Namen von Implementierungen == Gib beim Erstellen einer Implementierung bitte die von dir verwendete Sprache im Namen an (Python/JavaScript/Komposition). Wenn es mehr als eine Implementierung in derselben Sprache gibt, wird empfohlen, im Titel einen Hinweis darauf zu geben, wodurch sich diese Implementierung unterscheidet. Gib beispielsweise den Namen des Algorithmus an (sofern vorhanden). <span id="Test_cases"></span> == Testfälle == Bezeichnungen eines Testfalls sollten einen Hinweis darauf geben, was sie dort überprüfen. Sie muss nicht Werte für jede Eingabe und Ausgabe enthalten, sollte aber zumindest eine Domäne angeben, die du überprüfst. Beispielsweise möchtest du sagen, dass dieser Test das Verhalten einer Zeichenketten-Funktion prüft, wenn ihr Buchstaben aus dem kyrillischen Alphabet übergeben werden, oder einer mathematischen Funktion, wenn ein Bruch oder eine komplexe Zahl übergeben wird. Wenn sich der Testfall auf eine Zeichenketten-Funktion bezieht und du einen Zeichenketten-Argument in den Testfallnamen aufnimmst, umgib diesen bitte mit Anführungszeichen oder kennzeichne ihn auf andere Weise, damit klar ist, welches der Wert ist. Dies ist besonders hilfreich, wenn der Wert am Anfang oder Ende relevante Leerzeichen hat (''z. B.'' beim Testen einer Funktion zum Zuschneiden von Text). <span id="Configuration_of_functions_for_given_languages"></span> == Konfiguration von Funktionen für bestimmte Sprachen == * Sollte mit "Konfiguration für" beginnen. ** Wenn die Konfiguration eine Anzeigefunktion ist, sollte es "Konfiguration für die Anzeige", gefolgt vom genauen Namen des Typs, sein. ** Wenn die Konfiguration eine Lesefunktion ist, sollte es "Konfiguration für das Lesen", gefolgt vom genauen Namen des Typs, sein. <span id="Types"></span> == Typen == * Sollte mit einem Großbuchstaben beginnen (z. B. Rationale Zahl). ** Diese Regel sollte nicht befolgt werden, wenn der Typname außerhalb von Wikifunctions verwendet wird und in den meisten Fällen kleingeschrieben wird (z. B. {{Z|Z20838}}). <span id="Multi-lingual_labels"></span> == Mehrsprachige Bezeichnungen == {{Phab|T359663}} Bezeichnungen in ''mehreren Sprachen'' (unter Verwendung des Sprachcodes <code>mul</code> gemäß der [[d:Special:MyLanguage/Help:Default values for labels and aliases|Konventionen von Wikidata]]) können verwendet werden, um die Bezeichnung auf eine Weise anzugeben, die keine Wörter enthält, beispielsweise als mathematischer Ausdruck. Siehe {{Z|10512}} für ein Beispiel. Zum Zeitpunkt des Verfassens dieser Seite verwendet die Software diese Bezeichnungen jedoch nicht als Rückfalloption. <span id="language-specific_local_naming_conventions"></span> == Sprachspezifische lokale Namenskonventionen == <div lang="en" dir="ltr" class="mw-content-ltr"> Some languages may have their own language-specific naming conventions (these should probably be decided through discussions within the community that speaks the language, though many are likely drafts). </div> * [[/日本語]] (Japanese) [[Category:Policy{{#translation:}}]] n3u64ejuxokys1i9ywdiac5c4ntju66 331140 331138 2026-10-23T08:28:48Z Ameisenigel 44 Created page with "Einige Sprachen haben möglicherweise eigene, sprachspezifische Namenskonventionen (diese sollten idealerweise durch Diskussionen innerhalb der jeweiligen Community, die die Sprache spricht, festgelegt werden, wobei viele vermutlich noch Entwürfe sind)." 331140 wikitext text/x-wiki <languages/> {{shortcut|[[WF:NC]]}} {{Draft}} Diese Seite soll einige Konventionen zur Benennung von Objekten in Wikifunctions zusammenfassen. Da das Projekt noch jung ist, sind noch nicht viele Leitlinien definiert. <span id="Capitalization"></span> == Großschreibung == In einigen Sprachen werden Groß- und Kleinbuchstaben verwendet. Bezeichnungen von Objekten sollten in solchen Sprachen so geschrieben werden, als wären sie ein gewöhnlicher Satz. Von der Verwendung der [[:en:Title case|Großschreibung]] wird abgeraten. Gib statt ''Die Entfernung Zwischen Erde Und Sonne An Einem Bestimmten Datum Berechnen'' etwas ein wie ''Entfernung zwischen Erde und Sonne an einem bestimmten Datum berechnen''. Schreibe nur Eigennamen und andere Wörter groß, wenn dies von den Regeln der Sprache, in der du schreibst, verlangt wird. Dies gilt beispielsweise für Nomen im Deutschen und für einige Wortklassen im Englischen, wie Wochentage und Sprachnamen. Schreibe diese Dinge nicht groß, wenn die Regeln deiner Sprache dies nicht verlangen. Bei der Angabe einer Fremdsprache in einer Bezeichnung sind die Großschreibungsregeln der jeweiligen Sprache zu beachten (beispielsweise sollte "Toki Pona" in einer englischen Bezeichnung großgeschrieben werden). Abkürzungen sollten ihre konventionelle Form verwenden; verwende beispielsweise im Englischen "[[:de:RSA-Kryptosystem|RSA]]" und nicht "rsa" für den Namen des Verschlüsselungsalgorithmus. Gemäß der Konvention sollte bei Namen von Objekten, die Datentypen beschreiben, der Anfangsbuchstabe groß geschrieben werden (''z. B.'' [[Z1]] oder [[Z8]]). <span id="Search_characters"></span> == Suchzeichen == Die Suchmaschine verwendet einige Zeichen als Modifikatoren, vermeide diese also am Anfang eines Wortes. Diese Zeichen sind: <code>~ * \? - " !</code>. Beachte, dass "?" allein (und nicht "\?") kein Modifikator ist. Es ist jedoch ein Zeichen im "Graubereich". Andere Zeichen im "Graubereich" sind <code>~ ! @ # $ % ^ & ( ) _ + - = { } | [ ] \ : " ; ' < > ? , . /</code>. Die Suchmaschine behandelt diese (einzeln oder in Kombination) als Teil der Wortgrenze. Dies ist im Allgemeinen kein Problem, aber wenn sie bei der Suche wahrscheinlich eine Rolle spielen, solltest du sie am Anfang oder Ende eines Wortes (oder zwischen Wörtern) vermeiden, sofern sie nicht zwingend erforderlich sind (zum Beispiel [[Z11729]]). Siehe [[:mw:Special:MyLanguage/Help:CirrusSearch|Hilfe:CirrusSearch]] für Details zur Suche nach Text, der eines dieser Zeichen enthält. <span id="Implementation_names"></span> == Namen von Implementierungen == Gib beim Erstellen einer Implementierung bitte die von dir verwendete Sprache im Namen an (Python/JavaScript/Komposition). Wenn es mehr als eine Implementierung in derselben Sprache gibt, wird empfohlen, im Titel einen Hinweis darauf zu geben, wodurch sich diese Implementierung unterscheidet. Gib beispielsweise den Namen des Algorithmus an (sofern vorhanden). <span id="Test_cases"></span> == Testfälle == Bezeichnungen eines Testfalls sollten einen Hinweis darauf geben, was sie dort überprüfen. Sie muss nicht Werte für jede Eingabe und Ausgabe enthalten, sollte aber zumindest eine Domäne angeben, die du überprüfst. Beispielsweise möchtest du sagen, dass dieser Test das Verhalten einer Zeichenketten-Funktion prüft, wenn ihr Buchstaben aus dem kyrillischen Alphabet übergeben werden, oder einer mathematischen Funktion, wenn ein Bruch oder eine komplexe Zahl übergeben wird. Wenn sich der Testfall auf eine Zeichenketten-Funktion bezieht und du einen Zeichenketten-Argument in den Testfallnamen aufnimmst, umgib diesen bitte mit Anführungszeichen oder kennzeichne ihn auf andere Weise, damit klar ist, welches der Wert ist. Dies ist besonders hilfreich, wenn der Wert am Anfang oder Ende relevante Leerzeichen hat (''z. B.'' beim Testen einer Funktion zum Zuschneiden von Text). <span id="Configuration_of_functions_for_given_languages"></span> == Konfiguration von Funktionen für bestimmte Sprachen == * Sollte mit "Konfiguration für" beginnen. ** Wenn die Konfiguration eine Anzeigefunktion ist, sollte es "Konfiguration für die Anzeige", gefolgt vom genauen Namen des Typs, sein. ** Wenn die Konfiguration eine Lesefunktion ist, sollte es "Konfiguration für das Lesen", gefolgt vom genauen Namen des Typs, sein. <span id="Types"></span> == Typen == * Sollte mit einem Großbuchstaben beginnen (z. B. Rationale Zahl). ** Diese Regel sollte nicht befolgt werden, wenn der Typname außerhalb von Wikifunctions verwendet wird und in den meisten Fällen kleingeschrieben wird (z. B. {{Z|Z20838}}). <span id="Multi-lingual_labels"></span> == Mehrsprachige Bezeichnungen == {{Phab|T359663}} Bezeichnungen in ''mehreren Sprachen'' (unter Verwendung des Sprachcodes <code>mul</code> gemäß der [[d:Special:MyLanguage/Help:Default values for labels and aliases|Konventionen von Wikidata]]) können verwendet werden, um die Bezeichnung auf eine Weise anzugeben, die keine Wörter enthält, beispielsweise als mathematischer Ausdruck. Siehe {{Z|10512}} für ein Beispiel. Zum Zeitpunkt des Verfassens dieser Seite verwendet die Software diese Bezeichnungen jedoch nicht als Rückfalloption. <span id="language-specific_local_naming_conventions"></span> == Sprachspezifische lokale Namenskonventionen == Einige Sprachen haben möglicherweise eigene, sprachspezifische Namenskonventionen (diese sollten idealerweise durch Diskussionen innerhalb der jeweiligen Community, die die Sprache spricht, festgelegt werden, wobei viele vermutlich noch Entwürfe sind). * [[/日本語]] (Japanese) [[Category:Policy{{#translation:}}]] igynvnaqm17mc87qbfzyte0w6siz2hq 331142 331140 2026-10-23T08:29:48Z FuzzyBot 207 Updating to match new version of source page 331142 wikitext text/x-wiki <languages/> {{shortcut|[[WF:NC]]}} {{Draft}} Diese Seite soll einige Konventionen zur Benennung von Objekten in Wikifunctions zusammenfassen. Da das Projekt noch jung ist, sind noch nicht viele Leitlinien definiert. <span id="Capitalization"></span> == Großschreibung == In einigen Sprachen werden Groß- und Kleinbuchstaben verwendet. Bezeichnungen von Objekten sollten in solchen Sprachen so geschrieben werden, als wären sie ein gewöhnlicher Satz. Von der Verwendung der [[:en:Title case|Großschreibung]] wird abgeraten. Gib statt ''Die Entfernung Zwischen Erde Und Sonne An Einem Bestimmten Datum Berechnen'' etwas ein wie ''Entfernung zwischen Erde und Sonne an einem bestimmten Datum berechnen''. Schreibe nur Eigennamen und andere Wörter groß, wenn dies von den Regeln der Sprache, in der du schreibst, verlangt wird. Dies gilt beispielsweise für Nomen im Deutschen und für einige Wortklassen im Englischen, wie Wochentage und Sprachnamen. Schreibe diese Dinge nicht groß, wenn die Regeln deiner Sprache dies nicht verlangen. Bei der Angabe einer Fremdsprache in einer Bezeichnung sind die Großschreibungsregeln der jeweiligen Sprache zu beachten (beispielsweise sollte "Toki Pona" in einer englischen Bezeichnung großgeschrieben werden). Abkürzungen sollten ihre konventionelle Form verwenden; verwende beispielsweise im Englischen "[[:de:RSA-Kryptosystem|RSA]]" und nicht "rsa" für den Namen des Verschlüsselungsalgorithmus. Gemäß der Konvention sollte bei Namen von Objekten, die Datentypen beschreiben, der Anfangsbuchstabe groß geschrieben werden (''z. B.'' [[Z1]] oder [[Z8]]). <span id="Search_characters"></span> == Suchzeichen == Die Suchmaschine verwendet einige Zeichen als Modifikatoren, vermeide diese also am Anfang eines Wortes. Diese Zeichen sind: <code>~ * \? - " !</code>. Beachte, dass "?" allein (und nicht "\?") kein Modifikator ist. Es ist jedoch ein Zeichen im "Graubereich". Andere Zeichen im "Graubereich" sind <code>~ ! @ # $ % ^ & ( ) _ + - = { } | [ ] \ : " ; ' < > ? , . /</code>. Die Suchmaschine behandelt diese (einzeln oder in Kombination) als Teil der Wortgrenze. Dies ist im Allgemeinen kein Problem, aber wenn sie bei der Suche wahrscheinlich eine Rolle spielen, solltest du sie am Anfang oder Ende eines Wortes (oder zwischen Wörtern) vermeiden, sofern sie nicht zwingend erforderlich sind (zum Beispiel [[Z11729]]). Siehe [[:mw:Special:MyLanguage/Help:CirrusSearch|Hilfe:CirrusSearch]] für Details zur Suche nach Text, der eines dieser Zeichen enthält. <span id="Implementation_names"></span> == Namen von Implementierungen == Gib beim Erstellen einer Implementierung bitte die von dir verwendete Sprache im Namen an (Python/JavaScript/Komposition). Wenn es mehr als eine Implementierung in derselben Sprache gibt, wird empfohlen, im Titel einen Hinweis darauf zu geben, wodurch sich diese Implementierung unterscheidet. Gib beispielsweise den Namen des Algorithmus an (sofern vorhanden). <span id="Test_cases"></span> == Testfälle == Bezeichnungen eines Testfalls sollten einen Hinweis darauf geben, was sie dort überprüfen. Sie muss nicht Werte für jede Eingabe und Ausgabe enthalten, sollte aber zumindest eine Domäne angeben, die du überprüfst. Beispielsweise möchtest du sagen, dass dieser Test das Verhalten einer Zeichenketten-Funktion prüft, wenn ihr Buchstaben aus dem kyrillischen Alphabet übergeben werden, oder einer mathematischen Funktion, wenn ein Bruch oder eine komplexe Zahl übergeben wird. Wenn sich der Testfall auf eine Zeichenketten-Funktion bezieht und du einen Zeichenketten-Argument in den Testfallnamen aufnimmst, umgib diesen bitte mit Anführungszeichen oder kennzeichne ihn auf andere Weise, damit klar ist, welches der Wert ist. Dies ist besonders hilfreich, wenn der Wert am Anfang oder Ende relevante Leerzeichen hat (''z. B.'' beim Testen einer Funktion zum Zuschneiden von Text). <span id="Configuration_of_functions_for_given_languages"></span> == Konfiguration von Funktionen für bestimmte Sprachen == * Sollte mit "Konfiguration für" beginnen. ** Wenn die Konfiguration eine Anzeigefunktion ist, sollte es "Konfiguration für die Anzeige", gefolgt vom genauen Namen des Typs, sein. ** Wenn die Konfiguration eine Lesefunktion ist, sollte es "Konfiguration für das Lesen", gefolgt vom genauen Namen des Typs, sein. <span id="Types"></span> == Typen == * Sollte mit einem Großbuchstaben beginnen (z. B. Rationale Zahl). ** Diese Regel sollte nicht befolgt werden, wenn der Typname außerhalb von Wikifunctions verwendet wird und in den meisten Fällen kleingeschrieben wird (z. B. {{Z|Z20838}}). <span id="Multi-lingual_labels"></span> == Mehrsprachige Bezeichnungen == {{Phab|T359663}} Bezeichnungen in ''mehreren Sprachen'' (unter Verwendung des Sprachcodes <code>mul</code> gemäß der [[d:Special:MyLanguage/Help:Default values for labels and aliases|Konventionen von Wikidata]]) können verwendet werden, um die Bezeichnung auf eine Weise anzugeben, die keine Wörter enthält, beispielsweise als mathematischer Ausdruck. Siehe {{Z|10512}} für ein Beispiel. Zum Zeitpunkt des Verfassens dieser Seite verwendet die Software diese Bezeichnungen jedoch nicht als Rückfalloption. <span id="language-specific_local_naming_conventions"></span> == Sprachspezifische lokale Namenskonventionen == Einige Sprachen haben möglicherweise eigene, sprachspezifische Namenskonventionen (diese sollten idealerweise durch Diskussionen innerhalb der jeweiligen Community, die die Sprache spricht, festgelegt werden, wobei viele vermutlich noch Entwürfe sind). * [[Wikifunctions:Naming conventions/日本語]] (Japanese) [[Category:Policy{{#translation:}}]] 3abno0qul14zarw4wb8vvto7zxc4kfo Wikifunctions:Naming conventions/gu 4 14981 331145 325775 2026-10-23T08:29:49Z FuzzyBot 207 Updating to match new version of source page 331145 wikitext text/x-wiki <languages/> {{shortcut|[[WF:NC]]}} {{Draft}} <div lang="en" dir="ltr" class="mw-content-ltr"> The page aims to sum up some conventions related to how are objects named at Wikifunctions. Since it's still a young project, there are not many guidelines defined yet. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Capitalization == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Some languages use capital and small letters. Labels of objects should be written in such languages as if they were an ordinary phrase. Use of [[:w:en:Title case|Title case]] is discouraged. For example, instead of ''Calculate A Distance Between Earth And Sun On a Given Date'', type something like ''calculate a distance between Earth and Sun on a given date''. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Capitalize only proper nouns and other words as required by the rules of the language in which you are writing. For example, this applies to nouns in German, and to some classes of words in English, such as days of week and names of languages. Don't capitalize those things if the rules of your language don't require this. When naming a foreign language in a label, use the label language's capitalization conventions (for example, "Toki Pona" should be capitalized in an English label). Abbreviations should use their conventional form; for example, in English, use "[[:en:RSA (cryptosystem)|RSA]]" and not "rsa" for the encryption algorithm name. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> By convention, names of objects that describe data types, should have their first letter capitalized (for example, [[Z1]] or [[Z8]]). </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Search characters == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The search engine uses a few characters as modifiers, so avoid these at the start of a word. These characters are: <code>~ * \? - " !</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Note that “?” on its own (rather than “\?”) is not a modifier. It is, however, a “greyspace” character. Other “greyspace” characters are <code>~ ! @ # $ % ^ & ( ) _ + - = { } | [ ] \ : " ; ' < > ? , . /</code>. The search engine treats these (singly or in combination) as part of the word boundary. This is not generally a problem, but if they are likely to be significant in searches, you should avoid them at the start or end of a word (or between words), unless necessary (for example, [[Z11729]]). See [[:mw:Special:MyLanguage/Help:CirrusSearch|Help:CirrusSearch]] for details of how to search for text containing any of these characters. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Implementation names == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> When creating an Implementation, please mention the language you used in its name (Python/JavaScript/Composition). If there are more than one implementation in the same language, it's recommended to give a little detail in the title of what makes this implementation different. For example, naming the algorithm name (if one exists). </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Test cases == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Labels of a test case should provide some clue about what you are checking there. It doesn't have to include values for every input and output, but should at least specify a domain that you're checking. For instance, you might want to say that this test checks the behavior of a string function when it's given letters from the Cyrillic alphabet, or of a mathematical function when a fraction or complex number is passed. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If the test case is related to a string function, and you include a string argument in the test case name, please surround the argument in quotes or mark it in some other way so it will be clear what the value is. It's especially helpful if the value has significant whitespace at the beginning or end (for example, when testing a text-trimming function). </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Configuration of functions for given languages == </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Should start with "config for."</span> ** <span lang="en" dir="ltr" class="mw-content-ltr">If the configuration is a display function, it should be "config for displaying", followed by the exact name of the type.</span> ** <span lang="en" dir="ltr" class="mw-content-ltr">If the configuration is a read function, it should be "config for reading", following by the exact name of the type.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> == Types == </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Should be in sentence case (e.g. Rational number)</span> ** <span lang="en" dir="ltr" class="mw-content-ltr">This rule should not be followed if the type name is used outside of Wikifunctions and more often than not is in a snake-case form (e.g. {{Z|Z20838}})</span> <div lang="en" dir="ltr" class="mw-content-ltr"> == Multi-lingual labels == </div> {{Phab|T359663}} <div lang="en" dir="ltr" class="mw-content-ltr"> Labels in ''multiple languages'' (using the <code>mul</code> language code, per [[d:Special:MyLanguage/Help:Default values for labels and aliases|Wikidata's convention]]) can be used to specify the label in a way that doesn't involve words, for example as a mathematical expression. See {{Z|10512}} for an example. At the moment of writing, the software doesn't use these labels as a fallback though. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == language-specific local naming conventions == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Some languages may have their own language-specific naming conventions (these should probably be decided through discussions within the community that speaks the language, though many are likely drafts). </div> * [[Wikifunctions:Naming conventions/日本語]] (Japanese) [[Category:Policy{{#translation:}}]] 146sehu3c10qt884romm7s5c3mm7q0o Wikifunctions:What Wikifunctions is not/gu 4 15040 331058 190624 2026-10-23T08:06:05Z FuzzyBot 207 Updating to match new version of source page 331058 wikitext text/x-wiki <languages/> {{shortcut|[[WF:NOT]]}} {{Draft}} <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions is a new kind of website, aiming for a new community. We very much hope to work together with many tools, sites, communities, and kinds of systems that are out there: we want to play together with IDEs, with cloud computing platforms, with app development sites, and many more. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> But we also aim to be a novel thing and we hope to shape a new unique space out for us: a Wikimedia project for everyone to collaboratively create and maintain a library of code functions to support the Wikimedia projects and beyond, for everyone to call and re-use in the world's natural and programming languages. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The scope of the project is within bounds, though. So, let us also explore '''what Wikifunctions is not'''. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not an encyclopædia of algorithms == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> This means that we will '''not''' concentrate on having pages for famous and not-so famous algorithms such as [[w:Euclidean algorithm|Euclid's]], [[w:Newton's method|Newton's]], or [[w:Dijkstra's algorithm|Dijkstra's algorithm]], aiming to represent all existing algorithms faithfully and in their historical context. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Yes, we expect to have a function for the [[w:Greatest common divisor|greatest common divisor]] (GCD) of two integers. And there might be one or more implementations which are based on Euclid's algorithm to calculate the GCD. But Wikifunctions' main goal is not to gather algorithms, and it would not be incomplete if it didn't include some, and used alternatives instead to compute the GCD. If you are looking for that, many Wikipedias are actually [[w:List of algorithms|great resources]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Unlike an encyclopedic overview of existing algorithms, Wikifunctions will also invite original work. We will not be restricted to functions that have been published elsewhere first, and we do not require for every function and implementation to be based on previously published work. Wikifunctions, much like Wikibooks and very unlike Wikipedia, will be open to novel contributions. The main criteria for implementations will be: under which conditions can we run a given implementation, and what resources is it expected to take? </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not an app development site == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We do not expect to make it possible to create full-fledged, stand-alone apps within Wikifunctions — there will be no place to store state, we don't aim to allow calling external APIs or directly cause changes to other sites, and we don't aim to package up apps with icons and UX, etc. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We absolutely expect Wikifunctions to be a very useful resource for app developers, and can very much imagine apps that are basically wrappers around one or more functions from Wikifunctions, but these would still need code and other assets which wouldn't be part of Wikifunctions. We are not competing in the area of no-code or low-code development sites. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a code hosting service == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions will host code — but not for whole projects, merely for individual functions. There won't be libraries, apps, or services developed on Wikifunctions with bug-trackers, forums, etc. There won't be a Web-based version control system such as ''Mercurial'' or ''Git'' running against Wikifunctions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Again, we hope that there will be libraries, apps, and services that will rely on functions available in Wikifunctions, but they would be developed on a different site, such as ''Gerrit'', ''GitHub'', or ''GitLab''. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a programming language, nor is trying to evangelise a particular language == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions will allow for functions to be implemented in a multitude of programming languages. The possibility to compose functions together to create higher level functions may look a little bit like a new programming language, but it will be extremely limited compared to most other programming languages, since we only allow for nested function calls and that's it. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not an Integrated Development Environment (IDE) == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We won't provide you with an interface for creating and developing software projects, interfacing with build, testing, and source control systems. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a question-and-answer website == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We are not competing with ''Stack Overflow'' and similar websites, where a developer would ask how to achieve a certain task and have community members discuss and answer the question. We won't contain code snippets to help answer the question, but we will organize code within our website to enable the evaluation of functions within a library of functions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a cloud computing platform == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We do not provide computing resources and access to services and APIs so that you can run your computational needs on our platform, either for money or for free. Use of Wikifunctions's evaluation platform is to improve access to knowledge for everyone. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a code snippet website == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We are not competing with code snippet sites such as GitHub Gists, [[w:Rosetta_Code|Rosetta Code]], [https://esolangs.org/ esolangs.org], or [http://helloworldcollection.de/ helloworldcollection.de]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions differs in that it allows running code and composing existing functions together to create new ones. As well, Wikifunctions is for useful and meaningful code, not temporary, arbitrary snippets that other platforms may accept. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a code education platform == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We are not focused on teaching people how to code, the material in Wikifunctions will not be laid out in a pedagogical order, and we also won't make sure to comprehensively cover all topics important for coding. In fact, we aim for Wikifunctions to be usable for people who don't know how to code and who don't need to learn how to code to use most of Wikifunctions effectively. Though the Wikifunctions community may well help each other in sharing best practices, style guides, and tips on how to use the site in different languages, these will be aimed at the purpose of serving the world's knowledge. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not (only) the boiler room for Abstract Wikipedia == </div> [[File:Mechanical_room_in_basement._Wayne_N._Aspinall_Federal_Building_and_U.S._Courthouse,_Grand_Junction,_Colorado_LCCN2014650034.tif|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">A '[[d:Q6804549|boiler room]]', where unsightly-but-vital machinery is hidden</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> Natural language generation (NLG) is the focus of {{SITENAME}} as of 2026, and the site began as part of the wider [[meta:Special:MyLanguage/Abstract_Wikipedia|Abstract Wikipedia project]], but NLG is far from the only field in which functions are being developed. That is to say, WF is necessary for AW, but AW is not necessary for WF. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> On top of the computer science staples of Boolean logic, arithmetic, and list manipulation, we have useful functions relating to disciplines such as [[Z16718|chemistry]], [[Z35550|dimensional analysis]], [[Z20074|electrical engineering]], [[Z22162|genomics]], [[Z10393|information theory]], [[Z26830|meteorology]], [[Z13955|number theory]], [[Z27919|physiology]], [[Z20094|probability]], [[Z24497|quantum mechanics]], [[Z14226|railroad engineering]], [[Z28600|timekeeping/chronometry]], and [[Z26841|trigonometry]]. </div> [[Category:Project concept{{#translation:}}]] 2smnim7o7mo0nxlwhsyst4ch1dm8174 Wikifunctions:How to create implementations/fr 4 15833 331114 294127 2026-10-23T08:23:21Z FuzzyBot 207 Updating to match new version of source page 331114 wikitext text/x-wiki <languages/> Cette page fournit un guide plus détaillé pour '''créer des implémentations''', au delà de l’explication générale de {{ll|Wikifunctions:Introduction}}. <span id="Types_of_Implementations"></span> == Types d'implémentations == Dans Wikifunctions, une '''implémentation''' peut prendre la forme d'un '''code''' ou d'une '''composition'''. Une implémentation sous forme de code exprime directement la logique de la fonction dans tout langage de programmation disponible (actuellement, Python3 ou JavaScript). Cela sert principalement quand le comportement de la fonction ne peut pas se construire facilement à partir des Wikifunctions existantes, ou quand un contrôle précis du traitement des données est nécessaire. Une implémentation sous forme de composition, en revanche, définit la fonction entièrement par une combinaison d'autres fonctions existantes, sans écrire de code. Les compositions sont plus faciles à comprendre, à réutiliser et à traduire automatiquement dans d'autres langues, mais elles dépendent des blocs de construction appropriés déjà disponibles et sont souvent moins performantes. En général, commencez par vérifier si votre objectif peut être atteint avec des compositions; si ce n'est pas le cas, ou si la performance ou la logique du détail sont importantes, choisissez plutôt une mise en œuvre sous forme de code. Un troisième type d'implémentation existe : '''built-ins'''. Il est exécuté par le code interne du système et n'est pas modifiable. En général chaque fonction prédéfinie aura déjà une implémentation interne. Si c'est le cas, vous verrez un message disant ''"{{int|wikilambda-implementation-selector-none}}"'' lorsque vous afficherez la page d'implémentation. <span id="Practice_Test-Driven_Development"></span> == Développement pratique dirigé par les tests == Le '''TDD''' (''Test-Driven Development'') est un principe où l'on décrit le logiciel en partant de l'écriture des tests avant celle du code actuel. Les tests sont juste une manière de comprendre ce que votre fonction doit réaliser en fournissant des exemples et la façon dont ils doivent fonctionner. Dans Wikifunctions, l'écriture des tests offre d'abord des bénéfices significatifs. Si vous travaillez sur une implémentation, vous pouvez exécuter votre code avec les tests existants pour vérifier qu'il se comporte comme attendu. Cela facilite la détection des erreurs très tôt, bien avant même que de publier votre implémentation. Les tests sont aussi un moyen puissant de décrire la fonction dont vous avez besoin. En décrivant ces tests, '''vous indiquez clairement le comportement attendu''', et la communauté peut poursuivre en aidant à l'implémentation ou à la création d'implementations alternatives. Imaginez que vous voulez mettre en œuvre une fonction qui combine deux chaînes avec un espace entre elles. Un test de base pour cela pourrait être : <syntaxhighlight lang="prolog"> join_with_space( "Hello", "world" ) => "Hello world" </syntaxhighlight> Une fois le comportement de base défini, il est important de '''penser aux cas aux limites'''—ce sont des situations où les entrées nécessitent un comportement particulier. Par exemple, que faire si votre première chaîne se termine par un espace, ou que votre deuxième chaîne commence avec un espace ? La fonction doit-elle conserver tous les espaces existants et en ajouter un autre ? ou doit-elle renvoyer un résultat espacé effectivement avec un seul espace entre les mots ? Selon vos besoins, vous devez écrire un test pour ce type de situation. Par exemple, un test pour ce cas aux limites pourrait être l'un des deux suivants — mais pas les deux simultanément ! : <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> ou ... <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> Assurez-vous que tous les cas spéciaux possibles sont couverts par vos tests et dès que vous les avez rassemblés, vérifiez qu'ils sont tous conectés à la Fonction en les sélectionnant et en cliquant sur ''Connect''. <span id="Code_implementations"></span> == Implémentations du code == [[File:Code implementation.png|thumb|alt=Editeur de code de Wikifunctions initialisé avec un modèle de fonction|Lors de l'ajout d'une nouvelle implémentation de code, le modèle de fonction est initialisé avec le nom de la fonction et les noms des arguments]] Lorsque vous créez une implementation en code, l'interface utilisateur de Wikifunctions vous configure l'éditeur de code qui correspond au langage actif pour la mise en valeur de la syntaxe et la validation. Lorsque la fonction à implémenter et le langage de programmation sont sélectionnés, cet éditeur est configuré avec le modèle correct de fonction : '''ne supprimez pas, ni ne modifiez pas cela''' ! Conservez votre code à l'intérieur de la signature de cette fonction : si vous avez besoin de fonctions annexes, il suffit de les déclarer simplement à l'intérieur de la déclaration de la fonction de niveau principal. <span id="Using_input_types_in_your_code"></span> === Utiliser des types d'entrées dans votre code === Les types Wikifunctions {{Z|Z6}} et {{Z|Z40}} peuvent être utilisés comme s'ils étaient des types natifs en JavaScript et en Python3. Par exemple, une entrée chaîne de caractères peut être concatenée ou un booléan peut être directement utilisé dans une expression logique. Pour utiliser d'autres types dans vos implémentations de code, vous devrez regarder le type plus précisément, déterminer s'il a une conversion en un équivalent natif, et le traiter en conséquence. Supposons par exemple que l'on veuille écrire du code Python qui traite une entrée de type {{Z|Z20420}}. Sur la page de ce type, nous cherchons les ''convertisseurs de type en code'' et en choisissons un pour Python. Le convertisseur {{Z|Z20424}} est appliqué à notre entrée date avant le code, donc en cherchant le ''type natif'' nous voyons que notre entrée est un ''dict'' Python et l'implémentation nous donne les clés attendues : <syntaxhighlight lang="python3"> return { 'K1': year, 'K2': month, 'K3': day } </syntaxhighlight> Quand un type n'a pas de convertisseur, vous devez accéder à ses composants directement à l'aide de ses clés. Par exemple, supposons que votre fonction <code>Z30000</code> a une entrée <code>Z30000K1</code> de type {{Z|Z11}}. Ce type a deux clés : <code>Z11K1</code> pour le langage (lui-même un objet de type {{Z|Z60}}), et <code>Z11K2</code> pour la valeur de la chaîne. De même, l'objet language a une clé <code>Z60K1</code> pour le code de langue. Donc, pour obtenir une chaîne avec le code de la langue et le texte, vous pouvez écrire : <syntaxhighlight lang="javascript"> function Z30000( Z30000K1 ) { // par exemple "fr: placez votre texte en français ici" return Z30000K1.Z11K1.Z60K1 + ": " + Z30000K1.Z11K2; } </syntaxhighlight> Pour une référence rapide des conversions de type, voir la [[Special:MyLanguage/Wikifunctions:Execution targets#Default type conversion|table de conversion du type par défaut]]. <span id="Returning_the_right_outputs"></span> === Renvoyer les bonnes sorties === De la même façon que vous traitez les entrées, les sorties doivent correspondre au type spécifié dans la définition de la fonction. Certains peuvent être traités comme des types natifs, de sorte que toute sortie de chaîne sera convertie en un objet Wikifunctions {{Z|Z6}} et tout booléen natif renvoyé par votre implémentation sera converti en un objet wikifunctions {{Z|Z40}} . Ces types qui disposent de ''convertisseurs de type à partir du code'' appliquent la fonction appropriée à la sortie, afin de construire le type requis. Suivant l'exemple de {{Z|Z20420}}, le {{Z|Z20443}} transformera la sortie de implémentation – dicté par les clés K1, K2 et K3 – en sa représentation ZObject correcte. Pour les types qui n'ont pas de convertisseur de code, vous pouvez construire soigneusement et renvoyer les objets en sortie. Par exemple, si notre fonction <code>Z30000</code> prend deux entrées de chaîne : le code de langue et un texte, et doit renvoyer un objet {{Z|Z11}}. Vous pouvez faire cela en Python en utilisant le constructeur <code>ZObject</code> : <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): lang_object = ZObject( {"Z1K1": "Z9", "Z9K1": "Z60"}, Z60K1 = Z30000K1 ) return ZObject( {"Z1K1": "Z9", "Z9K1": "Z11"}, Z11K1 = lang_object, Z11K2 = Z30000K2 ) </syntaxhighlight> Ou en JavaScript : <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { const langObject = new ZObject( new Map( [ [ "Z60K1", Z30000K1 ] ] ), { "Z1K1": "Z9", "Z9K1": "Z60" } ); const monolingualKeys = new Map( [ [ "Z11K1", langObject ], [ "Z11K2", Z30000K2 ] ] ); return new ZObject( monolingualKeys, { "Z1K1": "Z9", "Z9K1": "Z11" } ); } </syntaxhighlight> Vous trouverez des informations complémentaires sur la classe <code>ZObject</code> et d'autres constructeurs utiles dans {{ll|Wikifunctions:Execution_targets#Custom_and_non-built-in_type_conversion}}. {{phab|T392750}}Depuis mai 2026, la tentative de renvoyer une liste de listes peut échouer, vous ne pouvez donc pas implémenter de telles fonctions dans le code. <span id="Code_in_Python"></span> === Code Python === Dans cette section nous donnons ci-dessous un exemple concret de la façon de créer une implémentation sous la forme de code Python. Supposons que nous voulons créer une implémentation pour une fonction qui combine deux chaînes d'entrée en mettant un espace entre-elles et qui renvoie le résultat. Supposons que le ZID de cette fonction est Z30000. L’implémentation est définie en utilisant le ZID de la fonction. Il en va de même pour les arguments de la fonction. Donc, dans le cas de la fonction Z300000 avec ses deux arguments, le modèle de la fonction devrait ressembler à : <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): </syntaxhighlight> Comme nous l'avons décrit précédemment, nous savons que les arguments (<code>Z30000K1</code> et <code>Z30000K2</code>) sont des chaînes, donc nous pouvons les traiter aussi simplement que nous utilisons les chaînées natives en Python. De plus, la fonction doit renvoyer une chaîne. Pour notre exemple, nous renvoyons simplement les deux arguments concatenés avec un espace entre eux deux : <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): return Z30000K1 + " " + Z30000K2 </syntaxhighlight> Comme il s’agit de Python, n’oubliez pas d’indenter cette ligne. Si vous avez suivi notre conseil pour [[#Practice Test-Driven Development|pratiquer le TDD]] vous disposez déjà d'un ensemble de tests dont vous savez qu'ils fonctionnent. Si c'est la cas, tout en construisant votre immplémentation vous pouvez cliquer sur la flèche circulaire du panneau Tests pour voir si votre implémentation les vérifie tous. Rappelez-vous que le temps d’exécution n'a pas d'état. Ne supposez pas que les valeurs sont des variables globales ou statiques. Si vous avez d’autres questions sur ce que vous pouvez et ne pouvez pas faire en Python, demandez à [[Wikifunctions:Python implementations]]. <span id="Code_in_JavaScript"></span> === Code JavaScript === Nous donnons ci-dessous un exemple concret de la façon de créer une implémentation sous la forme de code JavaScript. Supposons que nous voulons créer une implémentation pour une fonction qui combine deux chaînes d'entrée en mettant un espace entre-elles et qui renvoie le résultat. Supposons que le ZID de cette fonction est <code>Z30000</code>. L’implémentation est définie en utilisant le ZID de la fonction. Il en va de même pour les arguments de la fonction. Donc, dans le cas de la fonction <code>Z30000</code> avec ses deux arguments, le modèle de la fonction devrait ressembler à : <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { } </syntaxhighlight> Nous savons que les arguments (<code>Z30000K1</code> et <code>Z30000K2</code>) sont des chaînes, donc nous pouvons les traiter comme des chaînées natives en JavaScript. De plus, la fonction doit renvoyer une chaîne. Pour compléter notre fonction, vous pouvez ensuite ajouter une ligne qui concatène les chaînes d'entrée, comme ceci : <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> Si vous avez des tests comme cela a été recommandé dans la section [[#Practice Test-Driven Development|TDD]] ci-dessus, cliquez sur la flèche circulaire du panneau Tests pour voir si votre implémentation les vérifie tous. Rappelez-vous que le runtime n'a pas d'état. Ne présumez pas des valeurs des variables globales ou statiques. Si vous avez d'autres questions sur ce que vous pouvez ou ne pouvez pas faire en JavaScript, posez-les sur [[Wikifunctions:JavaScript implementations]]. <div lang="en" dir="ltr" class="mw-content-ltr"> === Calling another Wikifunctions function === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> A code implementation can call certain other Wikifunctions functions, receive the output of the call, and use that output in further processing. We refer to such calls as callbacks. At present, due to security and performance concerns, only the following built-in Wikidata fetch and search functions can be called in this way: {{Z|Z6820}}, {{Z|Z6821}}, {{Z|Z6822}}, {{Z|Z6824}}, {{Z|Z6825}}, {{Z|Z6826}}, {{Z|Z6830}}, and {{Z|Z6831}}. This capability is in an initial stage of deployment; we hope to allow calls to a broader range of functions in the future. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Let’s look at a JavaScript implementation containing a callback. This implementation fetches an item from Wikidata, extracts the label of that item in a given language, and returns the label string. The item to fetch is given by argument <code>Z400K1</code>, and the language is given by <code>Z400K2</code>. </div> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const item = Wikifunctions.Call('Z6821', Z400K1); for (const label of item.Z6001K2.Z12K1) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> A callback is made by calling <code>Wikifunctions.Call</code>, as shown in the example. The first argument to <code>Wikifunctions.Call</code> is always the ZID of the function to be called – in this case, {{Z|Z6821}}, which takes a single argument. Following that, the arguments to be passed to that function are listed, separated by commas. Here, that argument, <code>Z400K1</code>, is the same value that was passed to the function <code>Z400</code>. This is a common pattern of argument passing to callbacks, but their arguments can also be built using the <code>ZObject</code> constructor (as explained above), or obtained in other ways. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The value of <code>Z400K1</code> would be an instance of {{Z|Z6091}}, containing the QID of the item to be fetched. Line 2 of the example calls <code>Z6821</code> to fetch that item from Wikidata and assigns the resulting ZObject to the const <code>item</code>. The remaining code iterates over the item’s labels until it finds the one matching the language given by <code>Z400K2</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For the first example above, we have used <code>Z6821</code> for simplicity. However - unless an entire entity is needed by the implementation, it is strongly recommended to use <code>Z6820</code> to retrieve Wikidata items, which can be quite large. Although a call to <code>Z6820</code> is a bit more complex, its parameters allow for fetching selected portions of a Wikidata item, which can greatly improve performance and avoid some errors, by reducing the network bandwidth and processing time that are needed. (<code>Z6820</code> can also be used in place of <code>Z6822</code>, <code>Z6824</code>, <code>Z6825</code>, and <code>Z6826</code>, to get similar bandwidth-reduction benefits.) </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Just below we show how <code>Z6820</code> can be used, in <code>Wikifunctions.Call</code>, to implement the same behavior as above. Note that we use the second argument passed to <code>Z6820</code>, <code>[labelsPart]</code>, to say “Just return the item’s labels”, and we use the third argument, <code>[Z400K2]</code>, to say “Just return labels in the given language”. (This argument would also apply to aliases and descriptions, if they were included in the result.) </div> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const labelsPart = new ZObject( new Map( [ ['Z6030K1', new ZReference('Z6033')] ] ), {Z1K1: 'Z9', Z9K1: 'Z6030'} ); const entities = Wikifunctions.Call( 'Z6820', [Z400K1], [labelsPart], [Z400K2], []); const item = entities.get(Z400K1.Z6091K1); const labels = item.Z6001K2.Z12K1; for (const label of labels) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Other things to note: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Even though code implementations are now able to fetch Wikidata entities, it is recommended that they not be written to return ''entire'' entities. This is because of current limitations on the size of the value returned from a code implementation. To fetch and return an entire large entity, it’s better to call the fetch function from a composition.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Only one callback can execute at a time. For security reasons, it is not possible to use the concurrency features of JavaScript or Python to execute multiple callbacks in parallel.</span> ** <span lang="en" dir="ltr" class="mw-content-ltr">Keep in mind, however, that you can fetch multiple entities at once using Z6820.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">There is currently a 3 MiB limit on the size of Wikidata content that can be returned to a code implementation, by a single callback. The same limit applies to the size of the result returned from a code implementation.</span> <span id="Compositions"></span> == Composition == Nous donnons ci-dessous un exemple concret de la façon de créer une implémentation sous la forme de composition. Supposons que nous voulons créer une implémentation pour une fonction qui combine deux chaînes d'entrée en mettant un espace entre-elles et qui renvoie le résultat. Supposons que le ZID de cette fonction est <code>Z30000</code>. Il est généralement bon de réfléchir d'abord à la façon de combiner les fonctions existantes afin de créer la sortie souhaitée. Parfois, cela peut être trivial, et vous pouvez simplement continuer en utilisant les fonctions de composition, mais dans de nombreux cas, cela vaut la peine de détailler la composition souhaitée. Par exemple, pour la fonction donnée, nous pourrions utiliser la fonction existante {{Z|Z10000}}. Cette fonction prend deux chaînes de caractères et en fait une chaîne résultat. Mais nous devons ajouter un espace entre les deux. Donc nous concaténons d'abord un espace à la fin de la première chaîne, puis concatenons la deuxième chaîne au résultat de la première concatenation. Notre composition pourrait donc se noter ainsi : <syntaxhighlight lang="prolog"> join_strings( join_strings( Z30000K1, " " ), Z30000K2 ) </syntaxhighlight> Il existe différentes façons d'écrire une composition; notez que la même chose peut être réalisée avec : <syntaxhighlight lang="prolog"> join_strings( Z30000K1, join_strings( " ", Z30000K2 ) ) </syntaxhighlight> Une implémentation alternative pourrait également utiliser la fonction existante {{Z|Z15175}}, de sorte que votre composition pourrait être : <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> Comme vous pouvez le voir, il y a plusieurs façons d'y parvenir, alors prenez votre temps et explorez les fonctions existantes disponibles dans le {{ll|Wikifunctions:Catalogue}}. Essayons de créer le second exemple, <code>join_strings(Z30000K1, join_strings(" ", Z30000K2))</code>. Pour créer ceci : # Commencez par ajouter une implémentation en cliquant sur le bouton <code>+</code> dans la table ''Implémentations'' de votre page ''Fonction''. # Vérifier que l'option ''composition'' sous ''Implémentation'' est sélectionnée. # Cliquez sur l'icône <code>›</code> ou cliquez sur le lien ''Sélectionner une fonction'' pour développer les détails de la fonction. # Sous "fonction" chercher le nom de la fonction la plus extérieure que vous voulez utiliser, qui dans cet exemple est ''joindre deux chaînes''. Ensuite, sélectionner la fonction souhaitée dans la liste déroulante. # Vous verrez deux nouveaux champs, un pour chacun des arguments nécessaires à la fonction sélectionnée. # Pour le premier argument, nous voulons sélectionner la première entrée de notre fonction : ## À côté de ''première chaîne'', cliquer sur le bouton <code>...</code> et sélectionnez ''Référence d'argument''. ## Sous ''key id'' vous pouvez maintenant sélectionner la première chaîne de votre fonction dans la liste déroulante, qui contient toutes les entrées possibles. # Pour le deuxième argument, nous voulons utiliser le résultat d'un autre appel à ''joindre deux chaînes'' : ## À côté de ''seconde chaîne'', cliquer sur le bouton <code>...</code> et sélectionner ''Appel de fonction''. ## Sous ''fonction'', chercher et sélectionner la fonction que vous voulez appeler, et qui est encore ''joindre deux chaînes''. ## Pour cet appel de fonction interne, configurer la ''première chaîne'' en tapant simplement un espace blanc dans le champ de texte, et configurer la ''seconde chaîne'' comme vous l'avez fait pour l'étape 6 : changez-le en mettant le bouton <code>...</code> à ''Référence d'argument'', puis sélectionner le deuxième argument dans la zone déroulante. Votre composition est maintenant terminée ! Vous pouvez développer ou replier les détails en utilisant les boutons avec des chevrons pour voir à quoi cela ressemble. Si vous disposez déjà des tests comme il vous l'a été indiqué dans la section [[#Practice Test-Driven Development|TDD]] ci-dessus, cliquer sur la flèche circulaire du panneau Tests et vérifier si votre implementation passe les tests. Dès que votre composition réussit les tests, avancez et publiez-la. [[File:Composition implementation expanded.png|frame|center|alt=Implémentation d'une composition Wikifunctions dans sa vue étendue|Implémentation d'une composition Wikifunctions dans sa vue étendue]] [[File:Composition implementation collapsed.png|frame|center|alt=Implémentation d'une composition Wikifunctions dans sa vue repliée|Implémentation d'une composition Wikifunctions dans sa vue repliée]] <span id="Wikifunctions_error_handling"></span> == Gestion des erreurs Wikifunctions == En tant que créateur de fonctions Wikifunctions, vous voudrez peut-être avertir l'utilisateur qui appelle votre fonction lorsque quelque chose ne va pas dans le code, ou lorsque les entrées ne correspondent pas à un certain critère. Par exemple, si votre fonction s'attend à ce qu'une chaîne de saisie contienne un nom, vous voudrez peut-être vérifier que le nom n'est pas vide et, si c'est le cas, afficher un message d'erreur compréhensible par la personne qui utilise votre fonction. Pour cela, vous pouvez utiliser <code>Wikifunctions.Error()</code> de vos implémentations de code ou la fonction {{Z|Z851}} de vos compositions. Dans cette section nous aprrendrons : * Comment générer des erreurs provenant à la fois par les implémentations du code et par les compositions, * comment écrire les tests pour les cas d'erreur, et * comment récupérer et gérer les erreurs causées par les fonctions que vous utilisez dans vos compositions. <span id="Throwing_errors_from_code_implementations"></span> === Générer des erreurs à partir de l'implémentation du code === Lorsque vous écrivez du code, à la fois à partir de JavaScript ou de Python, vous pouvez utiliser <code>Wikifunctions.Error()</code> pour terminer l'exécution avec une erreur souhaitée. <code>Wikifunctions.Error()</code> a deux paramètres : # Type d'erreur : une chaîne contenant le ZID du type d'erreur à renvoyer. # Arguments d'erreur : liste d'arguments de chaîne pour construire l'erreur. Procédons par étape : <span id="Error_type"></span> ==== Type d'erreur ==== Un type d'erreur est un objet qui décrit une sorte d'erreur pouvant se produire dans le système. Il existe un certain nombre de types d'erreur intégrés mais vous pouvez aussi construire d'autres types d'erreur plus adaptés à votre cas d'utilisation. Si vous utilisez les erreurs, le mieux est de parcourir les types d'erreur disponibles que vous pouvez retrouver dans [[Special:ListObjectsByType/Z50|cette liste]]. S'il n'y a pas d'erreurs qui puissent correspondre à votre cas, créez-en une nouvelle en allant sur la page de création et en sélectionnant ''type d'erreur'' dans le sélecteur de type. Ensuite, définissez les champs nécessaires : [[File:Error type.png|thumb|alt=Création de type d'erreur dans Wikifunctions|Pour créer un nouveau type d'erreur (Z50), modifier l'étiquette et ajoutez les clés nécessaires.]] * '''Label''' – c'est le titre principal de l'erreur qui doit contenir un message bref mais suffisamment descriptif. Initialiser le libellé d'erreur dans la boîte ''About'', à droite. * '''Keys''' – les clés contiennent des informations supplémentaires à propos de ce qui a causé l'erreur. Par exemple, si une entrée a un mauvais format, vous pouvez informer l'utilisateur en donnant son contenu au moment de l'erreur. Pour pouvoir utiliser les clés dans vos implémentations, elles doivent être des chaînes. Pour créer une clé, cliquer sur l'icône <code>[+]</code> sous ''keys'', sélectionner ''String'' sous ''value type'' et ajouter un libellé suffisamment descriptif, par exemple ''entrée actuelle''. Une fois toutes les clés nécessaires en votre possession, vous pouvez publier votre type d'erreur et conserver l'ID du nouvel objet créé. * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error message''' – Error types can contain a multilingual array of HTML parametrized error messages. The parameter notation is $1, $2, etc., where the digit corresponds to the error type key. For example, when creating an error type with one string key "current input", the error message can use the positional parameter "$1", which will be replaced with the value of the "current input" key at the time of rendering the error. To add HTML messages, click on the "[+]" icon below "html fragments", select a language and input the HTML string.</span> <span id="Error_arguments"></span> ==== Arguments des erreurs ==== Les arguments des erreurs correspondent aux clés du type d'erreur et doivent fournir des informations supplémentaires pour comprendre l'erreur. Les arguments d'erreur doivent toujours être des ''String''. <span id="Using_Wikifunctions.Error()"></span> ==== Utiliser Wikifunctions.Error() ==== Supposons que vous voulez qu'une erreur soit signalée soit quand votre première, ou votre deuxième entrée est vide. Vous avez déjà créé le type d'erreur, et le ZID qui a été attribué était <code>Z30005</code>. Votre type d'erreur a deux clés textuelles : * Input key : contient la clé de l'entrée erronnée * Input value : contient la valeur actuelle de l'entrée erronnée Pour générer une erreur dans votre implémentation JavaScript, essayez ceci : <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { // si la première entrée est vide, générer une erreur Z30005 // avec deux arguments de chaîne : [ première clé d'entrée, première valeur d'entrée ] Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { // si la seconde entrée est vide, générer une erreur Z30005 // avec deux arguments chaîne : [ seconde clé d'entrée, seconde valeur d'entrée ] Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> Pour créer une erreur dans votre implémentation Python, essayez ceci : <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": # si l'entrée est vide, générer une erreur Z30005 # avec deux arguments chaîne : [ première clé d'entrée, première valeur d'entrée ] Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": # si la deuxième entrée est vide, générer l'erreur Z30005 # avec deux arguments chaîne : [ première clé d'entrée, première valeur d'entrée ] Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> Rappelez-vous que l'appel à <code>Wikifunctions.Error()</code> met fin à l'exécution ! <span id="Throwing_errors_from_compositions"></span> === Générer des erreurs à partir des compositions === Si vous créez l'implémentation d'une composition, vous pouvez générer une erreur en appelant la fonction spéciale {{Z|Z851}}. <span id="Throw_Error_function_(Z851)"></span> ==== Fonction ''Throw Error'' (Z851) ==== La fonction {{Z|Z851}} est similaire à la méthode <code>Wikifunctions.Error()</code> et prend deux arguments : * '''Error type''' – référence du type d'erreur que vous voulez signaler * '''Error parameters''' – liste d'arguments pour créer votre erreur (doivent aussi être des ''String'') . <span id="Using_Throw_Error"></span> ==== Utiliser ''Throw Error'' ==== Supposons que vous souhaitez modifier votre composition pour qu'elle vérifie d'abord que les arguments ne sont pas vides, et qu'elle génère une erreur si un argument est vide. Si aucun d'entre-eux est vide, la composition originale est exécutée, soit : <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> Pour cela, vous devez créer des pattes conditionnelles à l'aide la fonction {{Z|Z802}}. Elle doit être comprise ainsi : * Si le premier argument est vide, générer une erreur pour le premier argument * Sinon procéder au contrôle du second argument * Si le deuxième argument est vide, générer une erreur pour ce deuxième argument * Sinon, procéder avec la patte de succès et renvoyer les chaînes jointes avec le séparateur espace Ou sous forme de pseudo code fonctionnel : <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), throw_error( Z30005, [ "Z30000K1", Z30000K1 ] ), if( is_empty_string( Z30000K2 ), throw_error( Z30005, [ "Z30000K2", Z30000K2 ] ), join_with_separator( Z30000K1, Z30000K2, " " ) ) ) </syntaxhighlight> Créons cela progressivement : # Commencez par ajouter une implémentation en cliquant sur le bouton <code>+</code> dans la table ''Implémentations'' de votre page ''Fonction''. # Vérifier que l'option ''composition'' sous ''Implémentation'' est sélectionnée. # Cliquez sur l'icône <code>›</code> ou cliquez sur le lien ''Sélectionner une fonction'' pour développer les détails de la fonction. # Sous "fonction" chercher et sélectionner la fonction la plus extérieure que vous souhaitez utiliser, qui dans ce cas est ''if''. # Vérifier la validité du premier argument : ## À côté de ''condition'', cliquer sur le bouton <code>...</code> et sélectionner ''Appel de fonction''. ## Sous ''fonction'', chercher et sélectionner la fonction ''is empty string'' ## À côté de ''entrée'', cliquer sur le bouton <code>...</code> et sélectionnez ''Référence d'argument''. ## Sous ''key id'', sélectionner la première entrée (par exemple ''first string'') ## Vous pouvez désormais refermer l'appel de la fonction ''condition'' si vous le souhaitez, en cliquant sur le chevron vers le bas à côté de ''condition''. Vous devriez voir quelque chose comme ''f(x) est une chaîne vide (→ première chaîne)'' # Générer une erreur si la condition est vraie : ## À côté de ''then'', cliquer sur le bouton <code>...</code> et sélectionner ''Appel de fonction''. ## Sous ''fonction'', chercher et sélectionner la fonction ''Throw Error'' ## Sous ''error type'', chercher et sélectionner votre type d'erreur (vous pouvez entrer directement l'ID de l'erreur si vous le connaissez, par exemple Z30005) ## Sous ''paramètres d'erreur'', ajouter deux éléments en cliquant sur le bouton <code>+</code> ## Pour ''Item 1'' (cassant la clé de l'argument), définir son type à ''String'' et écrire l'identificateur d'arguments (par exemple ''first input'' ou ''Z30000K1'') ## Pour ''Item 2'' (valeur d'argument offensant), cliquer sur <code>…</code> à côté de ''Item 2'' et sélectionner ''argument reference'' ## Sous ''key id'', sélectionner la première entrée (par exemple ''first string'') ## Vous pouvez maintenant refermer l'appel de la fonction ''then'' si vous le souhaitez, en cliquant sur le chevron vers le bas à côté de ''then''. Vous devriez voir quelque chose comme ''f(x) Throw Error( l'entrée avait le format incorrect, liste typée (Objet, "première entrée", → première chaîne) )'' # Continuer le contrôle du second argument si le premier est correct : ## À côté de ''else'', cliquer sur le bouton <code>...</code> et sélectionner ''Appel de fonction'' ## Sous ''fonction'', chercher et sélectionner la fonction ''if'' ## Configurer ''condition'' pour vérifier la validité du deuxième argument en suivant le même processus que celui décrit à l'étape 5. ## Configurez "then" pour générer une erreur pour le deuxième argument en suivant le même processus que celui décrit à l'étape 6. # Enfin définir la patte de succès : ## À côté du ''else'' imbriqué, cliquer sur le bouton <code>...</code> et sélectionner ''Appel de fonction'' ## Sous ''fonction'', chercher et sélectionner la fonction réussie, qui dans ce cas peut être ''joindre des chaînes avec séparateur'' ## À côté de ''première chaîne'', cliquer sur le bouton <code>...</code> et initialisez-le à ''Référence d'argument'' puis sélectionner ''première chaîne''. ## À côté de la ''seconde chaîne'', cliquer sur le bouton <code>...</code> et définissez-le à ''référence d'argument'', puis sélectionner "seconde chaîne" ## Sous ''separator'' ajouter un espace dans le champ de texte L'appel résultant de la fonction doit être similaire à : [[File:Throw error expanded.png|frame|center|alt=Composition Wikifunctions utilisant la fonction ''Throw Error''|Composition Wikifunctions utilisant la fonction ''Throw Error'']] [[File:Throw error collapsed.png|frame|center|alt=Composition Wikifunctions utilisant la fonction ''Throw Error'', dans sa vue repliée|Composition Wikifunctions utilisant la fonction ''Throw Error'', dans sa vue repliée]] <span id="Handling_errors_in_compositions"></span> === Gestion des erreurs dans les compostions === Bien qu'il soit utile de permettre aux fonctions de générer les erreurs attendues, il est crucial de pouvoir gérer les erreurs dans vos compositions afin d'utiliser ces fonctions en toute sécurité. Supposons que vous souhaitiez créer une nouvelle fonction ''nom complet d'une personne'' – nous nous référerons à elle avec le ZID <code>Z30010</code>. Cette fonction doit renvoyer le nom complet de la personne avec un prénom et un nom de famille, mais si l'un des deux champs est vide, elle doit renvoyer le texte ''Unknown'' à la place. Vous pouvez créer une composition en utilisant notre fonction d'exemple ''Join two strings with a space'' ou <code>Z30000</code> pour générer le nom. Si l'une des entrées est vide, vous savez que <code>Z30000</code> va générer une erreur de type <code>Z30005</code>. En utilisant la fonction {{Z|Z850}} comme enveloppe, vous pouvez essayer l'opération de jointure et intercepter une erreur possible pour simplement renvoyer ''Unknown'' chaque fois qu'elle se produit. <span id="Try-Catch_function_(Z850)"></span> ==== Fonction ''Try-Catch'' (Z850) ==== La fonction {{Z|Z850}} est intégrée avec ZID <code>Z850</code> et prend trois arguments : * '''Function call''' – appel de la fonction initiale à exécuter. Si tout se passe bien, la réponse est le résultat de cet appel. * '''Error type''' – type d'erreur à capturer dans le cas où il apparaît pendant l'exécution de l'appel à la première fonction. * '''Error handler''' – fonction à appeler dans le cas où l'erreur spécifiée ci-dessus est capturée pendant l'exécution de l'appel de la fonction initiale. Si la capture a lieu, la valeur renvoyée est le résultat du gestionnaire d'erreur. <span id="Using_Try-Catch"></span> ==== Utiliser ''Try-Catch'' ==== Une fois toutes les fonctions de notre composition réunies, nous pouvons les assembler ainsi : <syntaxhighlight lang="prolog"> try_catch( join_with_space( Z30010K1, Z30010K2 ), Z30005, echo( "Unknown" ) ) </syntaxhighlight> Cela signifie que : * La fonction ''Join two strings with a space'' sera testée avec les deux entrées et, si tout va bien, la sortie de cette fonction sera renvoyée * Si l'une des entrées est vide, ''Join two strings with a space'' génère une erreur de type <code>Z30005</code> * Notre {{Z|Z850}} détecte alors cette erreur et exécute la fonction {{Z|Z801}} et renvoie ''Unknown'' Créons cela progressivement : # Commencez par ajouter une implémentation en cliquant sur le bouton <code>+</code> dans la table ''Implémentations'' de votre page ''Fonction''. # Vérifier que l'option ''composition'' sous ''Implémentation'' est sélectionnée. # Cliquer sur l'icône <code>›</code> ou cliquer sur le lien ''Sélectionner une fonction'' pour développer les détails de la fonction. # Sous "fonction" chercher et sélectionner la fonction la plus extérieure à utiliser, qui dans ce cas est ''Try-Catch''. # Définir l'appel à la fonction principale : ## Dans le champ où la fonction ''Try-Catch'' est sélectionnée, à côté de la touche ''appel à la fonction'', cliquer sur le bouton <code>...</code> et sélectionner ''appel de fonction'' ## Sous ''fonction'', chercher et sélectionner la fonction ''join two strings with space'' ## À côté de ''première chaîne'', cliquer sur le bouton <code>...</code> et sélectionner ''argument reference'' puis sélectionner l'argument de ''premier nom'' dans le menu déroulant. ## À côté de la ''seconde chaîne'', cliquer sur le bouton <code>...</code> et sélectionner ''argument reference'', puis sélectionner l'argument de ''second nom'' à partir du menu déroulant. # Sélectionner l'erreur à récupérer : ## Sous ''error type'', chercher et sélectionner ''bad string input'' – vous pouvez chercher directement à l'aide de son ZID <code>Z30005</code> # Déclarer l'appel de fonction du gestionnaire d'erreur : ## À côté de ''error handler'', cliquer sur le bouton <code>...</code> et sélectionner ''Appel de fonction''. ## Sous ''fonction'', chercher et sélectionner la fonction ''écho'' ## Sous ''input'' et ''type'', chercher et sélectionner le type ''String'' ## Maintenant, sous ''entrée'', saisir ''Inconnu'' dans le champ de texte La fonction résultante doit être similaire à ceci : [[File:Try catch expanded.png|frame|center|alt=Composition Wikifunctions utilisant la fonction ''Try-catch'', en mode développé|Composition Wikifunctions utilisant la fonction ''Try-catch'', en mode développé]] [[File:Try catch collapsed.png|frame|center|alt=Composition Wikifunctions utilisant la fonction ''Try-catch'', en mode replié|Composition Wikifunctions utilisant la fonction ''Try-catch'', en mode replié]] <span id="Testing_your_failure_use_cases"></span> === Tester vos cas d'utilisation en échec === Comme annoncé dans la section ci-dessus à propos de la [[#Practice Test-Driven Development|pratique du TDD]], il est important de tester non seulement les pattes les plus habituelles, mais également les cas aux limites possibles. De manière équivalente, il est aussi important de tester le comportement en cas d'échec. Dans cette section nous allons vous donner les outils nécessaires pour vérifier que votre fonction échoue avec un ensemble donné de valeurs d'entrées, et que l'erreur générée est bien celle qui est attendue. Pour faire cela, deux fonctions système supplémentaires vous sont nécessaires : <span id="Is_error_type_(Z852)"></span> ==== Tester le type d'erreur (Z852) ==== La fonction {{Z|Z852}} est intégrée avec ZID <code>Z852</code> et prend deux arguments : * '''Error''' – objet {{Z|Z5}}, qui peut être émis par un appel en échec. Une instance d'erreur possède un type et une valeur. * '''Error type''' – référence à un {{Z|Z50}} qui sera comparé au type de l'erreur passé dans le premier argument. S'ils correspondent, la fonction renvoie <code>true</code>. <span id="Get_error_thrown_by_function_call_(Z853)"></span> ==== Récupérer l'erreur générée par l'appel de fonction (Z853) ==== La fonction {{Z|Z853}} est intégrée avec ZID <code>Z853</code> et prend un argument : * '''Function call''' – appel d'une fonction qui peut renvoyer soit une valeur de succès de n'importe quel type, soit générer une erreur. Cette fonction renvoie un {{Z|Z882}} avec un {{Z|Z40}} en première position et un {{Z|Z1}} en seconde position : * Si l'appel de fonction s'exécute avec succès et donc ne produit donc aucune erreur, la paire retournée contiendra <code>False</code> en première position <code>void</code> dans la seconde. * Si l'appel de fonction génère une erreur, la paire retournée contiendra <code>True</code> en première position et l'erreur détectée, en seconde position. Pour utiliser cette fonction dans vos compositions, il est possible que vous deviez utiliser les fonctions supplémentaires : * {{Z|Z821}}, et * {{Z|Z822}} <span id="Testing_errors"></span> ==== Tester les erreurs ==== Disons que notre fonction cible, ''Joindre deux chaînes avec un espace'' ou <code>Z30000</code>, génère une erreur de type <code>Z30005</code> et nous voulons tester ce comportement. Pour ce faire, nous devons : * Génèrer un appel à une fonction en échec * Récupérer l'erreur en utilisant la fonction {{Z|Z853}} * Vérifier que l'erreur est du bon type avec {{Z|Z852}} Les tests ont deux champs : * '''Call''' – appel de fonction générant une sortie d'après les valeurs des entrées à tester. Cet appel renvoie une valeur. * '''Result validation''' – appel de fonction qui valide que la valeur renvoyée par l'appel ci-dessus est bien celle qui était attendue. Le premier argument ce cet appel de fonction sera automatiquement attribué comme étant la valeur renvoyée par le premier appel. Pour les instructions pas à pas sur la manière de créer des tests, voir {{ll|Wikifunctions:Introduction#Create_tests}}. Dans notre exemple, nous pouvons le structurer de la manière suivante — mais elle n'est pas la seule ! L'appel qui va renvoyer un objet {{Z|Z5}} : <syntaxhighlight lang="prolog"> error = get_second_element_of_typed_list( get_error_thrown_by( join_strings_by_whitespace( "", "not empty" ) ) ) </syntaxhighlight> Et la validation du résultat, qui prend l'objet {{Z|Z5}} comme son premier argument : <syntaxhighlight lang="prolog"> is_error_type( error, Z30005 ) </syntaxhighlight> Faisons cela progressivement : # Commencez par ajouter un test en cliquant sur le bouton <code>+</code> dans la table ''Tests'' de votre page Fonction. Les champs ''call'' et ''result validation'' ont déjà certaines fonctions prédéfinies, mais pour tester les erreurs, nous devons les modifier. # D'abord, définissons l'appel : ## Sous ''call'', cliquer sur le bouton du chevron <code>›</code> pour développer l'appel de fonction. ## Sous ''function'', modifier le champ et chercher puis sélectionner la fonction ''Get second element of a typed pair'' ## Une fois sélectionné, à côté de ''Typed pair'' cliquer sur le bouton <code>...</code> et sélectionner ''Appel de fonction''. ## Sous ''fonction'', chercher et sélectionner la fonction ''Get error thrown by function call'' ## À côté de ''Appel de fonction'', cliquer sur le bouton <code>...</code> et sélectionner ''Appel de fonction''. ## Sous ''fonction'', chercher et sélectionner la fonction "Join two strings with a space" (ou par ZID <code>Z30000</code>) ## Maintenant définir les entrées de sorte à provoquer une faute : au moins l'une d'entre-elles doit être vide. ## Vous pouvez maintenant, si vous le souhaitez, replier votre appel en cliquant à nouveau sur le bouton avec le chevron vers le bas ! # Puis, définir la validation du résultat : ## Sous ''validation des résultats'', cliquer sur le bouton <code>›</code> pour développer l'appel de fonction. ## Sous ''fonction'', modifier le champ et recherchez et sélectionnez la fonction ''Is error type'' ## Maintenant on vous demandera de ne configurer que le deuxième argument. Sous ''error type'' chercher et sélectionner le type de votre erreur <code>Z30005</code> . # Voila, c'est terminé ! Vous pouvez maintenant cliquer sur la flèche circulaire dans la boîte ''Implémentations'' et vous verrez les cases vertes cochées. Si tout c'est bien passé vous pouvez maintenant sauvegarder votre test. Il doit ressembler à : [[File:Get error expanded.png|frame|center|alt=Tester un échec en utilisant les fonctions ''Get error'' et ''Is error type'', en mode développé|Tester un échec en utilisant les fonctions ''Get error'' et ''Is error type'', en mode développé]] [[File:Get error collapsed.png|frame|center|alt=Tester un échec en utilisant les fonctions ''Get error'' et ''Is error type'', en mode replié|Tester un échec en utilisant les fonctions ''Get error'' et ''Is error type'' en mode replié]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Creating actionable error messages === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As described above, Error Types have an optional key <code>Z50K3</code> which contains a multilingual list of HTML strings. When rendering information about an error, the messages stored in the error type can help create a clear, precise, informative, translatable and actionable error message. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For that purpose, error messages can contain parameters like <code>$1</code>, <code>$2</code>, etc., where the digit corresponds to the error type argument and its value in the error instance. These error messages are rendered in Wikifunctions inside the "Details" dialog window after executing a function call. Additionally, these error messages are surfaced in other client interfaces, like Abstract Wikipedia, to provide better guidance to Abstract Content editors. </div> [[File:Wikifunctions actionable error message example in the Details dialog.png|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">The error message is rendered using the HTML message of the error type and the error argument values.</span>]] [[File:Wikifunctions actionable error message example in Abstract Wikipedia.png|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">When available, the HTML error message is rendered in the Abstract Wikipedia preview section.</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> Let's use a real example to understand the benefits of HTML error messages: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The function {{Z|Z37847}} returns the first Lexeme reference given a Wikidata Item reference and a language. When there is no Lexeme for this Item-Language combination, it throws an error of type {{Z|Z28248}}, which has three keys: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K1''' is the input Wikidata item QID</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K2''' is the connecting property, in this case <code>P5137/item for this sense</code></span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K3''' is the language code</span> <div lang="en" dir="ltr" class="mw-content-ltr"> When calling this function for a Wikidata lexeme that doesn't exist, the call will throw an error instance like this: </div> <syntaxhighlight lang="json" highlight="10,12"> { "Z1K1": "Z5", "Z5K1": "Z28248", "Z5K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z885", "Z885K1": "Z28248" }, "Z28248K1": "Q319", "Z28248K2": "P5137", "Z28248K3": "ast" } } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> While the error type label indicates: <code>No matching lexeme for item in language</code>, a better error message should indicate: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">which is the failing item,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">which is the language missing, and</span> * <span lang="en" dir="ltr" class="mw-content-ltr">what are the possible ways to fix it.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The error message <code>Z50K3</code> field can provide this functionality. Whenever an Error Type has an error message for the user language (or any of its fallbacks), the error message shown will be rendered by: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">First, replacing the message parameters with the values of the keys. In our example, any <code>$1</code> will be replaced with the value of <code>Z28248K1</code> ("Q319"), <code>$2</code> with "P5137", and <code>$3</code> with "ast",</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Last, sanitizing and rendering the HTML message.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> So a HTML message like: </div> <syntaxhighlight lang="html"> There is no matching lexeme for the item $1 in "$3".<br> <a href="http://wikidata.org/wiki/$1">Edit in Wikidata</a> </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Will become: </div> : There is no matching lexeme for the item Q319 in "ast" : [[d:Q319|Edit in Wikidata]] <span id="Debugging_your_implementations"></span> == Deboguer vos implémentations == Parfois, les choses peuvent mal se passer. Une fonction peut se comporter différemment de ce à quoi on s'attendait ou une valeur peut ne pas ressembler parfaitement. Parfois, les implémentations sont vraiment complexes et, parce qu'elles sont exécutées dans un environnement de type bac à sable, il peut sembler très difficile de les déboguer. Pour comprendre ce qui se passe à l'intérieur d'un appel de fonction, Wikifunctions fournit un petit ensemble d'outils de débogage. Ces outils ne changent pas le résultat d'une fonction, mais ajoutent des informations supplémentaires aux métadonnées renvoyées, que vous pouvez observer après avoir exécuté la fonction. Vous pouvez utiliser <code>Wikifunctions.Debug()</code> dans vos implémentations de code ou la fonction {{Z|Z854}} pour vos compositions. Dans cette section, vous apprendrez : * Comment ajouter des messages de débogage à la fois à partir de l'implémentation du code et des compositions, * comment inspecter les métadonnées manuellement ou via l'interface utilisateur pour explorer ces journaux. <span id="Debugging_your_code_implementations"></span> === Deboguer vos implémentations de code === Lorsque vous écrivez du code, à la fois en JavaScript ou en Python3, vous pouvez utiliser <code>Wikifunctions.Debug()</code> pour ajouter un message à votre journal de debogue et continuer l'exécution. {{phab|T441028}} <code>Wikifunctions.Debug()</code> a un paramètre, qui est généralement censé être une chaîne de caractères. Cependant, tout autre objet passé en tant que paramètre sera directement converti en chaîne. Si nous voulons ajouter des journaux de débogue à nos implémentations de code pour notre fonction d'exemple ''Join two strings with a space'', nous pouvons le faire, en JavaScript : <syntaxhighlight lang="JavaScript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { Wikifunctions.Debug( `first input is empty "${ Z30000K1 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { Wikifunctions.Debug( `second input is empty "${ Z30000K2 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } Wikifunctions.Debug( "both inputs are fine" ); return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> Et la même chose dans votre implémentation en Python3 sera : <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": Wikifunctions.Debug( 'first input is empty "'+Z30000K1+'"' ) Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": Wikifunctions.Debug( 'second input is empty "'+Z30000K2+'"' ) Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) Wikifunctions.Debug( 'both inputs are fine' ) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> De cette façon, peu importe ce qui se passe, nous allons ajouter un message dans vos journaux de débogue : * Si l'appel à la fonction échoue lors de la vérification de la première ou de la deuxième entrée, le résultat de l'exécution sera un échec et il contiendra un journal informatif avec la branche qui n'a pas réussi. * Si l'appel de la fonction réussit — parce que les deux entrées sont valides — l'appel de la fonction renvoie la chaîne jointe, mais les métadonnées renvoyées contiendront aussi un journal de débogue. <span id="Debugging_your_compositions"></span> === Deboguer vos compositions === Pour soutenir les compositions de débogue, Wikifunctions fournit la fonction intégrée {{Z|Z854}}. Cette fonction vous permet d'attacher des messages de débogue à l'exécution de tout appel de fonction qui génère la sortie finale. Les journaux de débogue recueillis pendant l'évaluation sont renvoyés dans le cadre des métadonnées d'exécution, sous la clé <code>executorDebugLogs</code>. <span id="Add_debug_log_to_function_call_(Z854)"></span> ==== Ajouter les journaux de débogue à l'appel de fonction (Z854) ==== La fonction {{Z|Z854}} est intégrée avec ZID <code>Z854</code> et prend deux arguments : * '''Function call''' – toute composition que vous voulez exécuter. * '''Debug log''' – un message textuel qui sera sauvegardé si l'appel de la fonction est évalué. Lorsque l'appel de fonction enveloppe est exécuté, le message fourni est ajouté aux journaux d'exécution. Si cette appel de fonction n'est pas exécuté ou si son exécution ne fait pas partie de la sortie finale, son journal de débogage n'apparaîtra pas dans les métadonnées du résultat final. Vous bénéficiez de cette intégration si vous voulez observer : * Branche exécutée d'une condition, ou * ordre d'évaluation d'une composition. <span id="Using_Add_debug_log_to_function_call"></span> ==== Utiliser l'ajout de journaux de débogue à l'appel de fonction ==== Supposons que vous souhaitez jouter des journaux de débogage à notre fonction d'exemple ''Join two strings with a space'' ou <code>Z30000</code>, de sorte que différents messages soient ajoutés aux différents résultats possibles. Vous pourriez utiliser notre débogage intégré comme ceci : <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), add_debug_log( throw_error( Z30005, ... ), 'failed on first input' ) if( is_empty_string( Z30000K2 ), add_debug_log( throw_error( Z30005, ... ), 'failed on second input' ), add_debug_log( join_with_separator( Z30000K1, Z30000K2, " " ), 'both inputs are ok!' ) ) ) </syntaxhighlight> Ainsi, * lorsqu'elle est appelée avec une première entrée vide, la fonction renvoie une réponse d'échec, et les métadonnées contiennent une entrée <code>executorDebugLogs</code> avec une trace ''failed on first input''. * Si l'appel est fait avec une seconde entrée qui est vide, il va échouer aussi mais le message journalisé sera ''failed on second input'' * Lorsque l'appel est effectué avec des entrées valides, la fonction renvoie une réponse de succès avec des métadonnées contenant ''both inputs are ok'' dans sa clé <code>executorDebugLogs</code>. Voici à quoi ressemblerait cette composition : [[File:Add debug log expanded.png|frame|center|alt=Implémentation de composition en utilisant ''Add debug logs'' pour enregistrer toutes les pattes d'exécution possibles|Implémentation de composition en utilisant ''Add debug logs'' pour enregistrer toutes les pattes d'exécution possibles]] <span id="Accessing_execution_debug_logs"></span> === Accès aux journaux de débogue de l'exécution === Que vos journaux d'exécution soient ajoutés via <code>Wikifunctions.Debug()</code> ou via la fonction intégrée {{Z|Z854}} , ils sont renvoyés dans le cadre des métadonnées de réponse. Pour voir les journaux, une fois que vous avez exécuté votre fonction, cliquer sur le bouton ''Details'' qui apparaît en bas de la section ''Résultat''. L'erreur et les informations de debug apparaissent en haut de la boîte de dialogue des ''Détails''. Voici ce que vous obtenez lorsque vous exécutez la composition de notre exemple précédent avec des entrées valides et d'autres invalides : {| class="wikitable" | [[File:Execution logs success.png|frameless|center|alt=Dialogue des métadonnées de la fonction pour une exécution avec succès, avec les journaux de debogue.]] | [[File:Execution logs failure.png|frameless|center|alt=Dialogue des métadonnées de la fonction pour une exécution en échec, avec les journaux de debogue.]] |- | Dialogue des métadonnées de la fonction pour une exécution avec succès : pas d'erreur affichée, mais affiche le journal d'exécution avec succès : ''"both inputs are ok!"'' | Dialogue des métadonnées de la fonction pour une exécution en échec : affichage des informations d'erreur, et du journal d'exécution supplémentaire pour la première branche en échec : ''"failed on first input"'' |} [[Category:How to create implementations| {{#translation:}}]] g31h1482d3zjsbx19ajybed9fjme45c Wikifunctions:How to create implementations/uk 4 16127 331126 296948 2026-10-23T08:23:31Z FuzzyBot 207 Updating to match new version of source page 331126 wikitext text/x-wiki <languages/> Ця сторінка надає більш детальні інструкції щодо того '''як створювати реалізації''', ніж короткий огляд на сторінці {{ll|Wikifunctions:Introduction}}. <div lang="en" dir="ltr" class="mw-content-ltr"> == Types of Implementations == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In Wikifunctions, an '''implementation''' can take one of two main forms: '''code''' or '''composition'''. A code implementation directly expresses the function’s logic in any of the available programming languages (currently, Python3 or JavaScript). It’s most useful when the function’s behavior can’t easily be built from existing Wikifunctions, or when precise control over data processing is needed. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> A composition implementation, on the other hand, defines the function entirely by combining other existing functions, without writing code. Compositions are easier to understand, reuse, and translate into other languages automatically, but they depend on suitable building blocks already being available and often are less performant. In general, start by checking whether your goal can be achieved through composition; if it can’t, or if performance or fine-grained logic matters, choose a code implementation instead. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> There's a third type of implementation: '''built-ins'''. These are run by system-built code, and are not editable. Most likely all pre-defined functions will have a built-in implementation. In such cases, when opening the implementation page, you will see a message stating ''"{{int|wikilambda-implementation-selector-none}}"'' </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Practice Test-Driven Development == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> '''Test-Driven Development''', or '''TDD''', is a way of creating software where you write tests before you write the actual code. Tests are just a way of understanding what your function is supposed to do by listing examples and how they should work. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In Wikifunctions, writing tests first offers significant benefits. If you are working on an implementation, you can run your code against the existing tests to check that it behaves as expected. This makes it easier to catch errors early before even publishing your implementation. Tests are also a powerful way to describe the function you need. By writing tests, '''you clearly communicate the expected behavior''', and the community can step in and help with the implementation, or create alternative implementations. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Imagine you want to implement a Function that combines two strings with a space in between. A basic test for this might look like: </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello", "world" ) => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Once you have defined the basic behavior, it's important to '''think about edge cases'''—situations where the inputs are such that you might need some special behavior. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, what if your first string ends in a space, or your second string starts with a space? Should the function keep all existing spaces and add another one, or should it return a neatly spaced result with just a single space between the words? Depending on your requirements, you should build a test for such a case. For example, a test for this edge case could be either one of these — but not both!: </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> or ... </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Make sure that all possible special cases are covered by your tests, and once you have them, make sure that they are all connected to the Function by selecting them and clicking "Connect". </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Code implementations == </div> [[File:Code implementation.png|thumb|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions code editor initialized with a function template</span>|<span lang="en" dir="ltr" class="mw-content-ltr">When adding a new code implementation, the function template is initialized with the function and argument names</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> When creating an implementation using code, the Wikifunctions UI will set up a code editor with the selected language activated for syntax highlighting and validation. When the function to implement and the programming language are selected, this editor will be set with the correct function template: '''do not remove or edit this'''! Keep your code inside this function signature: if you need auxiliary functions, you can simply declare them inside your top-level function declaration. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Using input types in your code === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions types {{Z|Z6}} and {{Z|Z40}} can be used as if they were native types in both JavaScript and Python3. For example, a String input can be concatenated or a Boolean be directly used in a logical expression. To use other types in your code implementations, you will have to look deeper into the type, figure out if it has a conversion to a native equivalent, and treat it accordingly. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, let's say we want to write some Python code that handles an input of type {{Z|Z20420}}. In the page for this type, let's look at its "type converters to code" and search for a Python one. The converter {{Z|Z20424}} will be applied to our date input before our code, so looking at "native type" we know that our input will be a Python ''dict'' and looking at the implementation we can see the keys we can expect: </div> <syntaxhighlight lang="python3"> return { 'K1': year, 'K2': month, 'K3': day } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> When a type doesn't have a converter, you'll have to access its parts directly using its keys. For example, let's assume that your function <code>Z30000</code> has one input <code>Z30000K1</code> of type {{Z|Z11}}. This type has two keys: <code>Z11K1</code> for the language (itself an object of type {{Z|Z60}}), and <code>Z11K2</code> for the string value. Similarly, the language object has a key <code>Z60K1</code> for the language code. So, to get a string with the language code and the text, you can write: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1 ) { // e.g. "en: some text" return Z30000K1.Z11K1.Z60K1 + ": " + Z30000K1.Z11K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> For a quick reference of the available type conversions visit [[Special:MyLanguage/Wikifunctions:Execution targets#Default type conversion|the default type conversion table]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Returning the right outputs === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Similarly to the way you treat inputs, outputs need to match the type specified in the function definition. Some can be treated as simply as native types, so any string output will be converted into a Wikifunctions {{Z|Z6}} object and any native boolean returned by your implementation will be converted into a Wikifunctions {{Z|Z40}} object. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Those types that have "type converters from code" will apply the appropriate function to the output, in order to build the required type. Following the example of {{Z|Z20420}}, the {{Z|Z20443}} will transform the output from your implementation–a dict with K1, K2 and K3 keys–into its correct ZObject representation. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For types that don't have converters from code, you can carefully build and return the output objects. For example, imagine that our function <code>Z30000</code> takes two string inputs: language code and text, and should return a {{Z|Z11}} object. You can do this in Python by using the <code>ZObject</code> constructor: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): lang_object = ZObject( {"Z1K1": "Z9", "Z9K1": "Z60"}, Z60K1 = Z30000K1 ) return ZObject( {"Z1K1": "Z9", "Z9K1": "Z11"}, Z11K1 = lang_object, Z11K2 = Z30000K2 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Or in JavaScript: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { const langObject = new ZObject( new Map( [ [ "Z60K1", Z30000K1 ] ] ), { "Z1K1": "Z9", "Z9K1": "Z60" } ); const monolingualKeys = new Map( [ [ "Z11K1", langObject ], [ "Z11K2", Z30000K2 ] ] ); return new ZObject( monolingualKeys, { "Z1K1": "Z9", "Z9K1": "Z11" } ); } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> You can learn more about the <code>ZObject</code> class and other useful constructors in {{ll|Wikifunctions:Execution_targets#Custom_and_non-built-in_type_conversion}} </div> {{phab|T392750}}<div lang="en" dir="ltr" class="mw-content-ltr"> As of 2026-05, trying to return a list of lists may fail, so you're not able to implement such functions in code. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Code in Python === </div> <div class="mw-translate-fuzzy"> Далі ми надаємо конкретний приклад того, як створювати Реалізації у вигляді Коду на Python. Скажімо, ми хочемо створити реалізацію Функції, яка комбінує два рядки вводу вставивши між ними пробіл, і повертає результат цього. Давайте припустимо, що ZID такої функції Z11057. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The implementation is defined using the ZID of the function. So are the arguments of the function. So in the case of the function Z30000 with its two arguments, the function template should look like this: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> As we described before, we know that the arguments (<code>Z30000K1</code> and <code>Z30000K2</code>) are Strings, so we can treat them as simply as we use native strings in Python. Also, the function should return a String. For our example, we simply return the two arguments concatenated with a space in between: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Since this is Python, do not forget to indent this line. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If you have followed our advice to [[#Practice Test-Driven Development|practice TDD]], you will already have a set of tests that you know should work. If that's the case, while building your implementation you can click on the circular arrow in the Tests panel, and see if your implementation passes all of them. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Remember that the runtime has no state. Don’t assume values for global or static variables. If you have further questions about what you can and cannot do in Python, ask on [[Wikifunctions:Python implementations]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Code in JavaScript === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section, we give a concrete example on how to create an implementation in the form of Code in JavaScript. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is <code>Z30000</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The implementation is defined using the ZID of the function. So are the arguments of the function. So in the case of the function <code>Z30000</code> with its two arguments, the function template should look like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> We know that the arguments (<code>Z30000K1</code> and <code>Z30000K2</code>) are Strings, so we can treat them as native strings in JavaScript. Also, the function should return a String. To complete our function, you can then add a line concatenating the input strings, like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> If you have tests as recommended in the [[#Practice Test-Driven Development|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes all of them. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Remember that the runtime has no state. Don’t assume values for global or static variables. If you have further questions about what you can and cannot do in JavaScript, ask on [[Wikifunctions:JavaScript implementations]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Calling another Wikifunctions function === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> A code implementation can call certain other Wikifunctions functions, receive the output of the call, and use that output in further processing. We refer to such calls as callbacks. At present, due to security and performance concerns, only the following built-in Wikidata fetch and search functions can be called in this way: {{Z|Z6820}}, {{Z|Z6821}}, {{Z|Z6822}}, {{Z|Z6824}}, {{Z|Z6825}}, {{Z|Z6826}}, {{Z|Z6830}}, and {{Z|Z6831}}. This capability is in an initial stage of deployment; we hope to allow calls to a broader range of functions in the future. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Let’s look at a JavaScript implementation containing a callback. This implementation fetches an item from Wikidata, extracts the label of that item in a given language, and returns the label string. The item to fetch is given by argument <code>Z400K1</code>, and the language is given by <code>Z400K2</code>. </div> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const item = Wikifunctions.Call('Z6821', Z400K1); for (const label of item.Z6001K2.Z12K1) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> A callback is made by calling <code>Wikifunctions.Call</code>, as shown in the example. The first argument to <code>Wikifunctions.Call</code> is always the ZID of the function to be called – in this case, {{Z|Z6821}}, which takes a single argument. Following that, the arguments to be passed to that function are listed, separated by commas. Here, that argument, <code>Z400K1</code>, is the same value that was passed to the function <code>Z400</code>. This is a common pattern of argument passing to callbacks, but their arguments can also be built using the <code>ZObject</code> constructor (as explained above), or obtained in other ways. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The value of <code>Z400K1</code> would be an instance of {{Z|Z6091}}, containing the QID of the item to be fetched. Line 2 of the example calls <code>Z6821</code> to fetch that item from Wikidata and assigns the resulting ZObject to the const <code>item</code>. The remaining code iterates over the item’s labels until it finds the one matching the language given by <code>Z400K2</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For the first example above, we have used <code>Z6821</code> for simplicity. However - unless an entire entity is needed by the implementation, it is strongly recommended to use <code>Z6820</code> to retrieve Wikidata items, which can be quite large. Although a call to <code>Z6820</code> is a bit more complex, its parameters allow for fetching selected portions of a Wikidata item, which can greatly improve performance and avoid some errors, by reducing the network bandwidth and processing time that are needed. (<code>Z6820</code> can also be used in place of <code>Z6822</code>, <code>Z6824</code>, <code>Z6825</code>, and <code>Z6826</code>, to get similar bandwidth-reduction benefits.) </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Just below we show how <code>Z6820</code> can be used, in <code>Wikifunctions.Call</code>, to implement the same behavior as above. Note that we use the second argument passed to <code>Z6820</code>, <code>[labelsPart]</code>, to say “Just return the item’s labels”, and we use the third argument, <code>[Z400K2]</code>, to say “Just return labels in the given language”. (This argument would also apply to aliases and descriptions, if they were included in the result.) </div> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const labelsPart = new ZObject( new Map( [ ['Z6030K1', new ZReference('Z6033')] ] ), {Z1K1: 'Z9', Z9K1: 'Z6030'} ); const entities = Wikifunctions.Call( 'Z6820', [Z400K1], [labelsPart], [Z400K2], []); const item = entities.get(Z400K1.Z6091K1); const labels = item.Z6001K2.Z12K1; for (const label of labels) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Other things to note: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Even though code implementations are now able to fetch Wikidata entities, it is recommended that they not be written to return ''entire'' entities. This is because of current limitations on the size of the value returned from a code implementation. To fetch and return an entire large entity, it’s better to call the fetch function from a composition.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Only one callback can execute at a time. For security reasons, it is not possible to use the concurrency features of JavaScript or Python to execute multiple callbacks in parallel.</span> ** <span lang="en" dir="ltr" class="mw-content-ltr">Keep in mind, however, that you can fetch multiple entities at once using Z6820.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">There is currently a 3 MiB limit on the size of Wikidata content that can be returned to a code implementation, by a single callback. The same limit applies to the size of the result returned from a code implementation.</span> <span id="Compositions"></span> <div class="mw-translate-fuzzy"> == Композиція == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section, we give a concrete example on how to create an implementation in the form of a composition. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is <code>Z30000</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> It is usually a good idea to first think about how to combine existing functions in order to create the desired output. Sometimes this might be trivial, and you can just go ahead with composing functions, but in many cases it is worthwhile to note the desired composition down. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, for the given Function, we could use the existing Function {{Z|Z10000}}. That Function takes two strings and makes one string out of them. But we need to add a space in between. So we first concatenate a space to the end of the first string, and then concatenate the second string to the result of that first concatenation. So our composition could be noted down like this: </div> <syntaxhighlight lang="prolog"> join_strings( join_strings( Z30000K1, " " ), Z30000K2 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> There are multiple ways to write a composition: notice that the same thing could be accomplished with: </div> <syntaxhighlight lang="prolog"> join_strings( Z30000K1, join_strings( " ", Z30000K2 ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> An alternative implementation could also use the existing Function {{Z|Z15175}}, so your composition could be: </div> <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> As you can see, there are multiple ways to accomplish this, so take your time and explore the existing functions available in the {{ll|Wikifunctions:Catalogue}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's try to create the second example, <code>join_strings(Z30000K1, join_strings(" ", Z30000K2))</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In order to create this: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›" icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search for the name of the outermost function you want to use, which in this example is "join two strings". Then, select the wanted function from the dropdown list.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">You will see two new fields, one for each of the arguments needed for the selected function.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">For the first argument, we want to select the first input to our function:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and select "Argument reference".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id" you can now select the first string of your function from the dropdown, which contains all available inputs.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">For the second argument, we want to use the result of another call to "join two strings":</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and select "Function call".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function you want to call, which is again "join two strings".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For this inner function call, configure the "first string" by simply typing a white space in the text field, and configure the "second string" as you did for step 6: change it using the "…" button to "Argument reference", and then select the second argument in the dropdown.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Your composition is now complete! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You can expand and collapse the details using the chevron buttons to see how it looks. If you already have Tests as recommended in the [[#Practice Test-Driven Development|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes the tests. Once your composition passes the tests, go ahead and publish it. </div> [[File:Composition implementation expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its expanded view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its expanded view</span>]] [[File:Composition implementation collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its collapsed view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its collapsed view</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions error handling == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As a Wikifunctions function creator, you might want to warn the user calling your function when something goes wrong in the code, or when their inputs do not fit a certain criteria. For example, if your Function expects a string input to contain a name, you might want to check that the name is not empty and, if it is, show an error message that the person using your Function can understand. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For this purpose, you can use <code>Wikifunctions.Error()</code> from your code implementations or the function {{Z|Z851}} from your compositions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section you will learn: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">How to throw errors from both code and composition implementations,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to write tests for error cases, and</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to catch and handle errors thrown by functions that you are using in your compositions.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Throwing errors from code implementations === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> When writing code, both from JavaScript and Python, you can use <code>Wikifunctions.Error()</code> to end the execution with a wanted error. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> <code>Wikifunctions.Error()</code> has two parameters: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Error type: a string containing the ZID of the error type you want to return.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Error arguments: a list of string arguments to build the error.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's go one by one: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Error type ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> An error type is an object that describes a kind of error that could happen in the system. There are a number of built-in error types but you can also build other error types that are more suited to your use case. When using errors, the best idea is to browse through the available error types, which can be explored in [[Special:ListObjectsByType/Z50|this list]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If there are no errors that fit your case, create a new one by going to the create page, and selecting "Error type" in the type selector. Then, set the necessary fields: </div> [[File:Error type.png|thumb|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Error type creation in Wikifunctions</span>|<span lang="en" dir="ltr" class="mw-content-ltr">To create new Error type (Z50), edit the label and add the necessary keys.</span>]] * <span lang="en" dir="ltr" class="mw-content-ltr">'''Label''' – This is the main title of the error, which should contain a short but descriptive message. Set the error label on the right-side box titled "About".</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Keys''' – Keys contain additional information about what caused the error. For example, if an input had the wrong format, you might want to inform the user of what was the input content when raising the error. To use them in your implementations, keys should be strings. To create a key, click on the "[+]" icon below "keys", select "String" under "value type", and add a label that describes it appropriately, for example "current input". Once you have all the necessary keys, you can Publish your error type and keep the ID of the newly created object.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error message''' – Error types can contain a multilingual array of HTML parametrized error messages. The parameter notation is $1, $2, etc., where the digit corresponds to the error type key. For example, when creating an error type with one string key "current input", the error message can use the positional parameter "$1", which will be replaced with the value of the "current input" key at the time of rendering the error. To add HTML messages, click on the "[+]" icon below "html fragments", select a language and input the HTML string.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Error arguments ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Error arguments correspond to the keys of the Error type, and they should provide additional information to understand the error. Error arguments should always be Strings. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Wikifunctions.Error() ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say that you want an error to be thrown when either your first or your second input are empty. You have already created the error type, and the assigned ZID was <code>Z30005</code>. Your error type has two string keys: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Input key: contains the key of the failing input</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Input value: contains the current value of the failing input</span> <div lang="en" dir="ltr" class="mw-content-ltr"> To raise an error in your JavaScript implementation you should do something like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { // If the first input is empty, raise error Z30005 // with two string args: [ first input key, first input value ] Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { // If the second input is empty, raise error Z30005 // with two string args: [ second input key, second input value ] Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> To raise an error in your Python implementation you should do something like this: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": # If the first input is empty, raise error Z30005 # with two string args: [ first input key, first input value ] Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": # If the second input is empty, raise error Z30005 # with two string args: [ first input key, first input value ] Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Remember that calling <code>Wikifunctions.Error()</code> ends the execution! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Throwing errors from compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If you are creating a composition implementation, you can throw an error by calling the special function {{Z|Z851}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Throw Error function (Z851) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z851}} function is similar to the <code>Wikifunctions.Error()</code> method and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – A reference to the Error type you want to raise</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error parameters''' – A list with the arguments to create your Error, which should also be Strings.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Throw Error ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say you want to modify your composition so that it first checks that the arguments are not empty, and raises an error when it finds an empty one. Then, if none of them are empty, it runs the original composition, which is: </div> <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> To do this, you need to create conditional paths, for which you can use the {{Z|Z802}} function. Think of it like this: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the first argument is empty, throw an error for the first argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Else, proceed to check the second argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the second argument is empty, throw an error for the second argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Else, proceed with the success path and return the joint strings with the space separator</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Or in functional pseudo code: </div> <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), throw_error( Z30005, [ "Z30000K1", Z30000K1 ] ), if( is_empty_string( Z30000K2 ), throw_error( Z30005, [ "Z30000K2", Z30000K2 ] ), join_with_separator( Z30000K1, Z30000K2, " " ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's create this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+” button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›” icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the outermost function you want to use, which in this case is "if".</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Check the validity of the first argument:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "condition", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "is empty string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "input", click on the "…" button and select "argument reference"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id", select the first input (e.g. "first string")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse the "condition" function call if you want, by clicking on the down-chevron next to "condition". You should see something like "f(x) is empty string( → first string )"</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Throw error if the condition is true:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "then", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Throw Error"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error type", search and select your error type (you can directly input the error ID if you know it, e.g. Z30005)</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error parameters", add two items by clicking on the "+" button</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For "Item 1" (offending argument key), set its type to "String" and write the argument identifier (e.g. "first input", or "Z30000K1")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For "Item 2" (offending argument value), click on the "…" next to "Item 2" and select "argument reference"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id", select the first input (e.g. "first string")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse the "then" function call if you want, by clicking on the down-chevron next to "then". You should see something like "f(x) Throw Error( Input was the wrong format, Typed list( Object, "first input", → first string ) )"</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Continue to check the second argument if the first was good:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "else", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "if"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Set up "condition" to check the validity of the second argument by following the same process as described in step 5.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Set up "then" to throw an error for the second argument by following the same process as described in step 6.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Finally, set up the success path:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to the nested "else", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the successful function, which in this case can be "join strings with separator"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and set it to "argument reference", then select "first string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and set it to "argument reference", then select "second string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "separator" add a space into the text field</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The resulting function call should look like this: </div> [[File:Throw error expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function</span>]] [[File:Throw error collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function, in its collapsed view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function, in its collapsed view</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Handling errors in compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> While it is useful to allow functions to raise expected errors, it is crucial to be able to handle errors in your compositions in order to safely use these functions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say you want to create a new function "full name of a person" – we will refer to it with the ZID <code>Z30010</code>. This function should return the full name of a person given a first and last names, but if any of the two fields are empty, it should return the text "Unknown" instead. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You could create a composition using our example function "Join two strings with a space" or <code>Z30000</code> to generate the name. If any of the inputs are empty, you know that <code>Z30000</code> will throw an error of type <code>Z30005</code>. Using the function {{Z|Z850}} as a wrapper, you can attempt the join operation and intercept a possible error to simply return "Unknown" whenever it occurs. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Try-Catch function (Z850) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z850}} function is built-in with ZID <code>Z850</code> and takes three arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – The initial function call to run. If nothing goes wrong, the response will be the result of this function call.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – An error type to catch in case it is thrown during the execution of the first function call.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error handler''' – A function call that will be run in case the error specified above is caught during the execution of the initial function call. If that happens, the result of the error handler will be the value returned.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Try-Catch ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Once we have all the functions for our composition, we can craft it like this: </div> <syntaxhighlight lang="prolog"> try_catch( join_with_space( Z30010K1, Z30010K2 ), Z30005, echo( "Unknown" ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This means that: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">The "Join two strings with a space" function will be tried with the two inputs and, if everything goes well, the output of this function will be returned</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If any of the inputs are blank, "Join two strings with a space" with raise an error of type <code>Z30005</code></span> * <span lang="en" dir="ltr" class="mw-content-ltr">Our {{Z|Z850}} will then detect this error and run the {{Z|Z801}} function to return "Unknown"</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's create this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›” icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the outermost function you want to use, which in this case is "Try-Catch".</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Set the main function call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under the field where the "Try-Catch" function is selected, next to the "function call" key, click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the function "join two strings with space"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and select "argument reference", then select the "first name" argument from the dropdown.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and select "argument reference", then select the "second name" argument from the dropdown.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Select the error to catch:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error type", search and select "bad string input" – you can search directly by its ZID <code>Z30005</code></span> # <span lang="en" dir="ltr" class="mw-content-ltr">Set the error handler function call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "error handler", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "echo"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "input" and "type", search and select the type "String"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now, under "input", type "Unknown" in the text field</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The resulting function should look like this: </div> [[File:Try catch expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in expanded mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in expanded mode</span>]] [[File:Try catch collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in collapsed mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in collapsed mode</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Testing your failure use cases === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As we introduced in the above section about [[#Practice Test-Driven Development|practicing TDD]], it's important to test not only the most common paths, but also the possible edge cases. It is equally important to test failure behavior. In this section we will give you the tools necessary to test that your function fails with a given set of inputs, and that the error thrown is the expected one. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> To do that, you will need other two system functions: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Is error type (Z852) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z852}} function is built-in with ZID <code>Z852</code> and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error''' – An {{Z|Z5}} object, which can be thrown by a failing call. An error instance has a type and a value.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – A reference to an {{Z|Z50}} which will be compared to the type of the Error passed as a first argument. If that's the case, the function will return true.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Get error thrown by function call (Z853) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z853}} function is built-in with ZID <code>Z853</code> and takes one argument: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – A function call which can either return a successful value of any type, or throw an error.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> This function returns a {{Z|Z882}} with a {{Z|Z40}} in first place and an {{Z|Z1}} in the second: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the Function call runs successfully and hence does not throw any error, the returned pair will contain False in the first place, and void in the second.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the Function call throws an error, the returned pair will contain True in the first place, and the caught error in the second.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> To use this function in your compositions, you might need to use the additional functions: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">{{Z|Z821}}, and</span> * {{Z|Z822}} <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Testing errors ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say our target function, "Join two strings with a space" or <code>Z30000</code>, throws an error of type <code>Z30005</code> and we want to test this behavior. To do that we need to: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Throw a failing function call</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Get the error using the function {{Z|Z853}}</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Check that the error is the right type with {{Z|Z852}}</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Tests have two fields: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Call''' – A function call that will produce an output with the inputs you want to test. This call will return a value.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Result validation''' – A function call that will validate that the value returned by the call above is the expected one. The first argument of this function call will be automatically assigned to take the return value of the first call.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> For step-by-step instructions on how to create tests, see {{ll|Wikifunctions:Introduction#Create_tests}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In our example, we can structure it like this — but this is not the only way! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The call, which will return an {{Z|Z5}} object: </div> <syntaxhighlight lang="prolog"> error = get_second_element_of_typed_list( get_error_thrown_by( join_strings_by_whitespace( "", "not empty" ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> And the result validation, which will take the {{Z|Z5}} object as its first argument: </div> <syntaxhighlight lang="prolog"> is_error_type( error, Z30005 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's do this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding a test by clicking on the "+" button in the "Tests" table from your Function page. The "call" and "result validation" fields already have some functions pre-set, but to test the errors we will need to change them.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">First, let's set the call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "call", click the "›" chevron button to expand the function call.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", edit the field and search and select the function "Get second element of a typed pair"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Once selected, next to "Typed pair", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Get error thrown by function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "function call", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Join two strings with a space" (or by ZID <code>Z30000</code>)</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now set the inputs so that they cause a failure: at least one of them should be empty.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse your "call" by clicking again on the down-chevron button if you want!</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Next, let's set the result validation:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "result validation", click the "›" chevron button to expand the function call.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", edit the field and search and select the function "Is error type"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now you will only be asked to configure the second argument. Under "error type", search and select your <code>Z30005</code> error type.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">And you are done! You can now click the circular arrow in the "Implementations" box and you should see green checks.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> If everything went right, you can now save your test. It should look like this: </div> [[File:Get error expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in expanded mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in expanded mode</span>]] [[File:Get error collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in collapsed mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in collapsed mode</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Creating actionable error messages === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As described above, Error Types have an optional key <code>Z50K3</code> which contains a multilingual list of HTML strings. When rendering information about an error, the messages stored in the error type can help create a clear, precise, informative, translatable and actionable error message. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For that purpose, error messages can contain parameters like <code>$1</code>, <code>$2</code>, etc., where the digit corresponds to the error type argument and its value in the error instance. These error messages are rendered in Wikifunctions inside the "Details" dialog window after executing a function call. Additionally, these error messages are surfaced in other client interfaces, like Abstract Wikipedia, to provide better guidance to Abstract Content editors. </div> [[File:Wikifunctions actionable error message example in the Details dialog.png|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">The error message is rendered using the HTML message of the error type and the error argument values.</span>]] [[File:Wikifunctions actionable error message example in Abstract Wikipedia.png|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">When available, the HTML error message is rendered in the Abstract Wikipedia preview section.</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> Let's use a real example to understand the benefits of HTML error messages: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The function {{Z|Z37847}} returns the first Lexeme reference given a Wikidata Item reference and a language. When there is no Lexeme for this Item-Language combination, it throws an error of type {{Z|Z28248}}, which has three keys: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K1''' is the input Wikidata item QID</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K2''' is the connecting property, in this case <code>P5137/item for this sense</code></span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K3''' is the language code</span> <div lang="en" dir="ltr" class="mw-content-ltr"> When calling this function for a Wikidata lexeme that doesn't exist, the call will throw an error instance like this: </div> <syntaxhighlight lang="json" highlight="10,12"> { "Z1K1": "Z5", "Z5K1": "Z28248", "Z5K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z885", "Z885K1": "Z28248" }, "Z28248K1": "Q319", "Z28248K2": "P5137", "Z28248K3": "ast" } } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> While the error type label indicates: <code>No matching lexeme for item in language</code>, a better error message should indicate: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">which is the failing item,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">which is the language missing, and</span> * <span lang="en" dir="ltr" class="mw-content-ltr">what are the possible ways to fix it.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The error message <code>Z50K3</code> field can provide this functionality. Whenever an Error Type has an error message for the user language (or any of its fallbacks), the error message shown will be rendered by: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">First, replacing the message parameters with the values of the keys. In our example, any <code>$1</code> will be replaced with the value of <code>Z28248K1</code> ("Q319"), <code>$2</code> with "P5137", and <code>$3</code> with "ast",</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Last, sanitizing and rendering the HTML message.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> So a HTML message like: </div> <syntaxhighlight lang="html"> There is no matching lexeme for the item $1 in "$3".<br> <a href="http://wikidata.org/wiki/$1">Edit in Wikidata</a> </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Will become: </div> : There is no matching lexeme for the item Q319 in "ast" : [[d:Q319|Edit in Wikidata]] <div lang="en" dir="ltr" class="mw-content-ltr"> == Debugging your implementations == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Sometimes things can go wrong. A function might behave differently than expected or a value might not look quite right. Sometimes implementations are really complex and, because they are run in a sandboxed environment, it can seem really difficult to debug. To help understand what's going on inside a function call, Wikifunctions includes a small set of debugging tools. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> These tools don't change the result of a function, but will add extra information to the returned metadata, which you can observe after running the function. You can use <code>Wikifunctions.Debug()</code> from your code implementations or the function {{Z|Z854}} from your compositions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section you will learn: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">How to add debug messages from both code and composition implementations,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to inspect the metadata manually or via the UI to inspect these logs.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Debugging your code implementations === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> When writing code, both from JavaScript and Python3, you can use <code>Wikifunctions.Debug()</code> to add a message to your debugging log and continue the execution. </div> {{phab|T441028}} <div lang="en" dir="ltr" class="mw-content-ltr"> <code>Wikifunctions.Debug()</code> has one parameter, which is generally expected to be a string. However, any other object passed as parameter will get directly converted into a string. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If we want to add debug logs to our code implementations for our "Join two strings with a space" example function, we can do, in JavaScript: </div> <syntaxhighlight lang="JavaScript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { Wikifunctions.Debug( `first input is empty "${ Z30000K1 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { Wikifunctions.Debug( `second input is empty "${ Z30000K2 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } Wikifunctions.Debug( "both inputs are fine" ); return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> And the same in your Python3 implementation will be: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": Wikifunctions.Debug( 'first input is empty "'+Z30000K1+'"' ) Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": Wikifunctions.Debug( 'second input is empty "'+Z30000K2+'"' ) Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) Wikifunctions.Debug( 'both inputs are fine' ) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This way, no matter what happens, we will be adding one message to your debugging logs: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the function call fails when checking on the first or second input, the result of the execution will be a failure, but it will contain one informative log about what branch caused the failure.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the function call succeeds—because both inputs are valid—the function call will return the joined string, but the returned metadata will also contain a debug log.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Debugging your compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> To support debugging compositions, Wikifunctions provides the built-in function {{Z|Z854}}. This function allows you to attach debug messages to the execution of any function call that generates the final output. The debug logs collected during the evaluation are returned as part of the execution metadata, under the <code>executorDebugLogs</code> key. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Add debug log to function call (Z854) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z854}} function is built-in with ZID <code>Z854</code> and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – Any composition you want to execute.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Debug log''' – A string message that will be recorded if the given function call is evaluated.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> When the wrapped function call runs, the provided message is added to the execution logs. If that function call is not executed, or its execution is not part of the final output, its debug log will not appear in the final result metadata. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You will benefit from this built-in if you want to observe: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Which branch of a conditional was executed, or</span> * <span lang="en" dir="ltr" class="mw-content-ltr">the order of evaluation in a composition.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Add debug log to function call ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say that you want to add debug logs to our example function "Join two strings with a space" or <code>Z30000</code>, so that different messages are added to the different possible outcomes. You could use our debugging builtin like this: </div> <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), add_debug_log( throw_error( Z30005, ... ), 'failed on first input' ) if( is_empty_string( Z30000K2 ), add_debug_log( throw_error( Z30005, ... ), 'failed on second input' ), add_debug_log( join_with_separator( Z30000K1, Z30000K2, " " ), 'both inputs are ok!' ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This way, </div> * <span lang="en" dir="ltr" class="mw-content-ltr">when called with an empty first input, the function will return a failed response, and the metadata will contain an <code>executorDebugLogs</code> entry with the "failed on first input" log.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">When called with an empty second input, the call will also fail, but the logged message will be "failed on second input"</span> * <span lang="en" dir="ltr" class="mw-content-ltr">When called with valid inputs, the function will return a successful response, and additionally the metadata will contain "both inputs are ok" in its <code>executorDebugLogs</code> key.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> This is the way this composition would look: </div> [[File:Add debug log expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Composition implementation using Add debug logs to log all possible execution paths</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Composition implementation using Add debug logs to log all possible execution paths</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Accessing execution debug logs === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Whether your execution logs are added via <code>Wikifunctions.Debug()</code> or via the {{Z|Z854}} built-in function, they are returned as part of the response metadata. To see the logs, once you run your function, click on the "Details" button that appears at the bottom of the "Result" section. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The error and debug information will appear at the top of the "Details" dialog. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> This is what you would see when running the composition from our previous example with valid and invalid inputs: </div> {| class="wikitable" | [[File:Execution logs success.png|frameless|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a successful execution with debug logs</span>]] | [[File:Execution logs failure.png|frameless|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a failed execution with debug logs</span>]] |- | <span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a successful execution: shows no errors, but displays the successful execution log: ''"both inputs are ok!"''</span> | <span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a failed execution: shows the error information, and the additional execution log for the first failure branch: ''"failed on first input"''</span> |} [[Category:How to create implementations| {{#translation:}}]] 70qqsnthd3ue5kukfkx2wpqrshptvl9 Wikifunctions:What Wikifunctions is not/sv 4 17423 331069 276880 2026-10-23T08:06:09Z FuzzyBot 207 Updating to match new version of source page 331069 wikitext text/x-wiki <languages/> {{shortcut|[[WF:NOT]]}} {{Draft}} <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions is a new kind of website, aiming for a new community. We very much hope to work together with many tools, sites, communities, and kinds of systems that are out there: we want to play together with IDEs, with cloud computing platforms, with app development sites, and many more. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> But we also aim to be a novel thing and we hope to shape a new unique space out for us: a Wikimedia project for everyone to collaboratively create and maintain a library of code functions to support the Wikimedia projects and beyond, for everyone to call and re-use in the world's natural and programming languages. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The scope of the project is within bounds, though. So, let us also explore '''what Wikifunctions is not'''. </div> <span id="Wikifunctions_is_not_an_encyclopædia_of_algorithms"></span> == Wikifunctions är inte en encyklopedi över algoritmer == <div lang="en" dir="ltr" class="mw-content-ltr"> This means that we will '''not''' concentrate on having pages for famous and not-so famous algorithms such as [[w:Euclidean algorithm|Euclid's]], [[w:Newton's method|Newton's]], or [[w:Dijkstra's algorithm|Dijkstra's algorithm]], aiming to represent all existing algorithms faithfully and in their historical context. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Yes, we expect to have a function for the [[w:Greatest common divisor|greatest common divisor]] (GCD) of two integers. And there might be one or more implementations which are based on Euclid's algorithm to calculate the GCD. But Wikifunctions' main goal is not to gather algorithms, and it would not be incomplete if it didn't include some, and used alternatives instead to compute the GCD. If you are looking for that, many Wikipedias are actually [[w:List of algorithms|great resources]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Unlike an encyclopedic overview of existing algorithms, Wikifunctions will also invite original work. We will not be restricted to functions that have been published elsewhere first, and we do not require for every function and implementation to be based on previously published work. Wikifunctions, much like Wikibooks and very unlike Wikipedia, will be open to novel contributions. The main criteria for implementations will be: under which conditions can we run a given implementation, and what resources is it expected to take? </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not an app development site == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We do not expect to make it possible to create full-fledged, stand-alone apps within Wikifunctions — there will be no place to store state, we don't aim to allow calling external APIs or directly cause changes to other sites, and we don't aim to package up apps with icons and UX, etc. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We absolutely expect Wikifunctions to be a very useful resource for app developers, and can very much imagine apps that are basically wrappers around one or more functions from Wikifunctions, but these would still need code and other assets which wouldn't be part of Wikifunctions. We are not competing in the area of no-code or low-code development sites. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a code hosting service == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions will host code — but not for whole projects, merely for individual functions. There won't be libraries, apps, or services developed on Wikifunctions with bug-trackers, forums, etc. There won't be a Web-based version control system such as ''Mercurial'' or ''Git'' running against Wikifunctions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Again, we hope that there will be libraries, apps, and services that will rely on functions available in Wikifunctions, but they would be developed on a different site, such as ''Gerrit'', ''GitHub'', or ''GitLab''. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a programming language, nor is trying to evangelise a particular language == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions will allow for functions to be implemented in a multitude of programming languages. The possibility to compose functions together to create higher level functions may look a little bit like a new programming language, but it will be extremely limited compared to most other programming languages, since we only allow for nested function calls and that's it. </div> <span id="Wikifunctions_is_not_an_Integrated_Development_Environment_(IDE)"></span> == Wikifunctions är inte en integrerad utvecklingsmiljö (IDE) == <div lang="en" dir="ltr" class="mw-content-ltr"> We won't provide you with an interface for creating and developing software projects, interfacing with build, testing, and source control systems. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a question-and-answer website == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We are not competing with ''Stack Overflow'' and similar websites, where a developer would ask how to achieve a certain task and have community members discuss and answer the question. We won't contain code snippets to help answer the question, but we will organize code within our website to enable the evaluation of functions within a library of functions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a cloud computing platform == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We do not provide computing resources and access to services and APIs so that you can run your computational needs on our platform, either for money or for free. Use of Wikifunctions's evaluation platform is to improve access to knowledge for everyone. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a code snippet website == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We are not competing with code snippet sites such as GitHub Gists, [[w:Rosetta_Code|Rosetta Code]], [https://esolangs.org/ esolangs.org], or [http://helloworldcollection.de/ helloworldcollection.de]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions differs in that it allows running code and composing existing functions together to create new ones. As well, Wikifunctions is for useful and meaningful code, not temporary, arbitrary snippets that other platforms may accept. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a code education platform == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We are not focused on teaching people how to code, the material in Wikifunctions will not be laid out in a pedagogical order, and we also won't make sure to comprehensively cover all topics important for coding. In fact, we aim for Wikifunctions to be usable for people who don't know how to code and who don't need to learn how to code to use most of Wikifunctions effectively. Though the Wikifunctions community may well help each other in sharing best practices, style guides, and tips on how to use the site in different languages, these will be aimed at the purpose of serving the world's knowledge. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not (only) the boiler room for Abstract Wikipedia == </div> [[File:Mechanical_room_in_basement._Wayne_N._Aspinall_Federal_Building_and_U.S._Courthouse,_Grand_Junction,_Colorado_LCCN2014650034.tif|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">A '[[d:Q6804549|boiler room]]', where unsightly-but-vital machinery is hidden</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> Natural language generation (NLG) is the focus of {{SITENAME}} as of 2026, and the site began as part of the wider [[meta:Special:MyLanguage/Abstract_Wikipedia|Abstract Wikipedia project]], but NLG is far from the only field in which functions are being developed. That is to say, WF is necessary for AW, but AW is not necessary for WF. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> On top of the computer science staples of Boolean logic, arithmetic, and list manipulation, we have useful functions relating to disciplines such as [[Z16718|chemistry]], [[Z35550|dimensional analysis]], [[Z20074|electrical engineering]], [[Z22162|genomics]], [[Z10393|information theory]], [[Z26830|meteorology]], [[Z13955|number theory]], [[Z27919|physiology]], [[Z20094|probability]], [[Z24497|quantum mechanics]], [[Z14226|railroad engineering]], [[Z28600|timekeeping/chronometry]], and [[Z26841|trigonometry]]. </div> [[Category:Project concept{{#translation:}}]] nfl6yb5x7xcw6dgk9o8wf0nf8qzc70u Wikifunctions:How to create implementations/ru 4 17562 331121 296944 2026-10-23T08:23:28Z FuzzyBot 207 Updating to match new version of source page 331121 wikitext text/x-wiki <languages/> <div lang="en" dir="ltr" class="mw-content-ltr"> This page provides a more detailed guide to '''creating implementations''', beyond the overview at {{ll|Wikifunctions:Introduction}}. </div> <span id="Types_of_Implementations"></span> == Типы реализаций == <div lang="en" dir="ltr" class="mw-content-ltr"> In Wikifunctions, an '''implementation''' can take one of two main forms: '''code''' or '''composition'''. A code implementation directly expresses the function’s logic in any of the available programming languages (currently, Python3 or JavaScript). It’s most useful when the function’s behavior can’t easily be built from existing Wikifunctions, or when precise control over data processing is needed. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> A composition implementation, on the other hand, defines the function entirely by combining other existing functions, without writing code. Compositions are easier to understand, reuse, and translate into other languages automatically, but they depend on suitable building blocks already being available and often are less performant. In general, start by checking whether your goal can be achieved through composition; if it can’t, or if performance or fine-grained logic matters, choose a code implementation instead. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> There's a third type of implementation: '''built-ins'''. These are run by system-built code, and are not editable. Most likely all pre-defined functions will have a built-in implementation. In such cases, when opening the implementation page, you will see a message stating ''"{{int|wikilambda-implementation-selector-none}}"'' </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Practice Test-Driven Development == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> '''Test-Driven Development''', or '''TDD''', is a way of creating software where you write tests before you write the actual code. Tests are just a way of understanding what your function is supposed to do by listing examples and how they should work. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In Wikifunctions, writing tests first offers significant benefits. If you are working on an implementation, you can run your code against the existing tests to check that it behaves as expected. This makes it easier to catch errors early before even publishing your implementation. Tests are also a powerful way to describe the function you need. By writing tests, '''you clearly communicate the expected behavior''', and the community can step in and help with the implementation, or create alternative implementations. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Imagine you want to implement a Function that combines two strings with a space in between. A basic test for this might look like: </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello", "world" ) => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Once you have defined the basic behavior, it's important to '''think about edge cases'''—situations where the inputs are such that you might need some special behavior. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, what if your first string ends in a space, or your second string starts with a space? Should the function keep all existing spaces and add another one, or should it return a neatly spaced result with just a single space between the words? Depending on your requirements, you should build a test for such a case. For example, a test for this edge case could be either one of these — but not both!: </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> or ... </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Make sure that all possible special cases are covered by your tests, and once you have them, make sure that they are all connected to the Function by selecting them and clicking "Connect". </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Code implementations == </div> [[File:Code implementation.png|thumb|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions code editor initialized with a function template</span>|<span lang="en" dir="ltr" class="mw-content-ltr">When adding a new code implementation, the function template is initialized with the function and argument names</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> When creating an implementation using code, the Wikifunctions UI will set up a code editor with the selected language activated for syntax highlighting and validation. When the function to implement and the programming language are selected, this editor will be set with the correct function template: '''do not remove or edit this'''! Keep your code inside this function signature: if you need auxiliary functions, you can simply declare them inside your top-level function declaration. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Using input types in your code === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions types {{Z|Z6}} and {{Z|Z40}} can be used as if they were native types in both JavaScript and Python3. For example, a String input can be concatenated or a Boolean be directly used in a logical expression. To use other types in your code implementations, you will have to look deeper into the type, figure out if it has a conversion to a native equivalent, and treat it accordingly. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, let's say we want to write some Python code that handles an input of type {{Z|Z20420}}. In the page for this type, let's look at its "type converters to code" and search for a Python one. The converter {{Z|Z20424}} will be applied to our date input before our code, so looking at "native type" we know that our input will be a Python ''dict'' and looking at the implementation we can see the keys we can expect: </div> <syntaxhighlight lang="python3"> return { 'K1': year, 'K2': month, 'K3': day } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> When a type doesn't have a converter, you'll have to access its parts directly using its keys. For example, let's assume that your function <code>Z30000</code> has one input <code>Z30000K1</code> of type {{Z|Z11}}. This type has two keys: <code>Z11K1</code> for the language (itself an object of type {{Z|Z60}}), and <code>Z11K2</code> for the string value. Similarly, the language object has a key <code>Z60K1</code> for the language code. So, to get a string with the language code and the text, you can write: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1 ) { // e.g. "en: some text" return Z30000K1.Z11K1.Z60K1 + ": " + Z30000K1.Z11K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> For a quick reference of the available type conversions visit [[Special:MyLanguage/Wikifunctions:Execution targets#Default type conversion|the default type conversion table]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Returning the right outputs === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Similarly to the way you treat inputs, outputs need to match the type specified in the function definition. Some can be treated as simply as native types, so any string output will be converted into a Wikifunctions {{Z|Z6}} object and any native boolean returned by your implementation will be converted into a Wikifunctions {{Z|Z40}} object. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Those types that have "type converters from code" will apply the appropriate function to the output, in order to build the required type. Following the example of {{Z|Z20420}}, the {{Z|Z20443}} will transform the output from your implementation–a dict with K1, K2 and K3 keys–into its correct ZObject representation. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For types that don't have converters from code, you can carefully build and return the output objects. For example, imagine that our function <code>Z30000</code> takes two string inputs: language code and text, and should return a {{Z|Z11}} object. You can do this in Python by using the <code>ZObject</code> constructor: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): lang_object = ZObject( {"Z1K1": "Z9", "Z9K1": "Z60"}, Z60K1 = Z30000K1 ) return ZObject( {"Z1K1": "Z9", "Z9K1": "Z11"}, Z11K1 = lang_object, Z11K2 = Z30000K2 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Or in JavaScript: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { const langObject = new ZObject( new Map( [ [ "Z60K1", Z30000K1 ] ] ), { "Z1K1": "Z9", "Z9K1": "Z60" } ); const monolingualKeys = new Map( [ [ "Z11K1", langObject ], [ "Z11K2", Z30000K2 ] ] ); return new ZObject( monolingualKeys, { "Z1K1": "Z9", "Z9K1": "Z11" } ); } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> You can learn more about the <code>ZObject</code> class and other useful constructors in {{ll|Wikifunctions:Execution_targets#Custom_and_non-built-in_type_conversion}} </div> {{phab|T392750}}<div lang="en" dir="ltr" class="mw-content-ltr"> As of 2026-05, trying to return a list of lists may fail, so you're not able to implement such functions in code. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Code in Python === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section, we give a concrete example on how to create an implementation in the form of Code in Python. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is Z30000. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The implementation is defined using the ZID of the function. So are the arguments of the function. So in the case of the function Z30000 with its two arguments, the function template should look like this: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> As we described before, we know that the arguments (<code>Z30000K1</code> and <code>Z30000K2</code>) are Strings, so we can treat them as simply as we use native strings in Python. Also, the function should return a String. For our example, we simply return the two arguments concatenated with a space in between: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Since this is Python, do not forget to indent this line. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If you have followed our advice to [[#Practice Test-Driven Development|practice TDD]], you will already have a set of tests that you know should work. If that's the case, while building your implementation you can click on the circular arrow in the Tests panel, and see if your implementation passes all of them. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Remember that the runtime has no state. Don’t assume values for global or static variables. If you have further questions about what you can and cannot do in Python, ask on [[Wikifunctions:Python implementations]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Code in JavaScript === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section, we give a concrete example on how to create an implementation in the form of Code in JavaScript. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is <code>Z30000</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The implementation is defined using the ZID of the function. So are the arguments of the function. So in the case of the function <code>Z30000</code> with its two arguments, the function template should look like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> We know that the arguments (<code>Z30000K1</code> and <code>Z30000K2</code>) are Strings, so we can treat them as native strings in JavaScript. Also, the function should return a String. To complete our function, you can then add a line concatenating the input strings, like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> If you have tests as recommended in the [[#Practice Test-Driven Development|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes all of them. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Remember that the runtime has no state. Don’t assume values for global or static variables. If you have further questions about what you can and cannot do in JavaScript, ask on [[Wikifunctions:JavaScript implementations]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Calling another Wikifunctions function === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> A code implementation can call certain other Wikifunctions functions, receive the output of the call, and use that output in further processing. We refer to such calls as callbacks. At present, due to security and performance concerns, only the following built-in Wikidata fetch and search functions can be called in this way: {{Z|Z6820}}, {{Z|Z6821}}, {{Z|Z6822}}, {{Z|Z6824}}, {{Z|Z6825}}, {{Z|Z6826}}, {{Z|Z6830}}, and {{Z|Z6831}}. This capability is in an initial stage of deployment; we hope to allow calls to a broader range of functions in the future. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Let’s look at a JavaScript implementation containing a callback. This implementation fetches an item from Wikidata, extracts the label of that item in a given language, and returns the label string. The item to fetch is given by argument <code>Z400K1</code>, and the language is given by <code>Z400K2</code>. </div> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const item = Wikifunctions.Call('Z6821', Z400K1); for (const label of item.Z6001K2.Z12K1) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> A callback is made by calling <code>Wikifunctions.Call</code>, as shown in the example. The first argument to <code>Wikifunctions.Call</code> is always the ZID of the function to be called – in this case, {{Z|Z6821}}, which takes a single argument. Following that, the arguments to be passed to that function are listed, separated by commas. Here, that argument, <code>Z400K1</code>, is the same value that was passed to the function <code>Z400</code>. This is a common pattern of argument passing to callbacks, but their arguments can also be built using the <code>ZObject</code> constructor (as explained above), or obtained in other ways. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The value of <code>Z400K1</code> would be an instance of {{Z|Z6091}}, containing the QID of the item to be fetched. Line 2 of the example calls <code>Z6821</code> to fetch that item from Wikidata and assigns the resulting ZObject to the const <code>item</code>. The remaining code iterates over the item’s labels until it finds the one matching the language given by <code>Z400K2</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For the first example above, we have used <code>Z6821</code> for simplicity. However - unless an entire entity is needed by the implementation, it is strongly recommended to use <code>Z6820</code> to retrieve Wikidata items, which can be quite large. Although a call to <code>Z6820</code> is a bit more complex, its parameters allow for fetching selected portions of a Wikidata item, which can greatly improve performance and avoid some errors, by reducing the network bandwidth and processing time that are needed. (<code>Z6820</code> can also be used in place of <code>Z6822</code>, <code>Z6824</code>, <code>Z6825</code>, and <code>Z6826</code>, to get similar bandwidth-reduction benefits.) </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Just below we show how <code>Z6820</code> can be used, in <code>Wikifunctions.Call</code>, to implement the same behavior as above. Note that we use the second argument passed to <code>Z6820</code>, <code>[labelsPart]</code>, to say “Just return the item’s labels”, and we use the third argument, <code>[Z400K2]</code>, to say “Just return labels in the given language”. (This argument would also apply to aliases and descriptions, if they were included in the result.) </div> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const labelsPart = new ZObject( new Map( [ ['Z6030K1', new ZReference('Z6033')] ] ), {Z1K1: 'Z9', Z9K1: 'Z6030'} ); const entities = Wikifunctions.Call( 'Z6820', [Z400K1], [labelsPart], [Z400K2], []); const item = entities.get(Z400K1.Z6091K1); const labels = item.Z6001K2.Z12K1; for (const label of labels) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Other things to note: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Even though code implementations are now able to fetch Wikidata entities, it is recommended that they not be written to return ''entire'' entities. This is because of current limitations on the size of the value returned from a code implementation. To fetch and return an entire large entity, it’s better to call the fetch function from a composition.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Only one callback can execute at a time. For security reasons, it is not possible to use the concurrency features of JavaScript or Python to execute multiple callbacks in parallel.</span> ** <span lang="en" dir="ltr" class="mw-content-ltr">Keep in mind, however, that you can fetch multiple entities at once using Z6820.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">There is currently a 3 MiB limit on the size of Wikidata content that can be returned to a code implementation, by a single callback. The same limit applies to the size of the result returned from a code implementation.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> == Compositions == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section, we give a concrete example on how to create an implementation in the form of a composition. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is <code>Z30000</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> It is usually a good idea to first think about how to combine existing functions in order to create the desired output. Sometimes this might be trivial, and you can just go ahead with composing functions, but in many cases it is worthwhile to note the desired composition down. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, for the given Function, we could use the existing Function {{Z|Z10000}}. That Function takes two strings and makes one string out of them. But we need to add a space in between. So we first concatenate a space to the end of the first string, and then concatenate the second string to the result of that first concatenation. So our composition could be noted down like this: </div> <syntaxhighlight lang="prolog"> join_strings( join_strings( Z30000K1, " " ), Z30000K2 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> There are multiple ways to write a composition: notice that the same thing could be accomplished with: </div> <syntaxhighlight lang="prolog"> join_strings( Z30000K1, join_strings( " ", Z30000K2 ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> An alternative implementation could also use the existing Function {{Z|Z15175}}, so your composition could be: </div> <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> As you can see, there are multiple ways to accomplish this, so take your time and explore the existing functions available in the {{ll|Wikifunctions:Catalogue}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's try to create the second example, <code>join_strings(Z30000K1, join_strings(" ", Z30000K2))</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In order to create this: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›" icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search for the name of the outermost function you want to use, which in this example is "join two strings". Then, select the wanted function from the dropdown list.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">You will see two new fields, one for each of the arguments needed for the selected function.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">For the first argument, we want to select the first input to our function:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and select "Argument reference".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id" you can now select the first string of your function from the dropdown, which contains all available inputs.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">For the second argument, we want to use the result of another call to "join two strings":</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and select "Function call".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function you want to call, which is again "join two strings".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For this inner function call, configure the "first string" by simply typing a white space in the text field, and configure the "second string" as you did for step 6: change it using the "…" button to "Argument reference", and then select the second argument in the dropdown.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Your composition is now complete! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You can expand and collapse the details using the chevron buttons to see how it looks. If you already have Tests as recommended in the [[#Practice Test-Driven Development|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes the tests. Once your composition passes the tests, go ahead and publish it. </div> [[File:Composition implementation expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its expanded view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its expanded view</span>]] [[File:Composition implementation collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its collapsed view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its collapsed view</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions error handling == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As a Wikifunctions function creator, you might want to warn the user calling your function when something goes wrong in the code, or when their inputs do not fit a certain criteria. For example, if your Function expects a string input to contain a name, you might want to check that the name is not empty and, if it is, show an error message that the person using your Function can understand. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For this purpose, you can use <code>Wikifunctions.Error()</code> from your code implementations or the function {{Z|Z851}} from your compositions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section you will learn: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">How to throw errors from both code and composition implementations,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to write tests for error cases, and</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to catch and handle errors thrown by functions that you are using in your compositions.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Throwing errors from code implementations === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> When writing code, both from JavaScript and Python, you can use <code>Wikifunctions.Error()</code> to end the execution with a wanted error. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> <code>Wikifunctions.Error()</code> has two parameters: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Error type: a string containing the ZID of the error type you want to return.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Error arguments: a list of string arguments to build the error.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's go one by one: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Error type ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> An error type is an object that describes a kind of error that could happen in the system. There are a number of built-in error types but you can also build other error types that are more suited to your use case. When using errors, the best idea is to browse through the available error types, which can be explored in [[Special:ListObjectsByType/Z50|this list]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If there are no errors that fit your case, create a new one by going to the create page, and selecting "Error type" in the type selector. Then, set the necessary fields: </div> [[File:Error type.png|thumb|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Error type creation in Wikifunctions</span>|<span lang="en" dir="ltr" class="mw-content-ltr">To create new Error type (Z50), edit the label and add the necessary keys.</span>]] * <span lang="en" dir="ltr" class="mw-content-ltr">'''Label''' – This is the main title of the error, which should contain a short but descriptive message. Set the error label on the right-side box titled "About".</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Keys''' – Keys contain additional information about what caused the error. For example, if an input had the wrong format, you might want to inform the user of what was the input content when raising the error. To use them in your implementations, keys should be strings. To create a key, click on the "[+]" icon below "keys", select "String" under "value type", and add a label that describes it appropriately, for example "current input". Once you have all the necessary keys, you can Publish your error type and keep the ID of the newly created object.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error message''' – Error types can contain a multilingual array of HTML parametrized error messages. The parameter notation is $1, $2, etc., where the digit corresponds to the error type key. For example, when creating an error type with one string key "current input", the error message can use the positional parameter "$1", which will be replaced with the value of the "current input" key at the time of rendering the error. To add HTML messages, click on the "[+]" icon below "html fragments", select a language and input the HTML string.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Error arguments ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Error arguments correspond to the keys of the Error type, and they should provide additional information to understand the error. Error arguments should always be Strings. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Wikifunctions.Error() ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say that you want an error to be thrown when either your first or your second input are empty. You have already created the error type, and the assigned ZID was <code>Z30005</code>. Your error type has two string keys: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Input key: contains the key of the failing input</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Input value: contains the current value of the failing input</span> <div lang="en" dir="ltr" class="mw-content-ltr"> To raise an error in your JavaScript implementation you should do something like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { // If the first input is empty, raise error Z30005 // with two string args: [ first input key, first input value ] Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { // If the second input is empty, raise error Z30005 // with two string args: [ second input key, second input value ] Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> To raise an error in your Python implementation you should do something like this: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": # If the first input is empty, raise error Z30005 # with two string args: [ first input key, first input value ] Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": # If the second input is empty, raise error Z30005 # with two string args: [ first input key, first input value ] Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Remember that calling <code>Wikifunctions.Error()</code> ends the execution! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Throwing errors from compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If you are creating a composition implementation, you can throw an error by calling the special function {{Z|Z851}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Throw Error function (Z851) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z851}} function is similar to the <code>Wikifunctions.Error()</code> method and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – A reference to the Error type you want to raise</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error parameters''' – A list with the arguments to create your Error, which should also be Strings.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Throw Error ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say you want to modify your composition so that it first checks that the arguments are not empty, and raises an error when it finds an empty one. Then, if none of them are empty, it runs the original composition, which is: </div> <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> To do this, you need to create conditional paths, for which you can use the {{Z|Z802}} function. Think of it like this: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the first argument is empty, throw an error for the first argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Else, proceed to check the second argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the second argument is empty, throw an error for the second argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Else, proceed with the success path and return the joint strings with the space separator</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Or in functional pseudo code: </div> <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), throw_error( Z30005, [ "Z30000K1", Z30000K1 ] ), if( is_empty_string( Z30000K2 ), throw_error( Z30005, [ "Z30000K2", Z30000K2 ] ), join_with_separator( Z30000K1, Z30000K2, " " ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's create this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+” button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›” icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the outermost function you want to use, which in this case is "if".</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Check the validity of the first argument:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "condition", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "is empty string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "input", click on the "…" button and select "argument reference"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id", select the first input (e.g. "first string")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse the "condition" function call if you want, by clicking on the down-chevron next to "condition". You should see something like "f(x) is empty string( → first string )"</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Throw error if the condition is true:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "then", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Throw Error"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error type", search and select your error type (you can directly input the error ID if you know it, e.g. Z30005)</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error parameters", add two items by clicking on the "+" button</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For "Item 1" (offending argument key), set its type to "String" and write the argument identifier (e.g. "first input", or "Z30000K1")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For "Item 2" (offending argument value), click on the "…" next to "Item 2" and select "argument reference"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id", select the first input (e.g. "first string")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse the "then" function call if you want, by clicking on the down-chevron next to "then". You should see something like "f(x) Throw Error( Input was the wrong format, Typed list( Object, "first input", → first string ) )"</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Continue to check the second argument if the first was good:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "else", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "if"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Set up "condition" to check the validity of the second argument by following the same process as described in step 5.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Set up "then" to throw an error for the second argument by following the same process as described in step 6.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Finally, set up the success path:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to the nested "else", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the successful function, which in this case can be "join strings with separator"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and set it to "argument reference", then select "first string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and set it to "argument reference", then select "second string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "separator" add a space into the text field</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The resulting function call should look like this: </div> [[File:Throw error expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function</span>]] [[File:Throw error collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function, in its collapsed view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function, in its collapsed view</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Handling errors in compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> While it is useful to allow functions to raise expected errors, it is crucial to be able to handle errors in your compositions in order to safely use these functions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say you want to create a new function "full name of a person" – we will refer to it with the ZID <code>Z30010</code>. This function should return the full name of a person given a first and last names, but if any of the two fields are empty, it should return the text "Unknown" instead. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You could create a composition using our example function "Join two strings with a space" or <code>Z30000</code> to generate the name. If any of the inputs are empty, you know that <code>Z30000</code> will throw an error of type <code>Z30005</code>. Using the function {{Z|Z850}} as a wrapper, you can attempt the join operation and intercept a possible error to simply return "Unknown" whenever it occurs. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Try-Catch function (Z850) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z850}} function is built-in with ZID <code>Z850</code> and takes three arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – The initial function call to run. If nothing goes wrong, the response will be the result of this function call.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – An error type to catch in case it is thrown during the execution of the first function call.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error handler''' – A function call that will be run in case the error specified above is caught during the execution of the initial function call. If that happens, the result of the error handler will be the value returned.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Try-Catch ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Once we have all the functions for our composition, we can craft it like this: </div> <syntaxhighlight lang="prolog"> try_catch( join_with_space( Z30010K1, Z30010K2 ), Z30005, echo( "Unknown" ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This means that: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">The "Join two strings with a space" function will be tried with the two inputs and, if everything goes well, the output of this function will be returned</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If any of the inputs are blank, "Join two strings with a space" with raise an error of type <code>Z30005</code></span> * <span lang="en" dir="ltr" class="mw-content-ltr">Our {{Z|Z850}} will then detect this error and run the {{Z|Z801}} function to return "Unknown"</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's create this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›” icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the outermost function you want to use, which in this case is "Try-Catch".</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Set the main function call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under the field where the "Try-Catch" function is selected, next to the "function call" key, click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the function "join two strings with space"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and select "argument reference", then select the "first name" argument from the dropdown.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and select "argument reference", then select the "second name" argument from the dropdown.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Select the error to catch:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error type", search and select "bad string input" – you can search directly by its ZID <code>Z30005</code></span> # <span lang="en" dir="ltr" class="mw-content-ltr">Set the error handler function call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "error handler", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "echo"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "input" and "type", search and select the type "String"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now, under "input", type "Unknown" in the text field</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The resulting function should look like this: </div> [[File:Try catch expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in expanded mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in expanded mode</span>]] [[File:Try catch collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in collapsed mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in collapsed mode</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Testing your failure use cases === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As we introduced in the above section about [[#Practice Test-Driven Development|practicing TDD]], it's important to test not only the most common paths, but also the possible edge cases. It is equally important to test failure behavior. In this section we will give you the tools necessary to test that your function fails with a given set of inputs, and that the error thrown is the expected one. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> To do that, you will need other two system functions: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Is error type (Z852) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z852}} function is built-in with ZID <code>Z852</code> and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error''' – An {{Z|Z5}} object, which can be thrown by a failing call. An error instance has a type and a value.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – A reference to an {{Z|Z50}} which will be compared to the type of the Error passed as a first argument. If that's the case, the function will return true.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Get error thrown by function call (Z853) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z853}} function is built-in with ZID <code>Z853</code> and takes one argument: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – A function call which can either return a successful value of any type, or throw an error.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> This function returns a {{Z|Z882}} with a {{Z|Z40}} in first place and an {{Z|Z1}} in the second: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the Function call runs successfully and hence does not throw any error, the returned pair will contain False in the first place, and void in the second.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the Function call throws an error, the returned pair will contain True in the first place, and the caught error in the second.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> To use this function in your compositions, you might need to use the additional functions: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">{{Z|Z821}}, and</span> * {{Z|Z822}} <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Testing errors ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say our target function, "Join two strings with a space" or <code>Z30000</code>, throws an error of type <code>Z30005</code> and we want to test this behavior. To do that we need to: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Throw a failing function call</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Get the error using the function {{Z|Z853}}</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Check that the error is the right type with {{Z|Z852}}</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Tests have two fields: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Call''' – A function call that will produce an output with the inputs you want to test. This call will return a value.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Result validation''' – A function call that will validate that the value returned by the call above is the expected one. The first argument of this function call will be automatically assigned to take the return value of the first call.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> For step-by-step instructions on how to create tests, see {{ll|Wikifunctions:Introduction#Create_tests}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In our example, we can structure it like this — but this is not the only way! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The call, which will return an {{Z|Z5}} object: </div> <syntaxhighlight lang="prolog"> error = get_second_element_of_typed_list( get_error_thrown_by( join_strings_by_whitespace( "", "not empty" ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> And the result validation, which will take the {{Z|Z5}} object as its first argument: </div> <syntaxhighlight lang="prolog"> is_error_type( error, Z30005 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's do this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding a test by clicking on the "+" button in the "Tests" table from your Function page. The "call" and "result validation" fields already have some functions pre-set, but to test the errors we will need to change them.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">First, let's set the call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "call", click the "›" chevron button to expand the function call.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", edit the field and search and select the function "Get second element of a typed pair"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Once selected, next to "Typed pair", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Get error thrown by function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "function call", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Join two strings with a space" (or by ZID <code>Z30000</code>)</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now set the inputs so that they cause a failure: at least one of them should be empty.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse your "call" by clicking again on the down-chevron button if you want!</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Next, let's set the result validation:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "result validation", click the "›" chevron button to expand the function call.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", edit the field and search and select the function "Is error type"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now you will only be asked to configure the second argument. Under "error type", search and select your <code>Z30005</code> error type.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">And you are done! You can now click the circular arrow in the "Implementations" box and you should see green checks.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> If everything went right, you can now save your test. It should look like this: </div> [[File:Get error expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in expanded mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in expanded mode</span>]] [[File:Get error collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in collapsed mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in collapsed mode</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Creating actionable error messages === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As described above, Error Types have an optional key <code>Z50K3</code> which contains a multilingual list of HTML strings. When rendering information about an error, the messages stored in the error type can help create a clear, precise, informative, translatable and actionable error message. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For that purpose, error messages can contain parameters like <code>$1</code>, <code>$2</code>, etc., where the digit corresponds to the error type argument and its value in the error instance. These error messages are rendered in Wikifunctions inside the "Details" dialog window after executing a function call. Additionally, these error messages are surfaced in other client interfaces, like Abstract Wikipedia, to provide better guidance to Abstract Content editors. </div> [[File:Wikifunctions actionable error message example in the Details dialog.png|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">The error message is rendered using the HTML message of the error type and the error argument values.</span>]] [[File:Wikifunctions actionable error message example in Abstract Wikipedia.png|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">When available, the HTML error message is rendered in the Abstract Wikipedia preview section.</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> Let's use a real example to understand the benefits of HTML error messages: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The function {{Z|Z37847}} returns the first Lexeme reference given a Wikidata Item reference and a language. When there is no Lexeme for this Item-Language combination, it throws an error of type {{Z|Z28248}}, which has three keys: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K1''' is the input Wikidata item QID</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K2''' is the connecting property, in this case <code>P5137/item for this sense</code></span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K3''' is the language code</span> <div lang="en" dir="ltr" class="mw-content-ltr"> When calling this function for a Wikidata lexeme that doesn't exist, the call will throw an error instance like this: </div> <syntaxhighlight lang="json" highlight="10,12"> { "Z1K1": "Z5", "Z5K1": "Z28248", "Z5K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z885", "Z885K1": "Z28248" }, "Z28248K1": "Q319", "Z28248K2": "P5137", "Z28248K3": "ast" } } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> While the error type label indicates: <code>No matching lexeme for item in language</code>, a better error message should indicate: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">which is the failing item,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">which is the language missing, and</span> * <span lang="en" dir="ltr" class="mw-content-ltr">what are the possible ways to fix it.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The error message <code>Z50K3</code> field can provide this functionality. Whenever an Error Type has an error message for the user language (or any of its fallbacks), the error message shown will be rendered by: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">First, replacing the message parameters with the values of the keys. In our example, any <code>$1</code> will be replaced with the value of <code>Z28248K1</code> ("Q319"), <code>$2</code> with "P5137", and <code>$3</code> with "ast",</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Last, sanitizing and rendering the HTML message.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> So a HTML message like: </div> <syntaxhighlight lang="html"> There is no matching lexeme for the item $1 in "$3".<br> <a href="http://wikidata.org/wiki/$1">Edit in Wikidata</a> </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Will become: </div> : There is no matching lexeme for the item Q319 in "ast" : [[d:Q319|Edit in Wikidata]] <div lang="en" dir="ltr" class="mw-content-ltr"> == Debugging your implementations == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Sometimes things can go wrong. A function might behave differently than expected or a value might not look quite right. Sometimes implementations are really complex and, because they are run in a sandboxed environment, it can seem really difficult to debug. To help understand what's going on inside a function call, Wikifunctions includes a small set of debugging tools. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> These tools don't change the result of a function, but will add extra information to the returned metadata, which you can observe after running the function. You can use <code>Wikifunctions.Debug()</code> from your code implementations or the function {{Z|Z854}} from your compositions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section you will learn: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">How to add debug messages from both code and composition implementations,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to inspect the metadata manually or via the UI to inspect these logs.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Debugging your code implementations === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> When writing code, both from JavaScript and Python3, you can use <code>Wikifunctions.Debug()</code> to add a message to your debugging log and continue the execution. </div> {{phab|T441028}} <div lang="en" dir="ltr" class="mw-content-ltr"> <code>Wikifunctions.Debug()</code> has one parameter, which is generally expected to be a string. However, any other object passed as parameter will get directly converted into a string. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If we want to add debug logs to our code implementations for our "Join two strings with a space" example function, we can do, in JavaScript: </div> <syntaxhighlight lang="JavaScript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { Wikifunctions.Debug( `first input is empty "${ Z30000K1 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { Wikifunctions.Debug( `second input is empty "${ Z30000K2 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } Wikifunctions.Debug( "both inputs are fine" ); return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> And the same in your Python3 implementation will be: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": Wikifunctions.Debug( 'first input is empty "'+Z30000K1+'"' ) Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": Wikifunctions.Debug( 'second input is empty "'+Z30000K2+'"' ) Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) Wikifunctions.Debug( 'both inputs are fine' ) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This way, no matter what happens, we will be adding one message to your debugging logs: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the function call fails when checking on the first or second input, the result of the execution will be a failure, but it will contain one informative log about what branch caused the failure.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the function call succeeds—because both inputs are valid—the function call will return the joined string, but the returned metadata will also contain a debug log.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Debugging your compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> To support debugging compositions, Wikifunctions provides the built-in function {{Z|Z854}}. This function allows you to attach debug messages to the execution of any function call that generates the final output. The debug logs collected during the evaluation are returned as part of the execution metadata, under the <code>executorDebugLogs</code> key. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Add debug log to function call (Z854) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z854}} function is built-in with ZID <code>Z854</code> and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – Any composition you want to execute.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Debug log''' – A string message that will be recorded if the given function call is evaluated.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> When the wrapped function call runs, the provided message is added to the execution logs. If that function call is not executed, or its execution is not part of the final output, its debug log will not appear in the final result metadata. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You will benefit from this built-in if you want to observe: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Which branch of a conditional was executed, or</span> * <span lang="en" dir="ltr" class="mw-content-ltr">the order of evaluation in a composition.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Add debug log to function call ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say that you want to add debug logs to our example function "Join two strings with a space" or <code>Z30000</code>, so that different messages are added to the different possible outcomes. You could use our debugging builtin like this: </div> <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), add_debug_log( throw_error( Z30005, ... ), 'failed on first input' ) if( is_empty_string( Z30000K2 ), add_debug_log( throw_error( Z30005, ... ), 'failed on second input' ), add_debug_log( join_with_separator( Z30000K1, Z30000K2, " " ), 'both inputs are ok!' ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This way, </div> * <span lang="en" dir="ltr" class="mw-content-ltr">when called with an empty first input, the function will return a failed response, and the metadata will contain an <code>executorDebugLogs</code> entry with the "failed on first input" log.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">When called with an empty second input, the call will also fail, but the logged message will be "failed on second input"</span> * <span lang="en" dir="ltr" class="mw-content-ltr">When called with valid inputs, the function will return a successful response, and additionally the metadata will contain "both inputs are ok" in its <code>executorDebugLogs</code> key.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> This is the way this composition would look: </div> [[File:Add debug log expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Composition implementation using Add debug logs to log all possible execution paths</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Composition implementation using Add debug logs to log all possible execution paths</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Accessing execution debug logs === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Whether your execution logs are added via <code>Wikifunctions.Debug()</code> or via the {{Z|Z854}} built-in function, they are returned as part of the response metadata. To see the logs, once you run your function, click on the "Details" button that appears at the bottom of the "Result" section. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The error and debug information will appear at the top of the "Details" dialog. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> This is what you would see when running the composition from our previous example with valid and invalid inputs: </div> {| class="wikitable" | [[File:Execution logs success.png|frameless|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a successful execution with debug logs</span>]] | [[File:Execution logs failure.png|frameless|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a failed execution with debug logs</span>]] |- | <span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a successful execution: shows no errors, but displays the successful execution log: ''"both inputs are ok!"''</span> | <span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a failed execution: shows the error information, and the additional execution log for the first failure branch: ''"failed on first input"''</span> |} [[Category:How to create implementations| {{#translation:}}]] noy1l8kmen4lnbzyxqvoulhbw8d2my4 Wikifunctions:What Wikifunctions is not/ru 4 19987 331070 276901 2026-10-23T08:06:09Z FuzzyBot 207 Updating to match new version of source page 331070 wikitext text/x-wiki <languages/> {{shortcut|[[WF:NOT]]}} {{Draft}} Викифункции — это, как мы бы сказали, новый тип сайта, направленный на создание нового комьюнити. Мы очень надеемся работать сообща с множеством существующих инструментов, сайтов, сообществ и систем: так, мы хотели бы играть на одном поле с интегрированными средами разработки (Integrated Development Environment, IDE), платформами облачных вычислений, сайтами для разработки приложений и многими другими ресурами. Но мы также стремимся быть чем-то новым и надеемся сформировать новое уникальное пространство: проект Викимедиа, где каждый может совместно создавать и поддерживать библиотеку компьютерных функций для поддержки проектов Фонда Викимедиа и не только, где каждый может вызывать и повторно использовать функции в естественных языках мира и языках программирования. <div class="mw-translate-fuzzy"> Итак, без лишних слов, давайте рассмотрим, '''чем не являются Викифункции'''. </div> <span id="Wikifunctions_is_not_an_encyclopædia_of_algorithms"></span> == Викифункции не энциклопедия, посвящённая алгоритмам == <div lang="en" dir="ltr" class="mw-content-ltr"> This means that we will '''not''' concentrate on having pages for famous and not-so famous algorithms such as [[w:Euclidean algorithm|Euclid's]], [[w:Newton's method|Newton's]], or [[w:Dijkstra's algorithm|Dijkstra's algorithm]], aiming to represent all existing algorithms faithfully and in their historical context. </div> Да, мы ожидаем, что будет функция для [[w:ru:Наибольший общий делитель|наибольшего общего делителя]] (НОД) двух целых чисел. И может быть одна или несколько реализаций, основанных на алгоритме Евклида для вычисления НОД. Но главная цель Wikifunctions — не сбор алгоритмов, и она не будет неполной, если в ней не будут представлены какие‑то из них, а вместо этого будут использоваться альтернативные способы вычисления НОД. Если вы ищете именно это, многие разделы Википедии на самом деле являются [[w:List of algorithms|отличными ресурсами]]. В отличие от энциклопедического обзора существующих алгоритмов, Викифункции также также приглашают делать оригинальную работу. Мы не будем ограничиваться функциями, которые были опубликованы в первую очередь в других местах, и мы не требуем, чтобы каждая функция и реализация были основаны на ранее опубликованной работе. Викифункции, как и Викиучебник и в отличие от Википедии, будут открыты для нового вклада. Основными критериями реализации будут следующие: при каких условиях можно выполнить данную реализацию и какие ресурсы она должна использовать? <span id="Wikifunctions_is_not_an_app_development_site"></span> == Викифункции не сайт для разработки приложений == Мы не ожидаем, что сможем создавать полноценные автономные приложения в рамках Викифункций - там не будет места для хранения состояния, мы не стремимся разрешать вызов внешних API или напрямую вносить изменения на другие сайты, и мы не стремимся упаковывать приложения с иконками и UX и т.д. <div lang="en" dir="ltr" class="mw-content-ltr"> We absolutely expect Wikifunctions to be a very useful resource for app developers, and can very much imagine apps that are basically wrappers around one or more functions from Wikifunctions, but these would still need code and other assets which wouldn't be part of Wikifunctions. We are not competing in the area of no-code or low-code development sites. </div> <span id="Wikifunctions_is_not_a_code_hosting_service"></span> == Викифункции не хостинг для программных кодов == <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions will host code — but not for whole projects, merely for individual functions. There won't be libraries, apps, or services developed on Wikifunctions with bug-trackers, forums, etc. There won't be a Web-based version control system such as ''Mercurial'' or ''Git'' running against Wikifunctions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Again, we hope that there will be libraries, apps, and services that will rely on functions available in Wikifunctions, but they would be developed on a different site, such as ''Gerrit'', ''GitHub'', or ''GitLab''. </div> <span id="Wikifunctions_is_not_a_programming_language,_nor_is_trying_to_evangelise_a_particular_language"></span> == Викифункции не являются языком программирования и не пытаются популяризировать какой-либо конкретный язык == <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions will allow for functions to be implemented in a multitude of programming languages. The possibility to compose functions together to create higher level functions may look a little bit like a new programming language, but it will be extremely limited compared to most other programming languages, since we only allow for nested function calls and that's it. </div> <span id="Wikifunctions_is_not_an_Integrated_Development_Environment_(IDE)"></span> == Викифункции не относятся к интегрированным средам разработки (Integrated Development Environment) == <div lang="en" dir="ltr" class="mw-content-ltr"> We won't provide you with an interface for creating and developing software projects, interfacing with build, testing, and source control systems. </div> <span id="Wikifunctions_is_not_a_question-and-answer_website"></span> == Викифункции не сайт вопросов и ответов == <div lang="en" dir="ltr" class="mw-content-ltr"> We are not competing with ''Stack Overflow'' and similar websites, where a developer would ask how to achieve a certain task and have community members discuss and answer the question. We won't contain code snippets to help answer the question, but we will organize code within our website to enable the evaluation of functions within a library of functions. </div> <span id="Wikifunctions_is_not_a_cloud_computing_platform"></span> == Викифункции не платформа облачных вычислений == <div lang="en" dir="ltr" class="mw-content-ltr"> We do not provide computing resources and access to services and APIs so that you can run your computational needs on our platform, either for money or for free. Use of Wikifunctions's evaluation platform is to improve access to knowledge for everyone. </div> <span id="Wikifunctions_is_not_a_code_snippet_website"></span> == Викифункции не каталог сниппетов (фрагментов кода) == <div lang="en" dir="ltr" class="mw-content-ltr"> We are not competing with code snippet sites such as GitHub Gists, [[w:Rosetta_Code|Rosetta Code]], [https://esolangs.org/ esolangs.org], or [http://helloworldcollection.de/ helloworldcollection.de]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions differs in that it allows running code and composing existing functions together to create new ones. As well, Wikifunctions is for useful and meaningful code, not temporary, arbitrary snippets that other platforms may accept. </div> <span id="Wikifunctions_is_not_a_code_education_platform"></span> == Викифункции не платформа для обучения программированию == <div lang="en" dir="ltr" class="mw-content-ltr"> We are not focused on teaching people how to code, the material in Wikifunctions will not be laid out in a pedagogical order, and we also won't make sure to comprehensively cover all topics important for coding. In fact, we aim for Wikifunctions to be usable for people who don't know how to code and who don't need to learn how to code to use most of Wikifunctions effectively. Though the Wikifunctions community may well help each other in sharing best practices, style guides, and tips on how to use the site in different languages, these will be aimed at the purpose of serving the world's knowledge. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not (only) the boiler room for Abstract Wikipedia == </div> [[File:Mechanical_room_in_basement._Wayne_N._Aspinall_Federal_Building_and_U.S._Courthouse,_Grand_Junction,_Colorado_LCCN2014650034.tif|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">A '[[d:Q6804549|boiler room]]', where unsightly-but-vital machinery is hidden</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> Natural language generation (NLG) is the focus of {{SITENAME}} as of 2026, and the site began as part of the wider [[meta:Special:MyLanguage/Abstract_Wikipedia|Abstract Wikipedia project]], but NLG is far from the only field in which functions are being developed. That is to say, WF is necessary for AW, but AW is not necessary for WF. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> On top of the computer science staples of Boolean logic, arithmetic, and list manipulation, we have useful functions relating to disciplines such as [[Z16718|chemistry]], [[Z35550|dimensional analysis]], [[Z20074|electrical engineering]], [[Z22162|genomics]], [[Z10393|information theory]], [[Z26830|meteorology]], [[Z13955|number theory]], [[Z27919|physiology]], [[Z20094|probability]], [[Z24497|quantum mechanics]], [[Z14226|railroad engineering]], [[Z28600|timekeeping/chronometry]], and [[Z26841|trigonometry]]. </div> [[Category:Project concept{{#translation:}}]] 24v0zpord9jr6p7wn991g5lx4auh3yo Wikifunctions:How to create implementations/pl 4 20044 331120 296943 2026-10-23T08:23:26Z FuzzyBot 207 Updating to match new version of source page 331120 wikitext text/x-wiki <languages/> <div lang="en" dir="ltr" class="mw-content-ltr"> This page provides a more detailed guide to '''creating implementations''', beyond the overview at {{ll|Wikifunctions:Introduction}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Types of Implementations == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In Wikifunctions, an '''implementation''' can take one of two main forms: '''code''' or '''composition'''. A code implementation directly expresses the function’s logic in any of the available programming languages (currently, Python3 or JavaScript). It’s most useful when the function’s behavior can’t easily be built from existing Wikifunctions, or when precise control over data processing is needed. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> A composition implementation, on the other hand, defines the function entirely by combining other existing functions, without writing code. Compositions are easier to understand, reuse, and translate into other languages automatically, but they depend on suitable building blocks already being available and often are less performant. In general, start by checking whether your goal can be achieved through composition; if it can’t, or if performance or fine-grained logic matters, choose a code implementation instead. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> There's a third type of implementation: '''built-ins'''. These are run by system-built code, and are not editable. Most likely all pre-defined functions will have a built-in implementation. In such cases, when opening the implementation page, you will see a message stating ''"{{int|wikilambda-implementation-selector-none}}"'' </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Practice Test-Driven Development == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> '''Test-Driven Development''', or '''TDD''', is a way of creating software where you write tests before you write the actual code. Tests are just a way of understanding what your function is supposed to do by listing examples and how they should work. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In Wikifunctions, writing tests first offers significant benefits. If you are working on an implementation, you can run your code against the existing tests to check that it behaves as expected. This makes it easier to catch errors early before even publishing your implementation. Tests are also a powerful way to describe the function you need. By writing tests, '''you clearly communicate the expected behavior''', and the community can step in and help with the implementation, or create alternative implementations. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Imagine you want to implement a Function that combines two strings with a space in between. A basic test for this might look like: </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello", "world" ) => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Once you have defined the basic behavior, it's important to '''think about edge cases'''—situations where the inputs are such that you might need some special behavior. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, what if your first string ends in a space, or your second string starts with a space? Should the function keep all existing spaces and add another one, or should it return a neatly spaced result with just a single space between the words? Depending on your requirements, you should build a test for such a case. For example, a test for this edge case could be either one of these — but not both!: </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> lub ... <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Make sure that all possible special cases are covered by your tests, and once you have them, make sure that they are all connected to the Function by selecting them and clicking "Connect". </div> <span id="Code_implementations"></span> == Implementacje kodu == [[File:Code implementation.png|thumb|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions code editor initialized with a function template</span>|<span lang="en" dir="ltr" class="mw-content-ltr">When adding a new code implementation, the function template is initialized with the function and argument names</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> When creating an implementation using code, the Wikifunctions UI will set up a code editor with the selected language activated for syntax highlighting and validation. When the function to implement and the programming language are selected, this editor will be set with the correct function template: '''do not remove or edit this'''! Keep your code inside this function signature: if you need auxiliary functions, you can simply declare them inside your top-level function declaration. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Using input types in your code === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions types {{Z|Z6}} and {{Z|Z40}} can be used as if they were native types in both JavaScript and Python3. For example, a String input can be concatenated or a Boolean be directly used in a logical expression. To use other types in your code implementations, you will have to look deeper into the type, figure out if it has a conversion to a native equivalent, and treat it accordingly. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, let's say we want to write some Python code that handles an input of type {{Z|Z20420}}. In the page for this type, let's look at its "type converters to code" and search for a Python one. The converter {{Z|Z20424}} will be applied to our date input before our code, so looking at "native type" we know that our input will be a Python ''dict'' and looking at the implementation we can see the keys we can expect: </div> <syntaxhighlight lang="python3"> return { 'K1': year, 'K2': month, 'K3': day } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> When a type doesn't have a converter, you'll have to access its parts directly using its keys. For example, let's assume that your function <code>Z30000</code> has one input <code>Z30000K1</code> of type {{Z|Z11}}. This type has two keys: <code>Z11K1</code> for the language (itself an object of type {{Z|Z60}}), and <code>Z11K2</code> for the string value. Similarly, the language object has a key <code>Z60K1</code> for the language code. So, to get a string with the language code and the text, you can write: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1 ) { // e.g. "en: some text" return Z30000K1.Z11K1.Z60K1 + ": " + Z30000K1.Z11K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> For a quick reference of the available type conversions visit [[Special:MyLanguage/Wikifunctions:Execution targets#Default type conversion|the default type conversion table]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Returning the right outputs === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Similarly to the way you treat inputs, outputs need to match the type specified in the function definition. Some can be treated as simply as native types, so any string output will be converted into a Wikifunctions {{Z|Z6}} object and any native boolean returned by your implementation will be converted into a Wikifunctions {{Z|Z40}} object. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Those types that have "type converters from code" will apply the appropriate function to the output, in order to build the required type. Following the example of {{Z|Z20420}}, the {{Z|Z20443}} will transform the output from your implementation–a dict with K1, K2 and K3 keys–into its correct ZObject representation. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For types that don't have converters from code, you can carefully build and return the output objects. For example, imagine that our function <code>Z30000</code> takes two string inputs: language code and text, and should return a {{Z|Z11}} object. You can do this in Python by using the <code>ZObject</code> constructor: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): lang_object = ZObject( {"Z1K1": "Z9", "Z9K1": "Z60"}, Z60K1 = Z30000K1 ) return ZObject( {"Z1K1": "Z9", "Z9K1": "Z11"}, Z11K1 = lang_object, Z11K2 = Z30000K2 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Or in JavaScript: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { const langObject = new ZObject( new Map( [ [ "Z60K1", Z30000K1 ] ] ), { "Z1K1": "Z9", "Z9K1": "Z60" } ); const monolingualKeys = new Map( [ [ "Z11K1", langObject ], [ "Z11K2", Z30000K2 ] ] ); return new ZObject( monolingualKeys, { "Z1K1": "Z9", "Z9K1": "Z11" } ); } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> You can learn more about the <code>ZObject</code> class and other useful constructors in {{ll|Wikifunctions:Execution_targets#Custom_and_non-built-in_type_conversion}} </div> {{phab|T392750}}<div lang="en" dir="ltr" class="mw-content-ltr"> As of 2026-05, trying to return a list of lists may fail, so you're not able to implement such functions in code. </div> <span id="Code_in_Python"></span> === Kod w Pythonie === <div lang="en" dir="ltr" class="mw-content-ltr"> In this section, we give a concrete example on how to create an implementation in the form of Code in Python. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is Z30000. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The implementation is defined using the ZID of the function. So are the arguments of the function. So in the case of the function Z30000 with its two arguments, the function template should look like this: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> As we described before, we know that the arguments (<code>Z30000K1</code> and <code>Z30000K2</code>) are Strings, so we can treat them as simply as we use native strings in Python. Also, the function should return a String. For our example, we simply return the two arguments concatenated with a space in between: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): return Z30000K1 + " " + Z30000K2 </syntaxhighlight> Ponieważ to Python, nie zapomnij o wcięciu tej linii. <div lang="en" dir="ltr" class="mw-content-ltr"> If you have followed our advice to [[#Practice Test-Driven Development|practice TDD]], you will already have a set of tests that you know should work. If that's the case, while building your implementation you can click on the circular arrow in the Tests panel, and see if your implementation passes all of them. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Remember that the runtime has no state. Don’t assume values for global or static variables. If you have further questions about what you can and cannot do in Python, ask on [[Wikifunctions:Python implementations]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Code in JavaScript === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section, we give a concrete example on how to create an implementation in the form of Code in JavaScript. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is <code>Z30000</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The implementation is defined using the ZID of the function. So are the arguments of the function. So in the case of the function <code>Z30000</code> with its two arguments, the function template should look like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> We know that the arguments (<code>Z30000K1</code> and <code>Z30000K2</code>) are Strings, so we can treat them as native strings in JavaScript. Also, the function should return a String. To complete our function, you can then add a line concatenating the input strings, like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> If you have tests as recommended in the [[#Practice Test-Driven Development|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes all of them. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Remember that the runtime has no state. Don’t assume values for global or static variables. If you have further questions about what you can and cannot do in JavaScript, ask on [[Wikifunctions:JavaScript implementations]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Calling another Wikifunctions function === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> A code implementation can call certain other Wikifunctions functions, receive the output of the call, and use that output in further processing. We refer to such calls as callbacks. At present, due to security and performance concerns, only the following built-in Wikidata fetch and search functions can be called in this way: {{Z|Z6820}}, {{Z|Z6821}}, {{Z|Z6822}}, {{Z|Z6824}}, {{Z|Z6825}}, {{Z|Z6826}}, {{Z|Z6830}}, and {{Z|Z6831}}. This capability is in an initial stage of deployment; we hope to allow calls to a broader range of functions in the future. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Let’s look at a JavaScript implementation containing a callback. This implementation fetches an item from Wikidata, extracts the label of that item in a given language, and returns the label string. The item to fetch is given by argument <code>Z400K1</code>, and the language is given by <code>Z400K2</code>. </div> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const item = Wikifunctions.Call('Z6821', Z400K1); for (const label of item.Z6001K2.Z12K1) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> A callback is made by calling <code>Wikifunctions.Call</code>, as shown in the example. The first argument to <code>Wikifunctions.Call</code> is always the ZID of the function to be called – in this case, {{Z|Z6821}}, which takes a single argument. Following that, the arguments to be passed to that function are listed, separated by commas. Here, that argument, <code>Z400K1</code>, is the same value that was passed to the function <code>Z400</code>. This is a common pattern of argument passing to callbacks, but their arguments can also be built using the <code>ZObject</code> constructor (as explained above), or obtained in other ways. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The value of <code>Z400K1</code> would be an instance of {{Z|Z6091}}, containing the QID of the item to be fetched. Line 2 of the example calls <code>Z6821</code> to fetch that item from Wikidata and assigns the resulting ZObject to the const <code>item</code>. The remaining code iterates over the item’s labels until it finds the one matching the language given by <code>Z400K2</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For the first example above, we have used <code>Z6821</code> for simplicity. However - unless an entire entity is needed by the implementation, it is strongly recommended to use <code>Z6820</code> to retrieve Wikidata items, which can be quite large. Although a call to <code>Z6820</code> is a bit more complex, its parameters allow for fetching selected portions of a Wikidata item, which can greatly improve performance and avoid some errors, by reducing the network bandwidth and processing time that are needed. (<code>Z6820</code> can also be used in place of <code>Z6822</code>, <code>Z6824</code>, <code>Z6825</code>, and <code>Z6826</code>, to get similar bandwidth-reduction benefits.) </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Just below we show how <code>Z6820</code> can be used, in <code>Wikifunctions.Call</code>, to implement the same behavior as above. Note that we use the second argument passed to <code>Z6820</code>, <code>[labelsPart]</code>, to say “Just return the item’s labels”, and we use the third argument, <code>[Z400K2]</code>, to say “Just return labels in the given language”. (This argument would also apply to aliases and descriptions, if they were included in the result.) </div> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const labelsPart = new ZObject( new Map( [ ['Z6030K1', new ZReference('Z6033')] ] ), {Z1K1: 'Z9', Z9K1: 'Z6030'} ); const entities = Wikifunctions.Call( 'Z6820', [Z400K1], [labelsPart], [Z400K2], []); const item = entities.get(Z400K1.Z6091K1); const labels = item.Z6001K2.Z12K1; for (const label of labels) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Other things to note: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Even though code implementations are now able to fetch Wikidata entities, it is recommended that they not be written to return ''entire'' entities. This is because of current limitations on the size of the value returned from a code implementation. To fetch and return an entire large entity, it’s better to call the fetch function from a composition.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Only one callback can execute at a time. For security reasons, it is not possible to use the concurrency features of JavaScript or Python to execute multiple callbacks in parallel.</span> ** <span lang="en" dir="ltr" class="mw-content-ltr">Keep in mind, however, that you can fetch multiple entities at once using Z6820.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">There is currently a 3 MiB limit on the size of Wikidata content that can be returned to a code implementation, by a single callback. The same limit applies to the size of the result returned from a code implementation.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> == Compositions == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section, we give a concrete example on how to create an implementation in the form of a composition. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is <code>Z30000</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> It is usually a good idea to first think about how to combine existing functions in order to create the desired output. Sometimes this might be trivial, and you can just go ahead with composing functions, but in many cases it is worthwhile to note the desired composition down. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, for the given Function, we could use the existing Function {{Z|Z10000}}. That Function takes two strings and makes one string out of them. But we need to add a space in between. So we first concatenate a space to the end of the first string, and then concatenate the second string to the result of that first concatenation. So our composition could be noted down like this: </div> <syntaxhighlight lang="prolog"> join_strings( join_strings( Z30000K1, " " ), Z30000K2 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> There are multiple ways to write a composition: notice that the same thing could be accomplished with: </div> <syntaxhighlight lang="prolog"> join_strings( Z30000K1, join_strings( " ", Z30000K2 ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> An alternative implementation could also use the existing Function {{Z|Z15175}}, so your composition could be: </div> <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> As you can see, there are multiple ways to accomplish this, so take your time and explore the existing functions available in the {{ll|Wikifunctions:Catalogue}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's try to create the second example, <code>join_strings(Z30000K1, join_strings(" ", Z30000K2))</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In order to create this: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›" icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search for the name of the outermost function you want to use, which in this example is "join two strings". Then, select the wanted function from the dropdown list.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">You will see two new fields, one for each of the arguments needed for the selected function.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">For the first argument, we want to select the first input to our function:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and select "Argument reference".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id" you can now select the first string of your function from the dropdown, which contains all available inputs.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">For the second argument, we want to use the result of another call to "join two strings":</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and select "Function call".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function you want to call, which is again "join two strings".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For this inner function call, configure the "first string" by simply typing a white space in the text field, and configure the "second string" as you did for step 6: change it using the "…" button to "Argument reference", and then select the second argument in the dropdown.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Your composition is now complete! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You can expand and collapse the details using the chevron buttons to see how it looks. If you already have Tests as recommended in the [[#Practice Test-Driven Development|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes the tests. Once your composition passes the tests, go ahead and publish it. </div> [[File:Composition implementation expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its expanded view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its expanded view</span>]] [[File:Composition implementation collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its collapsed view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its collapsed view</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions error handling == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As a Wikifunctions function creator, you might want to warn the user calling your function when something goes wrong in the code, or when their inputs do not fit a certain criteria. For example, if your Function expects a string input to contain a name, you might want to check that the name is not empty and, if it is, show an error message that the person using your Function can understand. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For this purpose, you can use <code>Wikifunctions.Error()</code> from your code implementations or the function {{Z|Z851}} from your compositions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section you will learn: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">How to throw errors from both code and composition implementations,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to write tests for error cases, and</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to catch and handle errors thrown by functions that you are using in your compositions.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Throwing errors from code implementations === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> When writing code, both from JavaScript and Python, you can use <code>Wikifunctions.Error()</code> to end the execution with a wanted error. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> <code>Wikifunctions.Error()</code> has two parameters: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Error type: a string containing the ZID of the error type you want to return.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Error arguments: a list of string arguments to build the error.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's go one by one: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Error type ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> An error type is an object that describes a kind of error that could happen in the system. There are a number of built-in error types but you can also build other error types that are more suited to your use case. When using errors, the best idea is to browse through the available error types, which can be explored in [[Special:ListObjectsByType/Z50|this list]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If there are no errors that fit your case, create a new one by going to the create page, and selecting "Error type" in the type selector. Then, set the necessary fields: </div> [[File:Error type.png|thumb|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Error type creation in Wikifunctions</span>|<span lang="en" dir="ltr" class="mw-content-ltr">To create new Error type (Z50), edit the label and add the necessary keys.</span>]] * <span lang="en" dir="ltr" class="mw-content-ltr">'''Label''' – This is the main title of the error, which should contain a short but descriptive message. Set the error label on the right-side box titled "About".</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Keys''' – Keys contain additional information about what caused the error. For example, if an input had the wrong format, you might want to inform the user of what was the input content when raising the error. To use them in your implementations, keys should be strings. To create a key, click on the "[+]" icon below "keys", select "String" under "value type", and add a label that describes it appropriately, for example "current input". Once you have all the necessary keys, you can Publish your error type and keep the ID of the newly created object.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error message''' – Error types can contain a multilingual array of HTML parametrized error messages. The parameter notation is $1, $2, etc., where the digit corresponds to the error type key. For example, when creating an error type with one string key "current input", the error message can use the positional parameter "$1", which will be replaced with the value of the "current input" key at the time of rendering the error. To add HTML messages, click on the "[+]" icon below "html fragments", select a language and input the HTML string.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Error arguments ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Error arguments correspond to the keys of the Error type, and they should provide additional information to understand the error. Error arguments should always be Strings. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Wikifunctions.Error() ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say that you want an error to be thrown when either your first or your second input are empty. You have already created the error type, and the assigned ZID was <code>Z30005</code>. Your error type has two string keys: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Input key: contains the key of the failing input</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Input value: contains the current value of the failing input</span> <div lang="en" dir="ltr" class="mw-content-ltr"> To raise an error in your JavaScript implementation you should do something like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { // If the first input is empty, raise error Z30005 // with two string args: [ first input key, first input value ] Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { // If the second input is empty, raise error Z30005 // with two string args: [ second input key, second input value ] Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> To raise an error in your Python implementation you should do something like this: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": # If the first input is empty, raise error Z30005 # with two string args: [ first input key, first input value ] Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": # If the second input is empty, raise error Z30005 # with two string args: [ first input key, first input value ] Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Remember that calling <code>Wikifunctions.Error()</code> ends the execution! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Throwing errors from compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If you are creating a composition implementation, you can throw an error by calling the special function {{Z|Z851}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Throw Error function (Z851) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z851}} function is similar to the <code>Wikifunctions.Error()</code> method and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – A reference to the Error type you want to raise</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error parameters''' – A list with the arguments to create your Error, which should also be Strings.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Throw Error ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say you want to modify your composition so that it first checks that the arguments are not empty, and raises an error when it finds an empty one. Then, if none of them are empty, it runs the original composition, which is: </div> <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> To do this, you need to create conditional paths, for which you can use the {{Z|Z802}} function. Think of it like this: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the first argument is empty, throw an error for the first argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Else, proceed to check the second argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the second argument is empty, throw an error for the second argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Else, proceed with the success path and return the joint strings with the space separator</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Or in functional pseudo code: </div> <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), throw_error( Z30005, [ "Z30000K1", Z30000K1 ] ), if( is_empty_string( Z30000K2 ), throw_error( Z30005, [ "Z30000K2", Z30000K2 ] ), join_with_separator( Z30000K1, Z30000K2, " " ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's create this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+” button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›” icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the outermost function you want to use, which in this case is "if".</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Check the validity of the first argument:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "condition", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "is empty string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "input", click on the "…" button and select "argument reference"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id", select the first input (e.g. "first string")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse the "condition" function call if you want, by clicking on the down-chevron next to "condition". You should see something like "f(x) is empty string( → first string )"</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Throw error if the condition is true:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "then", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Throw Error"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error type", search and select your error type (you can directly input the error ID if you know it, e.g. Z30005)</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error parameters", add two items by clicking on the "+" button</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For "Item 1" (offending argument key), set its type to "String" and write the argument identifier (e.g. "first input", or "Z30000K1")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For "Item 2" (offending argument value), click on the "…" next to "Item 2" and select "argument reference"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id", select the first input (e.g. "first string")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse the "then" function call if you want, by clicking on the down-chevron next to "then". You should see something like "f(x) Throw Error( Input was the wrong format, Typed list( Object, "first input", → first string ) )"</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Continue to check the second argument if the first was good:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "else", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "if"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Set up "condition" to check the validity of the second argument by following the same process as described in step 5.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Set up "then" to throw an error for the second argument by following the same process as described in step 6.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Finally, set up the success path:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to the nested "else", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the successful function, which in this case can be "join strings with separator"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and set it to "argument reference", then select "first string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and set it to "argument reference", then select "second string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "separator" add a space into the text field</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The resulting function call should look like this: </div> [[File:Throw error expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function</span>]] [[File:Throw error collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function, in its collapsed view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function, in its collapsed view</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Handling errors in compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> While it is useful to allow functions to raise expected errors, it is crucial to be able to handle errors in your compositions in order to safely use these functions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say you want to create a new function "full name of a person" – we will refer to it with the ZID <code>Z30010</code>. This function should return the full name of a person given a first and last names, but if any of the two fields are empty, it should return the text "Unknown" instead. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You could create a composition using our example function "Join two strings with a space" or <code>Z30000</code> to generate the name. If any of the inputs are empty, you know that <code>Z30000</code> will throw an error of type <code>Z30005</code>. Using the function {{Z|Z850}} as a wrapper, you can attempt the join operation and intercept a possible error to simply return "Unknown" whenever it occurs. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Try-Catch function (Z850) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z850}} function is built-in with ZID <code>Z850</code> and takes three arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – The initial function call to run. If nothing goes wrong, the response will be the result of this function call.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – An error type to catch in case it is thrown during the execution of the first function call.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error handler''' – A function call that will be run in case the error specified above is caught during the execution of the initial function call. If that happens, the result of the error handler will be the value returned.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Try-Catch ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Once we have all the functions for our composition, we can craft it like this: </div> <syntaxhighlight lang="prolog"> try_catch( join_with_space( Z30010K1, Z30010K2 ), Z30005, echo( "Unknown" ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This means that: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">The "Join two strings with a space" function will be tried with the two inputs and, if everything goes well, the output of this function will be returned</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If any of the inputs are blank, "Join two strings with a space" with raise an error of type <code>Z30005</code></span> * <span lang="en" dir="ltr" class="mw-content-ltr">Our {{Z|Z850}} will then detect this error and run the {{Z|Z801}} function to return "Unknown"</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's create this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›” icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the outermost function you want to use, which in this case is "Try-Catch".</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Set the main function call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under the field where the "Try-Catch" function is selected, next to the "function call" key, click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the function "join two strings with space"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and select "argument reference", then select the "first name" argument from the dropdown.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and select "argument reference", then select the "second name" argument from the dropdown.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Select the error to catch:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error type", search and select "bad string input" – you can search directly by its ZID <code>Z30005</code></span> # <span lang="en" dir="ltr" class="mw-content-ltr">Set the error handler function call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "error handler", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "echo"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "input" and "type", search and select the type "String"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now, under "input", type "Unknown" in the text field</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The resulting function should look like this: </div> [[File:Try catch expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in expanded mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in expanded mode</span>]] [[File:Try catch collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in collapsed mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in collapsed mode</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Testing your failure use cases === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As we introduced in the above section about [[#Practice Test-Driven Development|practicing TDD]], it's important to test not only the most common paths, but also the possible edge cases. It is equally important to test failure behavior. In this section we will give you the tools necessary to test that your function fails with a given set of inputs, and that the error thrown is the expected one. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> To do that, you will need other two system functions: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Is error type (Z852) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z852}} function is built-in with ZID <code>Z852</code> and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error''' – An {{Z|Z5}} object, which can be thrown by a failing call. An error instance has a type and a value.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – A reference to an {{Z|Z50}} which will be compared to the type of the Error passed as a first argument. If that's the case, the function will return true.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Get error thrown by function call (Z853) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z853}} function is built-in with ZID <code>Z853</code> and takes one argument: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – A function call which can either return a successful value of any type, or throw an error.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> This function returns a {{Z|Z882}} with a {{Z|Z40}} in first place and an {{Z|Z1}} in the second: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the Function call runs successfully and hence does not throw any error, the returned pair will contain False in the first place, and void in the second.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the Function call throws an error, the returned pair will contain True in the first place, and the caught error in the second.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> To use this function in your compositions, you might need to use the additional functions: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">{{Z|Z821}}, and</span> * {{Z|Z822}} <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Testing errors ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say our target function, "Join two strings with a space" or <code>Z30000</code>, throws an error of type <code>Z30005</code> and we want to test this behavior. To do that we need to: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Throw a failing function call</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Get the error using the function {{Z|Z853}}</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Check that the error is the right type with {{Z|Z852}}</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Tests have two fields: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Call''' – A function call that will produce an output with the inputs you want to test. This call will return a value.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Result validation''' – A function call that will validate that the value returned by the call above is the expected one. The first argument of this function call will be automatically assigned to take the return value of the first call.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> For step-by-step instructions on how to create tests, see {{ll|Wikifunctions:Introduction#Create_tests}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In our example, we can structure it like this — but this is not the only way! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The call, which will return an {{Z|Z5}} object: </div> <syntaxhighlight lang="prolog"> error = get_second_element_of_typed_list( get_error_thrown_by( join_strings_by_whitespace( "", "not empty" ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> And the result validation, which will take the {{Z|Z5}} object as its first argument: </div> <syntaxhighlight lang="prolog"> is_error_type( error, Z30005 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's do this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding a test by clicking on the "+" button in the "Tests" table from your Function page. The "call" and "result validation" fields already have some functions pre-set, but to test the errors we will need to change them.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">First, let's set the call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "call", click the "›" chevron button to expand the function call.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", edit the field and search and select the function "Get second element of a typed pair"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Once selected, next to "Typed pair", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Get error thrown by function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "function call", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Join two strings with a space" (or by ZID <code>Z30000</code>)</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now set the inputs so that they cause a failure: at least one of them should be empty.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse your "call" by clicking again on the down-chevron button if you want!</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Next, let's set the result validation:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "result validation", click the "›" chevron button to expand the function call.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", edit the field and search and select the function "Is error type"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now you will only be asked to configure the second argument. Under "error type", search and select your <code>Z30005</code> error type.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">And you are done! You can now click the circular arrow in the "Implementations" box and you should see green checks.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> If everything went right, you can now save your test. It should look like this: </div> [[File:Get error expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in expanded mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in expanded mode</span>]] [[File:Get error collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in collapsed mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in collapsed mode</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Creating actionable error messages === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As described above, Error Types have an optional key <code>Z50K3</code> which contains a multilingual list of HTML strings. When rendering information about an error, the messages stored in the error type can help create a clear, precise, informative, translatable and actionable error message. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For that purpose, error messages can contain parameters like <code>$1</code>, <code>$2</code>, etc., where the digit corresponds to the error type argument and its value in the error instance. These error messages are rendered in Wikifunctions inside the "Details" dialog window after executing a function call. Additionally, these error messages are surfaced in other client interfaces, like Abstract Wikipedia, to provide better guidance to Abstract Content editors. </div> [[File:Wikifunctions actionable error message example in the Details dialog.png|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">The error message is rendered using the HTML message of the error type and the error argument values.</span>]] [[File:Wikifunctions actionable error message example in Abstract Wikipedia.png|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">When available, the HTML error message is rendered in the Abstract Wikipedia preview section.</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> Let's use a real example to understand the benefits of HTML error messages: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The function {{Z|Z37847}} returns the first Lexeme reference given a Wikidata Item reference and a language. When there is no Lexeme for this Item-Language combination, it throws an error of type {{Z|Z28248}}, which has three keys: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K1''' is the input Wikidata item QID</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K2''' is the connecting property, in this case <code>P5137/item for this sense</code></span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K3''' is the language code</span> <div lang="en" dir="ltr" class="mw-content-ltr"> When calling this function for a Wikidata lexeme that doesn't exist, the call will throw an error instance like this: </div> <syntaxhighlight lang="json" highlight="10,12"> { "Z1K1": "Z5", "Z5K1": "Z28248", "Z5K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z885", "Z885K1": "Z28248" }, "Z28248K1": "Q319", "Z28248K2": "P5137", "Z28248K3": "ast" } } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> While the error type label indicates: <code>No matching lexeme for item in language</code>, a better error message should indicate: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">which is the failing item,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">which is the language missing, and</span> * <span lang="en" dir="ltr" class="mw-content-ltr">what are the possible ways to fix it.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The error message <code>Z50K3</code> field can provide this functionality. Whenever an Error Type has an error message for the user language (or any of its fallbacks), the error message shown will be rendered by: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">First, replacing the message parameters with the values of the keys. In our example, any <code>$1</code> will be replaced with the value of <code>Z28248K1</code> ("Q319"), <code>$2</code> with "P5137", and <code>$3</code> with "ast",</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Last, sanitizing and rendering the HTML message.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> So a HTML message like: </div> <syntaxhighlight lang="html"> There is no matching lexeme for the item $1 in "$3".<br> <a href="http://wikidata.org/wiki/$1">Edit in Wikidata</a> </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Will become: </div> : There is no matching lexeme for the item Q319 in "ast" : [[d:Q319|Edit in Wikidata]] <div lang="en" dir="ltr" class="mw-content-ltr"> == Debugging your implementations == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Sometimes things can go wrong. A function might behave differently than expected or a value might not look quite right. Sometimes implementations are really complex and, because they are run in a sandboxed environment, it can seem really difficult to debug. To help understand what's going on inside a function call, Wikifunctions includes a small set of debugging tools. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> These tools don't change the result of a function, but will add extra information to the returned metadata, which you can observe after running the function. You can use <code>Wikifunctions.Debug()</code> from your code implementations or the function {{Z|Z854}} from your compositions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section you will learn: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">How to add debug messages from both code and composition implementations,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to inspect the metadata manually or via the UI to inspect these logs.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Debugging your code implementations === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> When writing code, both from JavaScript and Python3, you can use <code>Wikifunctions.Debug()</code> to add a message to your debugging log and continue the execution. </div> {{phab|T441028}} <div lang="en" dir="ltr" class="mw-content-ltr"> <code>Wikifunctions.Debug()</code> has one parameter, which is generally expected to be a string. However, any other object passed as parameter will get directly converted into a string. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If we want to add debug logs to our code implementations for our "Join two strings with a space" example function, we can do, in JavaScript: </div> <syntaxhighlight lang="JavaScript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { Wikifunctions.Debug( `first input is empty "${ Z30000K1 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { Wikifunctions.Debug( `second input is empty "${ Z30000K2 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } Wikifunctions.Debug( "both inputs are fine" ); return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> And the same in your Python3 implementation will be: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": Wikifunctions.Debug( 'first input is empty "'+Z30000K1+'"' ) Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": Wikifunctions.Debug( 'second input is empty "'+Z30000K2+'"' ) Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) Wikifunctions.Debug( 'both inputs are fine' ) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This way, no matter what happens, we will be adding one message to your debugging logs: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the function call fails when checking on the first or second input, the result of the execution will be a failure, but it will contain one informative log about what branch caused the failure.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the function call succeeds—because both inputs are valid—the function call will return the joined string, but the returned metadata will also contain a debug log.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Debugging your compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> To support debugging compositions, Wikifunctions provides the built-in function {{Z|Z854}}. This function allows you to attach debug messages to the execution of any function call that generates the final output. The debug logs collected during the evaluation are returned as part of the execution metadata, under the <code>executorDebugLogs</code> key. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Add debug log to function call (Z854) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z854}} function is built-in with ZID <code>Z854</code> and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – Any composition you want to execute.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Debug log''' – A string message that will be recorded if the given function call is evaluated.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> When the wrapped function call runs, the provided message is added to the execution logs. If that function call is not executed, or its execution is not part of the final output, its debug log will not appear in the final result metadata. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You will benefit from this built-in if you want to observe: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Which branch of a conditional was executed, or</span> * <span lang="en" dir="ltr" class="mw-content-ltr">the order of evaluation in a composition.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Add debug log to function call ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say that you want to add debug logs to our example function "Join two strings with a space" or <code>Z30000</code>, so that different messages are added to the different possible outcomes. You could use our debugging builtin like this: </div> <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), add_debug_log( throw_error( Z30005, ... ), 'failed on first input' ) if( is_empty_string( Z30000K2 ), add_debug_log( throw_error( Z30005, ... ), 'failed on second input' ), add_debug_log( join_with_separator( Z30000K1, Z30000K2, " " ), 'both inputs are ok!' ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This way, </div> * <span lang="en" dir="ltr" class="mw-content-ltr">when called with an empty first input, the function will return a failed response, and the metadata will contain an <code>executorDebugLogs</code> entry with the "failed on first input" log.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">When called with an empty second input, the call will also fail, but the logged message will be "failed on second input"</span> * <span lang="en" dir="ltr" class="mw-content-ltr">When called with valid inputs, the function will return a successful response, and additionally the metadata will contain "both inputs are ok" in its <code>executorDebugLogs</code> key.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> This is the way this composition would look: </div> [[File:Add debug log expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Composition implementation using Add debug logs to log all possible execution paths</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Composition implementation using Add debug logs to log all possible execution paths</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Accessing execution debug logs === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Whether your execution logs are added via <code>Wikifunctions.Debug()</code> or via the {{Z|Z854}} built-in function, they are returned as part of the response metadata. To see the logs, once you run your function, click on the "Details" button that appears at the bottom of the "Result" section. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The error and debug information will appear at the top of the "Details" dialog. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> This is what you would see when running the composition from our previous example with valid and invalid inputs: </div> {| class="wikitable" | [[File:Execution logs success.png|frameless|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a successful execution with debug logs</span>]] | [[File:Execution logs failure.png|frameless|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a failed execution with debug logs</span>]] |- | <span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a successful execution: shows no errors, but displays the successful execution log: ''"both inputs are ok!"''</span> | <span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a failed execution: shows the error information, and the additional execution log for the first failure branch: ''"failed on first input"''</span> |} [[Category:How to create implementations| {{#translation:}}]] 04ud0s19ap1axilgmmq5kd6yastfrlq Wikifunctions:What Wikifunctions is not/pl 4 20056 331068 190631 2026-10-23T08:06:08Z FuzzyBot 207 Updating to match new version of source page 331068 wikitext text/x-wiki <languages/> {{shortcut|[[WF:NOT]]}} {{Draft}} <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions is a new kind of website, aiming for a new community. We very much hope to work together with many tools, sites, communities, and kinds of systems that are out there: we want to play together with IDEs, with cloud computing platforms, with app development sites, and many more. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> But we also aim to be a novel thing and we hope to shape a new unique space out for us: a Wikimedia project for everyone to collaboratively create and maintain a library of code functions to support the Wikimedia projects and beyond, for everyone to call and re-use in the world's natural and programming languages. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The scope of the project is within bounds, though. So, let us also explore '''what Wikifunctions is not'''. </div> <span id="Wikifunctions_is_not_an_encyclopædia_of_algorithms"></span> == Wikifunkcje to nie encyklopedia algorytmów == <div lang="en" dir="ltr" class="mw-content-ltr"> This means that we will '''not''' concentrate on having pages for famous and not-so famous algorithms such as [[w:Euclidean algorithm|Euclid's]], [[w:Newton's method|Newton's]], or [[w:Dijkstra's algorithm|Dijkstra's algorithm]], aiming to represent all existing algorithms faithfully and in their historical context. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Yes, we expect to have a function for the [[w:Greatest common divisor|greatest common divisor]] (GCD) of two integers. And there might be one or more implementations which are based on Euclid's algorithm to calculate the GCD. But Wikifunctions' main goal is not to gather algorithms, and it would not be incomplete if it didn't include some, and used alternatives instead to compute the GCD. If you are looking for that, many Wikipedias are actually [[w:List of algorithms|great resources]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Unlike an encyclopedic overview of existing algorithms, Wikifunctions will also invite original work. We will not be restricted to functions that have been published elsewhere first, and we do not require for every function and implementation to be based on previously published work. Wikifunctions, much like Wikibooks and very unlike Wikipedia, will be open to novel contributions. The main criteria for implementations will be: under which conditions can we run a given implementation, and what resources is it expected to take? </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not an app development site == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We do not expect to make it possible to create full-fledged, stand-alone apps within Wikifunctions — there will be no place to store state, we don't aim to allow calling external APIs or directly cause changes to other sites, and we don't aim to package up apps with icons and UX, etc. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We absolutely expect Wikifunctions to be a very useful resource for app developers, and can very much imagine apps that are basically wrappers around one or more functions from Wikifunctions, but these would still need code and other assets which wouldn't be part of Wikifunctions. We are not competing in the area of no-code or low-code development sites. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a code hosting service == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions will host code — but not for whole projects, merely for individual functions. There won't be libraries, apps, or services developed on Wikifunctions with bug-trackers, forums, etc. There won't be a Web-based version control system such as ''Mercurial'' or ''Git'' running against Wikifunctions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Again, we hope that there will be libraries, apps, and services that will rely on functions available in Wikifunctions, but they would be developed on a different site, such as ''Gerrit'', ''GitHub'', or ''GitLab''. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a programming language, nor is trying to evangelise a particular language == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions will allow for functions to be implemented in a multitude of programming languages. The possibility to compose functions together to create higher level functions may look a little bit like a new programming language, but it will be extremely limited compared to most other programming languages, since we only allow for nested function calls and that's it. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not an Integrated Development Environment (IDE) == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We won't provide you with an interface for creating and developing software projects, interfacing with build, testing, and source control systems. </div> <span id="Wikifunctions_is_not_a_question-and-answer_website"></span> == Wikifunkcje nie są stroną z pytaniami i odpowiedziami == <div lang="en" dir="ltr" class="mw-content-ltr"> We are not competing with ''Stack Overflow'' and similar websites, where a developer would ask how to achieve a certain task and have community members discuss and answer the question. We won't contain code snippets to help answer the question, but we will organize code within our website to enable the evaluation of functions within a library of functions. </div> <span id="Wikifunctions_is_not_a_cloud_computing_platform"></span> == Wikifunkcje nie są platformą przetwarzania w chmurze == <div lang="en" dir="ltr" class="mw-content-ltr"> We do not provide computing resources and access to services and APIs so that you can run your computational needs on our platform, either for money or for free. Use of Wikifunctions's evaluation platform is to improve access to knowledge for everyone. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a code snippet website == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We are not competing with code snippet sites such as GitHub Gists, [[w:Rosetta_Code|Rosetta Code]], [https://esolangs.org/ esolangs.org], or [http://helloworldcollection.de/ helloworldcollection.de]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions differs in that it allows running code and composing existing functions together to create new ones. As well, Wikifunctions is for useful and meaningful code, not temporary, arbitrary snippets that other platforms may accept. </div> <span id="Wikifunctions_is_not_a_code_education_platform"></span> == Wikifunkcje nie są platformą do nauki kodowania == <div lang="en" dir="ltr" class="mw-content-ltr"> We are not focused on teaching people how to code, the material in Wikifunctions will not be laid out in a pedagogical order, and we also won't make sure to comprehensively cover all topics important for coding. In fact, we aim for Wikifunctions to be usable for people who don't know how to code and who don't need to learn how to code to use most of Wikifunctions effectively. Though the Wikifunctions community may well help each other in sharing best practices, style guides, and tips on how to use the site in different languages, these will be aimed at the purpose of serving the world's knowledge. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not (only) the boiler room for Abstract Wikipedia == </div> [[File:Mechanical_room_in_basement._Wayne_N._Aspinall_Federal_Building_and_U.S._Courthouse,_Grand_Junction,_Colorado_LCCN2014650034.tif|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">A '[[d:Q6804549|boiler room]]', where unsightly-but-vital machinery is hidden</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> Natural language generation (NLG) is the focus of {{SITENAME}} as of 2026, and the site began as part of the wider [[meta:Special:MyLanguage/Abstract_Wikipedia|Abstract Wikipedia project]], but NLG is far from the only field in which functions are being developed. That is to say, WF is necessary for AW, but AW is not necessary for WF. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> On top of the computer science staples of Boolean logic, arithmetic, and list manipulation, we have useful functions relating to disciplines such as [[Z16718|chemistry]], [[Z35550|dimensional analysis]], [[Z20074|electrical engineering]], [[Z22162|genomics]], [[Z10393|information theory]], [[Z26830|meteorology]], [[Z13955|number theory]], [[Z27919|physiology]], [[Z20094|probability]], [[Z24497|quantum mechanics]], [[Z14226|railroad engineering]], [[Z28600|timekeeping/chronometry]], and [[Z26841|trigonometry]]. </div> [[Category:Project concept{{#translation:}}]] 4ui4wgsx2a576ng418ftn2bggo22hf8 Wikifunctions:What Wikifunctions is not/id 4 20898 331061 190626 2026-10-23T08:06:06Z FuzzyBot 207 Updating to match new version of source page 331061 wikitext text/x-wiki <languages/> {{shortcut|[[WF:NOT]]}} {{Draft}} Wikifunctions adalah jenis situs web baru, yang bertujuan untuk komunitas baru. Kami sangat berharap untuk bekerja sama dengan banyak alat, situs, komunitas, dan jenis sistem yang ada di luar sana: kami ingin bermain bersama dengan IDE, dengan platform komputasi awan, dengan situs pengembangan aplikasi, dan banyak lagi. <div lang="en" dir="ltr" class="mw-content-ltr"> But we also aim to be a novel thing and we hope to shape a new unique space out for us: a Wikimedia project for everyone to collaboratively create and maintain a library of code functions to support the Wikimedia projects and beyond, for everyone to call and re-use in the world's natural and programming languages. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The scope of the project is within bounds, though. So, let us also explore '''what Wikifunctions is not'''. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not an encyclopædia of algorithms == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> This means that we will '''not''' concentrate on having pages for famous and not-so famous algorithms such as [[w:Euclidean algorithm|Euclid's]], [[w:Newton's method|Newton's]], or [[w:Dijkstra's algorithm|Dijkstra's algorithm]], aiming to represent all existing algorithms faithfully and in their historical context. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Yes, we expect to have a function for the [[w:Greatest common divisor|greatest common divisor]] (GCD) of two integers. And there might be one or more implementations which are based on Euclid's algorithm to calculate the GCD. But Wikifunctions' main goal is not to gather algorithms, and it would not be incomplete if it didn't include some, and used alternatives instead to compute the GCD. If you are looking for that, many Wikipedias are actually [[w:List of algorithms|great resources]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Unlike an encyclopedic overview of existing algorithms, Wikifunctions will also invite original work. We will not be restricted to functions that have been published elsewhere first, and we do not require for every function and implementation to be based on previously published work. Wikifunctions, much like Wikibooks and very unlike Wikipedia, will be open to novel contributions. The main criteria for implementations will be: under which conditions can we run a given implementation, and what resources is it expected to take? </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not an app development site == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We do not expect to make it possible to create full-fledged, stand-alone apps within Wikifunctions — there will be no place to store state, we don't aim to allow calling external APIs or directly cause changes to other sites, and we don't aim to package up apps with icons and UX, etc. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We absolutely expect Wikifunctions to be a very useful resource for app developers, and can very much imagine apps that are basically wrappers around one or more functions from Wikifunctions, but these would still need code and other assets which wouldn't be part of Wikifunctions. We are not competing in the area of no-code or low-code development sites. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a code hosting service == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions will host code — but not for whole projects, merely for individual functions. There won't be libraries, apps, or services developed on Wikifunctions with bug-trackers, forums, etc. There won't be a Web-based version control system such as ''Mercurial'' or ''Git'' running against Wikifunctions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Again, we hope that there will be libraries, apps, and services that will rely on functions available in Wikifunctions, but they would be developed on a different site, such as ''Gerrit'', ''GitHub'', or ''GitLab''. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a programming language, nor is trying to evangelise a particular language == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions will allow for functions to be implemented in a multitude of programming languages. The possibility to compose functions together to create higher level functions may look a little bit like a new programming language, but it will be extremely limited compared to most other programming languages, since we only allow for nested function calls and that's it. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not an Integrated Development Environment (IDE) == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We won't provide you with an interface for creating and developing software projects, interfacing with build, testing, and source control systems. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a question-and-answer website == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We are not competing with ''Stack Overflow'' and similar websites, where a developer would ask how to achieve a certain task and have community members discuss and answer the question. We won't contain code snippets to help answer the question, but we will organize code within our website to enable the evaluation of functions within a library of functions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a cloud computing platform == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We do not provide computing resources and access to services and APIs so that you can run your computational needs on our platform, either for money or for free. Use of Wikifunctions's evaluation platform is to improve access to knowledge for everyone. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a code snippet website == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We are not competing with code snippet sites such as GitHub Gists, [[w:Rosetta_Code|Rosetta Code]], [https://esolangs.org/ esolangs.org], or [http://helloworldcollection.de/ helloworldcollection.de]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions differs in that it allows running code and composing existing functions together to create new ones. As well, Wikifunctions is for useful and meaningful code, not temporary, arbitrary snippets that other platforms may accept. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a code education platform == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We are not focused on teaching people how to code, the material in Wikifunctions will not be laid out in a pedagogical order, and we also won't make sure to comprehensively cover all topics important for coding. In fact, we aim for Wikifunctions to be usable for people who don't know how to code and who don't need to learn how to code to use most of Wikifunctions effectively. Though the Wikifunctions community may well help each other in sharing best practices, style guides, and tips on how to use the site in different languages, these will be aimed at the purpose of serving the world's knowledge. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not (only) the boiler room for Abstract Wikipedia == </div> [[File:Mechanical_room_in_basement._Wayne_N._Aspinall_Federal_Building_and_U.S._Courthouse,_Grand_Junction,_Colorado_LCCN2014650034.tif|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">A '[[d:Q6804549|boiler room]]', where unsightly-but-vital machinery is hidden</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> Natural language generation (NLG) is the focus of {{SITENAME}} as of 2026, and the site began as part of the wider [[meta:Special:MyLanguage/Abstract_Wikipedia|Abstract Wikipedia project]], but NLG is far from the only field in which functions are being developed. That is to say, WF is necessary for AW, but AW is not necessary for WF. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> On top of the computer science staples of Boolean logic, arithmetic, and list manipulation, we have useful functions relating to disciplines such as [[Z16718|chemistry]], [[Z35550|dimensional analysis]], [[Z20074|electrical engineering]], [[Z22162|genomics]], [[Z10393|information theory]], [[Z26830|meteorology]], [[Z13955|number theory]], [[Z27919|physiology]], [[Z20094|probability]], [[Z24497|quantum mechanics]], [[Z14226|railroad engineering]], [[Z28600|timekeeping/chronometry]], and [[Z26841|trigonometry]]. </div> [[Category:Project concept{{#translation:}}]] 98dw5r40u910kx9ktjysem3re3tzagb Wikifunctions:How to create implementations/id 4 21080 331115 276451 2026-10-23T08:23:23Z FuzzyBot 207 Updating to match new version of source page 331115 wikitext text/x-wiki <languages/> Halaman ini menyediakan panduan yang lebih rinci untuk '''membuat implementasi''', di luar gambaran umum di {{ll|Wikifunctions:Introduction}}. <div lang="en" dir="ltr" class="mw-content-ltr"> == Types of Implementations == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In Wikifunctions, an '''implementation''' can take one of two main forms: '''code''' or '''composition'''. A code implementation directly expresses the function’s logic in any of the available programming languages (currently, Python3 or JavaScript). It’s most useful when the function’s behavior can’t easily be built from existing Wikifunctions, or when precise control over data processing is needed. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> A composition implementation, on the other hand, defines the function entirely by combining other existing functions, without writing code. Compositions are easier to understand, reuse, and translate into other languages automatically, but they depend on suitable building blocks already being available and often are less performant. In general, start by checking whether your goal can be achieved through composition; if it can’t, or if performance or fine-grained logic matters, choose a code implementation instead. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> There's a third type of implementation: '''built-ins'''. These are run by system-built code, and are not editable. Most likely all pre-defined functions will have a built-in implementation. In such cases, when opening the implementation page, you will see a message stating ''"{{int|wikilambda-implementation-selector-none}}"'' </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Practice Test-Driven Development == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> '''Test-Driven Development''', or '''TDD''', is a way of creating software where you write tests before you write the actual code. Tests are just a way of understanding what your function is supposed to do by listing examples and how they should work. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In Wikifunctions, writing tests first offers significant benefits. If you are working on an implementation, you can run your code against the existing tests to check that it behaves as expected. This makes it easier to catch errors early before even publishing your implementation. Tests are also a powerful way to describe the function you need. By writing tests, '''you clearly communicate the expected behavior''', and the community can step in and help with the implementation, or create alternative implementations. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Imagine you want to implement a Function that combines two strings with a space in between. A basic test for this might look like: </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello", "world" ) => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Once you have defined the basic behavior, it's important to '''think about edge cases'''—situations where the inputs are such that you might need some special behavior. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, what if your first string ends in a space, or your second string starts with a space? Should the function keep all existing spaces and add another one, or should it return a neatly spaced result with just a single space between the words? Depending on your requirements, you should build a test for such a case. For example, a test for this edge case could be either one of these — but not both!: </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> or ... </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Make sure that all possible special cases are covered by your tests, and once you have them, make sure that they are all connected to the Function by selecting them and clicking "Connect". </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Code implementations == </div> [[File:Code implementation.png|thumb|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions code editor initialized with a function template</span>|<span lang="en" dir="ltr" class="mw-content-ltr">When adding a new code implementation, the function template is initialized with the function and argument names</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> When creating an implementation using code, the Wikifunctions UI will set up a code editor with the selected language activated for syntax highlighting and validation. When the function to implement and the programming language are selected, this editor will be set with the correct function template: '''do not remove or edit this'''! Keep your code inside this function signature: if you need auxiliary functions, you can simply declare them inside your top-level function declaration. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Using input types in your code === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions types {{Z|Z6}} and {{Z|Z40}} can be used as if they were native types in both JavaScript and Python3. For example, a String input can be concatenated or a Boolean be directly used in a logical expression. To use other types in your code implementations, you will have to look deeper into the type, figure out if it has a conversion to a native equivalent, and treat it accordingly. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, let's say we want to write some Python code that handles an input of type {{Z|Z20420}}. In the page for this type, let's look at its "type converters to code" and search for a Python one. The converter {{Z|Z20424}} will be applied to our date input before our code, so looking at "native type" we know that our input will be a Python ''dict'' and looking at the implementation we can see the keys we can expect: </div> <syntaxhighlight lang="python3"> return { 'K1': year, 'K2': month, 'K3': day } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> When a type doesn't have a converter, you'll have to access its parts directly using its keys. For example, let's assume that your function <code>Z30000</code> has one input <code>Z30000K1</code> of type {{Z|Z11}}. This type has two keys: <code>Z11K1</code> for the language (itself an object of type {{Z|Z60}}), and <code>Z11K2</code> for the string value. Similarly, the language object has a key <code>Z60K1</code> for the language code. So, to get a string with the language code and the text, you can write: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1 ) { // e.g. "en: some text" return Z30000K1.Z11K1.Z60K1 + ": " + Z30000K1.Z11K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> For a quick reference of the available type conversions visit [[Special:MyLanguage/Wikifunctions:Execution targets#Default type conversion|the default type conversion table]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Returning the right outputs === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Similarly to the way you treat inputs, outputs need to match the type specified in the function definition. Some can be treated as simply as native types, so any string output will be converted into a Wikifunctions {{Z|Z6}} object and any native boolean returned by your implementation will be converted into a Wikifunctions {{Z|Z40}} object. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Those types that have "type converters from code" will apply the appropriate function to the output, in order to build the required type. Following the example of {{Z|Z20420}}, the {{Z|Z20443}} will transform the output from your implementation–a dict with K1, K2 and K3 keys–into its correct ZObject representation. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For types that don't have converters from code, you can carefully build and return the output objects. For example, imagine that our function <code>Z30000</code> takes two string inputs: language code and text, and should return a {{Z|Z11}} object. You can do this in Python by using the <code>ZObject</code> constructor: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): lang_object = ZObject( {"Z1K1": "Z9", "Z9K1": "Z60"}, Z60K1 = Z30000K1 ) return ZObject( {"Z1K1": "Z9", "Z9K1": "Z11"}, Z11K1 = lang_object, Z11K2 = Z30000K2 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Or in JavaScript: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { const langObject = new ZObject( new Map( [ [ "Z60K1", Z30000K1 ] ] ), { "Z1K1": "Z9", "Z9K1": "Z60" } ); const monolingualKeys = new Map( [ [ "Z11K1", langObject ], [ "Z11K2", Z30000K2 ] ] ); return new ZObject( monolingualKeys, { "Z1K1": "Z9", "Z9K1": "Z11" } ); } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> You can learn more about the <code>ZObject</code> class and other useful constructors in {{ll|Wikifunctions:Execution_targets#Custom_and_non-built-in_type_conversion}} </div> {{phab|T392750}}<div lang="en" dir="ltr" class="mw-content-ltr"> As of 2026-05, trying to return a list of lists may fail, so you're not able to implement such functions in code. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Code in Python === </div> <div class="mw-translate-fuzzy"> Di bawah ini kami memberikan contoh konkret tentang cara membuat Implementasi dalam bentuk Kode berbahasa Python. Misalnya kita ingin membuat implementasi untuk Fungsi yang menggabungkan dua untaian masukan dengan menyisipkan spasi di antara mereka, dan memberikan hasil dari itu. Mari kita asumsikan ZID fungsi itu adalah Z11057. </div> <div class="mw-translate-fuzzy"> Implementasi didefinisikan menggunakan ZID fungsi. Begitu juga dengan argumen fungsi. Jadi dalam kasus fungsi Z11057 dengan dua argumennya, baris pertama haruslah seperti ini: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> As we described before, we know that the arguments (<code>Z30000K1</code> and <code>Z30000K2</code>) are Strings, so we can treat them as simply as we use native strings in Python. Also, the function should return a String. For our example, we simply return the two arguments concatenated with a space in between: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): return Z30000K1 + " " + Z30000K2 </syntaxhighlight> Karena ini Python, jangan lupa tambahkan indentasi di baris ini. <div lang="en" dir="ltr" class="mw-content-ltr"> If you have followed our advice to [[#Practice Test-Driven Development|practice TDD]], you will already have a set of tests that you know should work. If that's the case, while building your implementation you can click on the circular arrow in the Tests panel, and see if your implementation passes all of them. </div> Ingat bahwa selama waktu eksekusi, keadaan tidak disimpan. Jangan menganggap ada nilai variabel global atau statis. Jika Anda memiliki pertanyaan lebih lanjut tentang apa yang dapat dan tidak dapat Anda lakukan di Python, tanyakan di [[Wikifunctions:Python implementations]]. <div lang="en" dir="ltr" class="mw-content-ltr"> === Code in JavaScript === </div> <div class="mw-translate-fuzzy"> Di bawah ini kami memberikan contoh konkret tentang cara membuat Implementasi dalam bentuk Kode berbahasa JavaScript. Misalnya kita ingin membuat implementasi untuk Fungsi yang menggabungkan dua untaian masukan dengan menyisipkan spasi di antara mereka, dan memberikan hasil dari itu. Mari kita asumsikan ZID fungsi itu adalah Z11057. </div> <div class="mw-translate-fuzzy"> Implementasi didefinisikan menggunakan ZID fungsi. Begitu juga dengan argumen fungsi. Jadi dalam kasus fungsi Z11057 dengan dua argumennya, baris pertama haruslah seperti ini: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> We know that the arguments (<code>Z30000K1</code> and <code>Z30000K2</code>) are Strings, so we can treat them as native strings in JavaScript. Also, the function should return a String. To complete our function, you can then add a line concatenating the input strings, like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> If you have tests as recommended in the [[#Practice Test-Driven Development|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes all of them. </div> Ingat bahwa selama waktu eksekusi, keadaan tidak disimpan. Jangan menganggap ada nilai variabel global atau statis. Jika Anda memiliki pertanyaan lebih lanjut tentang apa yang dapat dan tidak dapat Anda lakukan di JavaScript, tanyakan di [[Wikifunctions:JavaScript implementations]]. <div lang="en" dir="ltr" class="mw-content-ltr"> === Calling another Wikifunctions function === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> A code implementation can call certain other Wikifunctions functions, receive the output of the call, and use that output in further processing. We refer to such calls as callbacks. At present, due to security and performance concerns, only the following built-in Wikidata fetch and search functions can be called in this way: {{Z|Z6820}}, {{Z|Z6821}}, {{Z|Z6822}}, {{Z|Z6824}}, {{Z|Z6825}}, {{Z|Z6826}}, {{Z|Z6830}}, and {{Z|Z6831}}. This capability is in an initial stage of deployment; we hope to allow calls to a broader range of functions in the future. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Let’s look at a JavaScript implementation containing a callback. This implementation fetches an item from Wikidata, extracts the label of that item in a given language, and returns the label string. The item to fetch is given by argument <code>Z400K1</code>, and the language is given by <code>Z400K2</code>. </div> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const item = Wikifunctions.Call('Z6821', Z400K1); for (const label of item.Z6001K2.Z12K1) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> A callback is made by calling <code>Wikifunctions.Call</code>, as shown in the example. The first argument to <code>Wikifunctions.Call</code> is always the ZID of the function to be called – in this case, {{Z|Z6821}}, which takes a single argument. Following that, the arguments to be passed to that function are listed, separated by commas. Here, that argument, <code>Z400K1</code>, is the same value that was passed to the function <code>Z400</code>. This is a common pattern of argument passing to callbacks, but their arguments can also be built using the <code>ZObject</code> constructor (as explained above), or obtained in other ways. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The value of <code>Z400K1</code> would be an instance of {{Z|Z6091}}, containing the QID of the item to be fetched. Line 2 of the example calls <code>Z6821</code> to fetch that item from Wikidata and assigns the resulting ZObject to the const <code>item</code>. The remaining code iterates over the item’s labels until it finds the one matching the language given by <code>Z400K2</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For the first example above, we have used <code>Z6821</code> for simplicity. However - unless an entire entity is needed by the implementation, it is strongly recommended to use <code>Z6820</code> to retrieve Wikidata items, which can be quite large. Although a call to <code>Z6820</code> is a bit more complex, its parameters allow for fetching selected portions of a Wikidata item, which can greatly improve performance and avoid some errors, by reducing the network bandwidth and processing time that are needed. (<code>Z6820</code> can also be used in place of <code>Z6822</code>, <code>Z6824</code>, <code>Z6825</code>, and <code>Z6826</code>, to get similar bandwidth-reduction benefits.) </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Just below we show how <code>Z6820</code> can be used, in <code>Wikifunctions.Call</code>, to implement the same behavior as above. Note that we use the second argument passed to <code>Z6820</code>, <code>[labelsPart]</code>, to say “Just return the item’s labels”, and we use the third argument, <code>[Z400K2]</code>, to say “Just return labels in the given language”. (This argument would also apply to aliases and descriptions, if they were included in the result.) </div> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const labelsPart = new ZObject( new Map( [ ['Z6030K1', new ZReference('Z6033')] ] ), {Z1K1: 'Z9', Z9K1: 'Z6030'} ); const entities = Wikifunctions.Call( 'Z6820', [Z400K1], [labelsPart], [Z400K2], []); const item = entities.get(Z400K1.Z6091K1); const labels = item.Z6001K2.Z12K1; for (const label of labels) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Other things to note: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Even though code implementations are now able to fetch Wikidata entities, it is recommended that they not be written to return ''entire'' entities. This is because of current limitations on the size of the value returned from a code implementation. To fetch and return an entire large entity, it’s better to call the fetch function from a composition.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Only one callback can execute at a time. For security reasons, it is not possible to use the concurrency features of JavaScript or Python to execute multiple callbacks in parallel.</span> ** <span lang="en" dir="ltr" class="mw-content-ltr">Keep in mind, however, that you can fetch multiple entities at once using Z6820.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">There is currently a 3 MiB limit on the size of Wikidata content that can be returned to a code implementation, by a single callback. The same limit applies to the size of the result returned from a code implementation.</span> <span id="Compositions"></span> <div class="mw-translate-fuzzy"> == Komposisi == </div> <div class="mw-translate-fuzzy"> Di bawah ini kami memberikan contoh konkret tentang cara membuat Implementasi dalam bentuk komposisi. Misalnya kita ingin membuat implementasi untuk Fungsi yang menggabungkan dua untaian masukan dengan menyisipkan spasi di antara mereka, dan memberikan hasil dari itu. Mari kita asumsikan ZID fungsi itu adalah Z11057. </div> <div class="mw-translate-fuzzy"> Biasanya lebih baik memulai dengan memikirkan cara menggabungkan fungsi yang ada untuk menciptakan keluaran yang diinginkan. Kadang-kadang ini mungkin terasa sangat mudah dan Anda bisa langsung saja mengomposisi fungsi, tetapi dalam banyak kasus sebaiknya komposisi yang diinginkan dicatat terlebih dahulu. Antarmuka komposisi Wikifunctions belum cukup baik dalam menyunting komposisi, jadi lebih baik cari tahu terlebih dahulu apa yang Anda ingin membuat. </div> <div class="mw-translate-fuzzy"> Sebagai contoh, untuk membuat Fungsi yang diminta, kita bisa menggunakan [[{{Z|Z10000}}|''Fungsi penyambung untaian'']] yang ada. Fungsi yang itu menerima dua untaian dan menghasilkan satu untaian dari keduanya. Namun, kita ingin menambahkan spasi di antara mereka. Jadi, pertama-tama kita sambungkan spasi ke ujung untaian pertama, lalu sambungkan untaian kedua ke hasil penyambungan pertama. Jadi komposisi kita bisa dicatat seperti berikut: </div> <syntaxhighlight lang="prolog"> join_strings( join_strings( Z30000K1, " " ), Z30000K2 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> There are multiple ways to write a composition: notice that the same thing could be accomplished with: </div> <syntaxhighlight lang="prolog"> join_strings( Z30000K1, join_strings( " ", Z30000K2 ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> An alternative implementation could also use the existing Function {{Z|Z15175}}, so your composition could be: </div> <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> As you can see, there are multiple ways to accomplish this, so take your time and explore the existing functions available in the {{ll|Wikifunctions:Catalogue}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's try to create the second example, <code>join_strings(Z30000K1, join_strings(" ", Z30000K2))</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In order to create this: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›" icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search for the name of the outermost function you want to use, which in this example is "join two strings". Then, select the wanted function from the dropdown list.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">You will see two new fields, one for each of the arguments needed for the selected function.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">For the first argument, we want to select the first input to our function:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and select "Argument reference".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id" you can now select the first string of your function from the dropdown, which contains all available inputs.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">For the second argument, we want to use the result of another call to "join two strings":</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and select "Function call".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function you want to call, which is again "join two strings".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For this inner function call, configure the "first string" by simply typing a white space in the text field, and configure the "second string" as you did for step 6: change it using the "…" button to "Argument reference", and then select the second argument in the dropdown.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Your composition is now complete! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You can expand and collapse the details using the chevron buttons to see how it looks. If you already have Tests as recommended in the [[#Practice Test-Driven Development|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes the tests. Once your composition passes the tests, go ahead and publish it. </div> [[File:Composition implementation expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its expanded view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its expanded view</span>]] [[File:Composition implementation collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its collapsed view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its collapsed view</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions error handling == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As a Wikifunctions function creator, you might want to warn the user calling your function when something goes wrong in the code, or when their inputs do not fit a certain criteria. For example, if your Function expects a string input to contain a name, you might want to check that the name is not empty and, if it is, show an error message that the person using your Function can understand. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For this purpose, you can use <code>Wikifunctions.Error()</code> from your code implementations or the function {{Z|Z851}} from your compositions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section you will learn: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">How to throw errors from both code and composition implementations,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to write tests for error cases, and</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to catch and handle errors thrown by functions that you are using in your compositions.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Throwing errors from code implementations === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> When writing code, both from JavaScript and Python, you can use <code>Wikifunctions.Error()</code> to end the execution with a wanted error. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> <code>Wikifunctions.Error()</code> has two parameters: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Error type: a string containing the ZID of the error type you want to return.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Error arguments: a list of string arguments to build the error.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's go one by one: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Error type ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> An error type is an object that describes a kind of error that could happen in the system. There are a number of built-in error types but you can also build other error types that are more suited to your use case. When using errors, the best idea is to browse through the available error types, which can be explored in [[Special:ListObjectsByType/Z50|this list]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If there are no errors that fit your case, create a new one by going to the create page, and selecting "Error type" in the type selector. Then, set the necessary fields: </div> [[File:Error type.png|thumb|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Error type creation in Wikifunctions</span>|<span lang="en" dir="ltr" class="mw-content-ltr">To create new Error type (Z50), edit the label and add the necessary keys.</span>]] * <span lang="en" dir="ltr" class="mw-content-ltr">'''Label''' – This is the main title of the error, which should contain a short but descriptive message. Set the error label on the right-side box titled "About".</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Keys''' – Keys contain additional information about what caused the error. For example, if an input had the wrong format, you might want to inform the user of what was the input content when raising the error. To use them in your implementations, keys should be strings. To create a key, click on the "[+]" icon below "keys", select "String" under "value type", and add a label that describes it appropriately, for example "current input". Once you have all the necessary keys, you can Publish your error type and keep the ID of the newly created object.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error message''' – Error types can contain a multilingual array of HTML parametrized error messages. The parameter notation is $1, $2, etc., where the digit corresponds to the error type key. For example, when creating an error type with one string key "current input", the error message can use the positional parameter "$1", which will be replaced with the value of the "current input" key at the time of rendering the error. To add HTML messages, click on the "[+]" icon below "html fragments", select a language and input the HTML string.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Error arguments ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Error arguments correspond to the keys of the Error type, and they should provide additional information to understand the error. Error arguments should always be Strings. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Wikifunctions.Error() ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say that you want an error to be thrown when either your first or your second input are empty. You have already created the error type, and the assigned ZID was <code>Z30005</code>. Your error type has two string keys: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Input key: contains the key of the failing input</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Input value: contains the current value of the failing input</span> <div lang="en" dir="ltr" class="mw-content-ltr"> To raise an error in your JavaScript implementation you should do something like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { // If the first input is empty, raise error Z30005 // with two string args: [ first input key, first input value ] Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { // If the second input is empty, raise error Z30005 // with two string args: [ second input key, second input value ] Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> To raise an error in your Python implementation you should do something like this: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": # If the first input is empty, raise error Z30005 # with two string args: [ first input key, first input value ] Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": # If the second input is empty, raise error Z30005 # with two string args: [ first input key, first input value ] Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Remember that calling <code>Wikifunctions.Error()</code> ends the execution! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Throwing errors from compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If you are creating a composition implementation, you can throw an error by calling the special function {{Z|Z851}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Throw Error function (Z851) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z851}} function is similar to the <code>Wikifunctions.Error()</code> method and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – A reference to the Error type you want to raise</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error parameters''' – A list with the arguments to create your Error, which should also be Strings.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Throw Error ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say you want to modify your composition so that it first checks that the arguments are not empty, and raises an error when it finds an empty one. Then, if none of them are empty, it runs the original composition, which is: </div> <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> To do this, you need to create conditional paths, for which you can use the {{Z|Z802}} function. Think of it like this: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the first argument is empty, throw an error for the first argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Else, proceed to check the second argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the second argument is empty, throw an error for the second argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Else, proceed with the success path and return the joint strings with the space separator</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Or in functional pseudo code: </div> <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), throw_error( Z30005, [ "Z30000K1", Z30000K1 ] ), if( is_empty_string( Z30000K2 ), throw_error( Z30005, [ "Z30000K2", Z30000K2 ] ), join_with_separator( Z30000K1, Z30000K2, " " ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's create this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+” button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›” icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the outermost function you want to use, which in this case is "if".</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Check the validity of the first argument:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "condition", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "is empty string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "input", click on the "…" button and select "argument reference"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id", select the first input (e.g. "first string")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse the "condition" function call if you want, by clicking on the down-chevron next to "condition". You should see something like "f(x) is empty string( → first string )"</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Throw error if the condition is true:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "then", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Throw Error"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error type", search and select your error type (you can directly input the error ID if you know it, e.g. Z30005)</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error parameters", add two items by clicking on the "+" button</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For "Item 1" (offending argument key), set its type to "String" and write the argument identifier (e.g. "first input", or "Z30000K1")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For "Item 2" (offending argument value), click on the "…" next to "Item 2" and select "argument reference"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id", select the first input (e.g. "first string")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse the "then" function call if you want, by clicking on the down-chevron next to "then". You should see something like "f(x) Throw Error( Input was the wrong format, Typed list( Object, "first input", → first string ) )"</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Continue to check the second argument if the first was good:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "else", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "if"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Set up "condition" to check the validity of the second argument by following the same process as described in step 5.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Set up "then" to throw an error for the second argument by following the same process as described in step 6.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Finally, set up the success path:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to the nested "else", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the successful function, which in this case can be "join strings with separator"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and set it to "argument reference", then select "first string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and set it to "argument reference", then select "second string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "separator" add a space into the text field</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The resulting function call should look like this: </div> [[File:Throw error expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function</span>]] [[File:Throw error collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function, in its collapsed view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function, in its collapsed view</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Handling errors in compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> While it is useful to allow functions to raise expected errors, it is crucial to be able to handle errors in your compositions in order to safely use these functions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say you want to create a new function "full name of a person" – we will refer to it with the ZID <code>Z30010</code>. This function should return the full name of a person given a first and last names, but if any of the two fields are empty, it should return the text "Unknown" instead. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You could create a composition using our example function "Join two strings with a space" or <code>Z30000</code> to generate the name. If any of the inputs are empty, you know that <code>Z30000</code> will throw an error of type <code>Z30005</code>. Using the function {{Z|Z850}} as a wrapper, you can attempt the join operation and intercept a possible error to simply return "Unknown" whenever it occurs. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Try-Catch function (Z850) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z850}} function is built-in with ZID <code>Z850</code> and takes three arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – The initial function call to run. If nothing goes wrong, the response will be the result of this function call.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – An error type to catch in case it is thrown during the execution of the first function call.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error handler''' – A function call that will be run in case the error specified above is caught during the execution of the initial function call. If that happens, the result of the error handler will be the value returned.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Try-Catch ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Once we have all the functions for our composition, we can craft it like this: </div> <syntaxhighlight lang="prolog"> try_catch( join_with_space( Z30010K1, Z30010K2 ), Z30005, echo( "Unknown" ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This means that: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">The "Join two strings with a space" function will be tried with the two inputs and, if everything goes well, the output of this function will be returned</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If any of the inputs are blank, "Join two strings with a space" with raise an error of type <code>Z30005</code></span> * <span lang="en" dir="ltr" class="mw-content-ltr">Our {{Z|Z850}} will then detect this error and run the {{Z|Z801}} function to return "Unknown"</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's create this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›” icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the outermost function you want to use, which in this case is "Try-Catch".</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Set the main function call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under the field where the "Try-Catch" function is selected, next to the "function call" key, click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the function "join two strings with space"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and select "argument reference", then select the "first name" argument from the dropdown.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and select "argument reference", then select the "second name" argument from the dropdown.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Select the error to catch:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error type", search and select "bad string input" – you can search directly by its ZID <code>Z30005</code></span> # <span lang="en" dir="ltr" class="mw-content-ltr">Set the error handler function call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "error handler", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "echo"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "input" and "type", search and select the type "String"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now, under "input", type "Unknown" in the text field</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The resulting function should look like this: </div> [[File:Try catch expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in expanded mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in expanded mode</span>]] [[File:Try catch collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in collapsed mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in collapsed mode</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Testing your failure use cases === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As we introduced in the above section about [[#Practice Test-Driven Development|practicing TDD]], it's important to test not only the most common paths, but also the possible edge cases. It is equally important to test failure behavior. In this section we will give you the tools necessary to test that your function fails with a given set of inputs, and that the error thrown is the expected one. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> To do that, you will need other two system functions: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Is error type (Z852) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z852}} function is built-in with ZID <code>Z852</code> and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error''' – An {{Z|Z5}} object, which can be thrown by a failing call. An error instance has a type and a value.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – A reference to an {{Z|Z50}} which will be compared to the type of the Error passed as a first argument. If that's the case, the function will return true.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Get error thrown by function call (Z853) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z853}} function is built-in with ZID <code>Z853</code> and takes one argument: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – A function call which can either return a successful value of any type, or throw an error.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> This function returns a {{Z|Z882}} with a {{Z|Z40}} in first place and an {{Z|Z1}} in the second: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the Function call runs successfully and hence does not throw any error, the returned pair will contain False in the first place, and void in the second.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the Function call throws an error, the returned pair will contain True in the first place, and the caught error in the second.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> To use this function in your compositions, you might need to use the additional functions: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">{{Z|Z821}}, and</span> * {{Z|Z822}} <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Testing errors ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say our target function, "Join two strings with a space" or <code>Z30000</code>, throws an error of type <code>Z30005</code> and we want to test this behavior. To do that we need to: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Throw a failing function call</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Get the error using the function {{Z|Z853}}</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Check that the error is the right type with {{Z|Z852}}</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Tests have two fields: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Call''' – A function call that will produce an output with the inputs you want to test. This call will return a value.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Result validation''' – A function call that will validate that the value returned by the call above is the expected one. The first argument of this function call will be automatically assigned to take the return value of the first call.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> For step-by-step instructions on how to create tests, see {{ll|Wikifunctions:Introduction#Create_tests}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In our example, we can structure it like this — but this is not the only way! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The call, which will return an {{Z|Z5}} object: </div> <syntaxhighlight lang="prolog"> error = get_second_element_of_typed_list( get_error_thrown_by( join_strings_by_whitespace( "", "not empty" ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> And the result validation, which will take the {{Z|Z5}} object as its first argument: </div> <syntaxhighlight lang="prolog"> is_error_type( error, Z30005 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's do this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding a test by clicking on the "+" button in the "Tests" table from your Function page. The "call" and "result validation" fields already have some functions pre-set, but to test the errors we will need to change them.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">First, let's set the call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "call", click the "›" chevron button to expand the function call.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", edit the field and search and select the function "Get second element of a typed pair"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Once selected, next to "Typed pair", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Get error thrown by function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "function call", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Join two strings with a space" (or by ZID <code>Z30000</code>)</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now set the inputs so that they cause a failure: at least one of them should be empty.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse your "call" by clicking again on the down-chevron button if you want!</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Next, let's set the result validation:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "result validation", click the "›" chevron button to expand the function call.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", edit the field and search and select the function "Is error type"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now you will only be asked to configure the second argument. Under "error type", search and select your <code>Z30005</code> error type.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">And you are done! You can now click the circular arrow in the "Implementations" box and you should see green checks.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> If everything went right, you can now save your test. It should look like this: </div> [[File:Get error expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in expanded mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in expanded mode</span>]] [[File:Get error collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in collapsed mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in collapsed mode</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Creating actionable error messages === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As described above, Error Types have an optional key <code>Z50K3</code> which contains a multilingual list of HTML strings. When rendering information about an error, the messages stored in the error type can help create a clear, precise, informative, translatable and actionable error message. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For that purpose, error messages can contain parameters like <code>$1</code>, <code>$2</code>, etc., where the digit corresponds to the error type argument and its value in the error instance. These error messages are rendered in Wikifunctions inside the "Details" dialog window after executing a function call. Additionally, these error messages are surfaced in other client interfaces, like Abstract Wikipedia, to provide better guidance to Abstract Content editors. </div> [[File:Wikifunctions actionable error message example in the Details dialog.png|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">The error message is rendered using the HTML message of the error type and the error argument values.</span>]] [[File:Wikifunctions actionable error message example in Abstract Wikipedia.png|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">When available, the HTML error message is rendered in the Abstract Wikipedia preview section.</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> Let's use a real example to understand the benefits of HTML error messages: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The function {{Z|Z37847}} returns the first Lexeme reference given a Wikidata Item reference and a language. When there is no Lexeme for this Item-Language combination, it throws an error of type {{Z|Z28248}}, which has three keys: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K1''' is the input Wikidata item QID</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K2''' is the connecting property, in this case <code>P5137/item for this sense</code></span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K3''' is the language code</span> <div lang="en" dir="ltr" class="mw-content-ltr"> When calling this function for a Wikidata lexeme that doesn't exist, the call will throw an error instance like this: </div> <syntaxhighlight lang="json" highlight="10,12"> { "Z1K1": "Z5", "Z5K1": "Z28248", "Z5K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z885", "Z885K1": "Z28248" }, "Z28248K1": "Q319", "Z28248K2": "P5137", "Z28248K3": "ast" } } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> While the error type label indicates: <code>No matching lexeme for item in language</code>, a better error message should indicate: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">which is the failing item,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">which is the language missing, and</span> * <span lang="en" dir="ltr" class="mw-content-ltr">what are the possible ways to fix it.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The error message <code>Z50K3</code> field can provide this functionality. Whenever an Error Type has an error message for the user language (or any of its fallbacks), the error message shown will be rendered by: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">First, replacing the message parameters with the values of the keys. In our example, any <code>$1</code> will be replaced with the value of <code>Z28248K1</code> ("Q319"), <code>$2</code> with "P5137", and <code>$3</code> with "ast",</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Last, sanitizing and rendering the HTML message.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> So a HTML message like: </div> <syntaxhighlight lang="html"> There is no matching lexeme for the item $1 in "$3".<br> <a href="http://wikidata.org/wiki/$1">Edit in Wikidata</a> </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Will become: </div> : There is no matching lexeme for the item Q319 in "ast" : [[d:Q319|Edit in Wikidata]] <div lang="en" dir="ltr" class="mw-content-ltr"> == Debugging your implementations == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Sometimes things can go wrong. A function might behave differently than expected or a value might not look quite right. Sometimes implementations are really complex and, because they are run in a sandboxed environment, it can seem really difficult to debug. To help understand what's going on inside a function call, Wikifunctions includes a small set of debugging tools. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> These tools don't change the result of a function, but will add extra information to the returned metadata, which you can observe after running the function. You can use <code>Wikifunctions.Debug()</code> from your code implementations or the function {{Z|Z854}} from your compositions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section you will learn: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">How to add debug messages from both code and composition implementations,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to inspect the metadata manually or via the UI to inspect these logs.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Debugging your code implementations === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> When writing code, both from JavaScript and Python3, you can use <code>Wikifunctions.Debug()</code> to add a message to your debugging log and continue the execution. </div> {{phab|T441028}} <div lang="en" dir="ltr" class="mw-content-ltr"> <code>Wikifunctions.Debug()</code> has one parameter, which is generally expected to be a string. However, any other object passed as parameter will get directly converted into a string. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If we want to add debug logs to our code implementations for our "Join two strings with a space" example function, we can do, in JavaScript: </div> <syntaxhighlight lang="JavaScript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { Wikifunctions.Debug( `first input is empty "${ Z30000K1 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { Wikifunctions.Debug( `second input is empty "${ Z30000K2 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } Wikifunctions.Debug( "both inputs are fine" ); return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> And the same in your Python3 implementation will be: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": Wikifunctions.Debug( 'first input is empty "'+Z30000K1+'"' ) Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": Wikifunctions.Debug( 'second input is empty "'+Z30000K2+'"' ) Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) Wikifunctions.Debug( 'both inputs are fine' ) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This way, no matter what happens, we will be adding one message to your debugging logs: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the function call fails when checking on the first or second input, the result of the execution will be a failure, but it will contain one informative log about what branch caused the failure.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the function call succeeds—because both inputs are valid—the function call will return the joined string, but the returned metadata will also contain a debug log.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Debugging your compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> To support debugging compositions, Wikifunctions provides the built-in function {{Z|Z854}}. This function allows you to attach debug messages to the execution of any function call that generates the final output. The debug logs collected during the evaluation are returned as part of the execution metadata, under the <code>executorDebugLogs</code> key. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Add debug log to function call (Z854) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z854}} function is built-in with ZID <code>Z854</code> and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – Any composition you want to execute.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Debug log''' – A string message that will be recorded if the given function call is evaluated.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> When the wrapped function call runs, the provided message is added to the execution logs. If that function call is not executed, or its execution is not part of the final output, its debug log will not appear in the final result metadata. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You will benefit from this built-in if you want to observe: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Which branch of a conditional was executed, or</span> * <span lang="en" dir="ltr" class="mw-content-ltr">the order of evaluation in a composition.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Add debug log to function call ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say that you want to add debug logs to our example function "Join two strings with a space" or <code>Z30000</code>, so that different messages are added to the different possible outcomes. You could use our debugging builtin like this: </div> <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), add_debug_log( throw_error( Z30005, ... ), 'failed on first input' ) if( is_empty_string( Z30000K2 ), add_debug_log( throw_error( Z30005, ... ), 'failed on second input' ), add_debug_log( join_with_separator( Z30000K1, Z30000K2, " " ), 'both inputs are ok!' ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This way, </div> * <span lang="en" dir="ltr" class="mw-content-ltr">when called with an empty first input, the function will return a failed response, and the metadata will contain an <code>executorDebugLogs</code> entry with the "failed on first input" log.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">When called with an empty second input, the call will also fail, but the logged message will be "failed on second input"</span> * <span lang="en" dir="ltr" class="mw-content-ltr">When called with valid inputs, the function will return a successful response, and additionally the metadata will contain "both inputs are ok" in its <code>executorDebugLogs</code> key.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> This is the way this composition would look: </div> [[File:Add debug log expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Composition implementation using Add debug logs to log all possible execution paths</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Composition implementation using Add debug logs to log all possible execution paths</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Accessing execution debug logs === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Whether your execution logs are added via <code>Wikifunctions.Debug()</code> or via the {{Z|Z854}} built-in function, they are returned as part of the response metadata. To see the logs, once you run your function, click on the "Details" button that appears at the bottom of the "Result" section. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The error and debug information will appear at the top of the "Details" dialog. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> This is what you would see when running the composition from our previous example with valid and invalid inputs: </div> {| class="wikitable" | [[File:Execution logs success.png|frameless|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a successful execution with debug logs</span>]] | [[File:Execution logs failure.png|frameless|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a failed execution with debug logs</span>]] |- | <span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a successful execution: shows no errors, but displays the successful execution log: ''"both inputs are ok!"''</span> | <span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a failed execution: shows the error information, and the additional execution log for the first failure branch: ''"failed on first input"''</span> |} [[Category:How to create implementations| {{#translation:}}]] kkm3tsiej6i4n9dq5e1yuz49p5qdojm Wikifunctions:How to create implementations/bn 4 22538 331109 276445 2026-10-23T08:23:19Z FuzzyBot 207 Updating to match new version of source page 331109 wikitext text/x-wiki <languages/> এই পৃষ্ঠাটি {{ll|Wikifunctions:Introduction}} এ প্রদত্ত সংক্ষিপ্তসারের তুলনায় একটি '''বাস্তবায়ন তৈরি করা''' সম্পর্কিত আরও বিস্তারিত নির্দেশিকা প্রদান করে। <div lang="en" dir="ltr" class="mw-content-ltr"> == Types of Implementations == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In Wikifunctions, an '''implementation''' can take one of two main forms: '''code''' or '''composition'''. A code implementation directly expresses the function’s logic in any of the available programming languages (currently, Python3 or JavaScript). It’s most useful when the function’s behavior can’t easily be built from existing Wikifunctions, or when precise control over data processing is needed. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> A composition implementation, on the other hand, defines the function entirely by combining other existing functions, without writing code. Compositions are easier to understand, reuse, and translate into other languages automatically, but they depend on suitable building blocks already being available and often are less performant. In general, start by checking whether your goal can be achieved through composition; if it can’t, or if performance or fine-grained logic matters, choose a code implementation instead. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> There's a third type of implementation: '''built-ins'''. These are run by system-built code, and are not editable. Most likely all pre-defined functions will have a built-in implementation. In such cases, when opening the implementation page, you will see a message stating ''"{{int|wikilambda-implementation-selector-none}}"'' </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Practice Test-Driven Development == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> '''Test-Driven Development''', or '''TDD''', is a way of creating software where you write tests before you write the actual code. Tests are just a way of understanding what your function is supposed to do by listing examples and how they should work. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In Wikifunctions, writing tests first offers significant benefits. If you are working on an implementation, you can run your code against the existing tests to check that it behaves as expected. This makes it easier to catch errors early before even publishing your implementation. Tests are also a powerful way to describe the function you need. By writing tests, '''you clearly communicate the expected behavior''', and the community can step in and help with the implementation, or create alternative implementations. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Imagine you want to implement a Function that combines two strings with a space in between. A basic test for this might look like: </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello", "world" ) => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Once you have defined the basic behavior, it's important to '''think about edge cases'''—situations where the inputs are such that you might need some special behavior. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, what if your first string ends in a space, or your second string starts with a space? Should the function keep all existing spaces and add another one, or should it return a neatly spaced result with just a single space between the words? Depending on your requirements, you should build a test for such a case. For example, a test for this edge case could be either one of these — but not both!: </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> or ... </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Make sure that all possible special cases are covered by your tests, and once you have them, make sure that they are all connected to the Function by selecting them and clicking "Connect". </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Code implementations == </div> [[File:Code implementation.png|thumb|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions code editor initialized with a function template</span>|<span lang="en" dir="ltr" class="mw-content-ltr">When adding a new code implementation, the function template is initialized with the function and argument names</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> When creating an implementation using code, the Wikifunctions UI will set up a code editor with the selected language activated for syntax highlighting and validation. When the function to implement and the programming language are selected, this editor will be set with the correct function template: '''do not remove or edit this'''! Keep your code inside this function signature: if you need auxiliary functions, you can simply declare them inside your top-level function declaration. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Using input types in your code === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions types {{Z|Z6}} and {{Z|Z40}} can be used as if they were native types in both JavaScript and Python3. For example, a String input can be concatenated or a Boolean be directly used in a logical expression. To use other types in your code implementations, you will have to look deeper into the type, figure out if it has a conversion to a native equivalent, and treat it accordingly. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, let's say we want to write some Python code that handles an input of type {{Z|Z20420}}. In the page for this type, let's look at its "type converters to code" and search for a Python one. The converter {{Z|Z20424}} will be applied to our date input before our code, so looking at "native type" we know that our input will be a Python ''dict'' and looking at the implementation we can see the keys we can expect: </div> <syntaxhighlight lang="python3"> return { 'K1': year, 'K2': month, 'K3': day } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> When a type doesn't have a converter, you'll have to access its parts directly using its keys. For example, let's assume that your function <code>Z30000</code> has one input <code>Z30000K1</code> of type {{Z|Z11}}. This type has two keys: <code>Z11K1</code> for the language (itself an object of type {{Z|Z60}}), and <code>Z11K2</code> for the string value. Similarly, the language object has a key <code>Z60K1</code> for the language code. So, to get a string with the language code and the text, you can write: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1 ) { // e.g. "en: some text" return Z30000K1.Z11K1.Z60K1 + ": " + Z30000K1.Z11K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> For a quick reference of the available type conversions visit [[Special:MyLanguage/Wikifunctions:Execution targets#Default type conversion|the default type conversion table]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Returning the right outputs === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Similarly to the way you treat inputs, outputs need to match the type specified in the function definition. Some can be treated as simply as native types, so any string output will be converted into a Wikifunctions {{Z|Z6}} object and any native boolean returned by your implementation will be converted into a Wikifunctions {{Z|Z40}} object. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Those types that have "type converters from code" will apply the appropriate function to the output, in order to build the required type. Following the example of {{Z|Z20420}}, the {{Z|Z20443}} will transform the output from your implementation–a dict with K1, K2 and K3 keys–into its correct ZObject representation. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For types that don't have converters from code, you can carefully build and return the output objects. For example, imagine that our function <code>Z30000</code> takes two string inputs: language code and text, and should return a {{Z|Z11}} object. You can do this in Python by using the <code>ZObject</code> constructor: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): lang_object = ZObject( {"Z1K1": "Z9", "Z9K1": "Z60"}, Z60K1 = Z30000K1 ) return ZObject( {"Z1K1": "Z9", "Z9K1": "Z11"}, Z11K1 = lang_object, Z11K2 = Z30000K2 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Or in JavaScript: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { const langObject = new ZObject( new Map( [ [ "Z60K1", Z30000K1 ] ] ), { "Z1K1": "Z9", "Z9K1": "Z60" } ); const monolingualKeys = new Map( [ [ "Z11K1", langObject ], [ "Z11K2", Z30000K2 ] ] ); return new ZObject( monolingualKeys, { "Z1K1": "Z9", "Z9K1": "Z11" } ); } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> You can learn more about the <code>ZObject</code> class and other useful constructors in {{ll|Wikifunctions:Execution_targets#Custom_and_non-built-in_type_conversion}} </div> {{phab|T392750}}<div lang="en" dir="ltr" class="mw-content-ltr"> As of 2026-05, trying to return a list of lists may fail, so you're not able to implement such functions in code. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Code in Python === </div> <div class="mw-translate-fuzzy"> নিম্নলিখিতগুলিতে আমরা পাইথনে কোড আকারে কীভাবে একটি বাস্তবায়ন তৈরি করতে হয় তার একটি সুনির্দিষ্ট উদাহরণ প্রদান করি। ধরুন আমরা একটি ফাংশনের জন্য একটি বাস্তবায়ন তৈরি করতে চাই যা দুটি ইনপুট অক্ষরসারিকে (স্ট্রিং) তাদের মধ্যে একটি খালি স্থান রেখে একত্রিত করবে এবং তাদের ফলাফলটি ফেরত দেয়। ধরা যাক সেই ফাংশনের Z-আইডি হল Z11057। </div> <div class="mw-translate-fuzzy"> বাস্তবায়নের সংজ্ঞা দেওয়া হয় ফাংশনের Z-আইডি ব্যবহার করে। একই ভাবে ফাংশনের আর্গুমেন্টও গুলোকেও। সুতরাং ফাংশন Z11057 এর ক্ষেত্রে তার দুটি আর্গুমেন্ট সহ, প্রথম লাইনটি দেখতে হবে: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> As we described before, we know that the arguments (<code>Z30000K1</code> and <code>Z30000K2</code>) are Strings, so we can treat them as simply as we use native strings in Python. Also, the function should return a String. For our example, we simply return the two arguments concatenated with a space in between: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): return Z30000K1 + " " + Z30000K2 </syntaxhighlight> যেহেতু এটি পাইথন, তাই এই লাইনটি ইন্ডেন্ট করতে ভুলবেন না। <div lang="en" dir="ltr" class="mw-content-ltr"> If you have followed our advice to [[#Practice Test-Driven Development|practice TDD]], you will already have a set of tests that you know should work. If that's the case, while building your implementation you can click on the circular arrow in the Tests panel, and see if your implementation passes all of them. </div> মনে রাখবেন যে রানটাইমের কোনও অবস্থা নেই। গ্লোবাল বা স্ট্যাটিক ভেরিয়েবলের মান ধরে নেবেন না। পাইথনে কী করতে পারেন এবং কী করতে পারেন না সে সম্পর্কে আপনার যদি আরও প্রশ্ন থাকে, তাহলে [[Wikifunctions:Python implementations]] পাতায় জিজ্ঞাসা করুন। <div lang="en" dir="ltr" class="mw-content-ltr"> === Code in JavaScript === </div> <div class="mw-translate-fuzzy"> নিম্নলিখিতগুলিতে আমরা জাভাস্ক্রিপ্টে কোড আকারে কীভাবে একটি বাস্তবায়ন তৈরি করতে হয় তার একটি সুনির্দিষ্ট উদাহরণ প্রদান করি। ধরুন আমরা একটি ফাংশনের জন্য একটি বাস্তবায়ন তৈরি করতে চাই যা দুটি ইনপুট অক্ষরসারিকে (স্ট্রিং) তাদের মধ্যে একটি খালি স্থান রেখে একত্রিত করবে এবং তাদের ফলাফলটি ফেরত দেয়। ধরা যাক সেই ফাংশনের Z-আইডি হল Z11057। </div> <div class="mw-translate-fuzzy"> বাস্তবায়নের সংজ্ঞা দেওয়া হয় ফাংশনের Z-আইডি ব্যবহার করে। একই ভাবে ফাংশনের আর্গুমেন্টও গুলোকেও। সুতরাং ফাংশন Z11057 এর ক্ষেত্রে তার দুটি আর্গুমেন্ট সহ, প্রথম লাইনটি দেখতে হবে: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> We know that the arguments (<code>Z30000K1</code> and <code>Z30000K2</code>) are Strings, so we can treat them as native strings in JavaScript. Also, the function should return a String. To complete our function, you can then add a line concatenating the input strings, like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> If you have tests as recommended in the [[#Practice Test-Driven Development|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes all of them. </div> মনে রাখবেন যে রানটাইমের কোনও অবস্থা নেই। গ্লোবাল বা স্ট্যাটিক ভেরিয়েবলের মান ধরে নেবেন না। আপনি জাভাস্ক্রিপ্টে কী করতে পারেন এবং কী করতে পারেন না সে সম্পর্কে আপনার যদি আরও প্রশ্ন থাকে, তাহলে [[Wikifunctions:JavaScript implementations]]-এ জিজ্ঞাসা করুন। <div lang="en" dir="ltr" class="mw-content-ltr"> === Calling another Wikifunctions function === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> A code implementation can call certain other Wikifunctions functions, receive the output of the call, and use that output in further processing. We refer to such calls as callbacks. At present, due to security and performance concerns, only the following built-in Wikidata fetch and search functions can be called in this way: {{Z|Z6820}}, {{Z|Z6821}}, {{Z|Z6822}}, {{Z|Z6824}}, {{Z|Z6825}}, {{Z|Z6826}}, {{Z|Z6830}}, and {{Z|Z6831}}. This capability is in an initial stage of deployment; we hope to allow calls to a broader range of functions in the future. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Let’s look at a JavaScript implementation containing a callback. This implementation fetches an item from Wikidata, extracts the label of that item in a given language, and returns the label string. The item to fetch is given by argument <code>Z400K1</code>, and the language is given by <code>Z400K2</code>. </div> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const item = Wikifunctions.Call('Z6821', Z400K1); for (const label of item.Z6001K2.Z12K1) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> A callback is made by calling <code>Wikifunctions.Call</code>, as shown in the example. The first argument to <code>Wikifunctions.Call</code> is always the ZID of the function to be called – in this case, {{Z|Z6821}}, which takes a single argument. Following that, the arguments to be passed to that function are listed, separated by commas. Here, that argument, <code>Z400K1</code>, is the same value that was passed to the function <code>Z400</code>. This is a common pattern of argument passing to callbacks, but their arguments can also be built using the <code>ZObject</code> constructor (as explained above), or obtained in other ways. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The value of <code>Z400K1</code> would be an instance of {{Z|Z6091}}, containing the QID of the item to be fetched. Line 2 of the example calls <code>Z6821</code> to fetch that item from Wikidata and assigns the resulting ZObject to the const <code>item</code>. The remaining code iterates over the item’s labels until it finds the one matching the language given by <code>Z400K2</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For the first example above, we have used <code>Z6821</code> for simplicity. However - unless an entire entity is needed by the implementation, it is strongly recommended to use <code>Z6820</code> to retrieve Wikidata items, which can be quite large. Although a call to <code>Z6820</code> is a bit more complex, its parameters allow for fetching selected portions of a Wikidata item, which can greatly improve performance and avoid some errors, by reducing the network bandwidth and processing time that are needed. (<code>Z6820</code> can also be used in place of <code>Z6822</code>, <code>Z6824</code>, <code>Z6825</code>, and <code>Z6826</code>, to get similar bandwidth-reduction benefits.) </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Just below we show how <code>Z6820</code> can be used, in <code>Wikifunctions.Call</code>, to implement the same behavior as above. Note that we use the second argument passed to <code>Z6820</code>, <code>[labelsPart]</code>, to say “Just return the item’s labels”, and we use the third argument, <code>[Z400K2]</code>, to say “Just return labels in the given language”. (This argument would also apply to aliases and descriptions, if they were included in the result.) </div> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const labelsPart = new ZObject( new Map( [ ['Z6030K1', new ZReference('Z6033')] ] ), {Z1K1: 'Z9', Z9K1: 'Z6030'} ); const entities = Wikifunctions.Call( 'Z6820', [Z400K1], [labelsPart], [Z400K2], []); const item = entities.get(Z400K1.Z6091K1); const labels = item.Z6001K2.Z12K1; for (const label of labels) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Other things to note: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Even though code implementations are now able to fetch Wikidata entities, it is recommended that they not be written to return ''entire'' entities. This is because of current limitations on the size of the value returned from a code implementation. To fetch and return an entire large entity, it’s better to call the fetch function from a composition.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Only one callback can execute at a time. For security reasons, it is not possible to use the concurrency features of JavaScript or Python to execute multiple callbacks in parallel.</span> ** <span lang="en" dir="ltr" class="mw-content-ltr">Keep in mind, however, that you can fetch multiple entities at once using Z6820.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">There is currently a 3 MiB limit on the size of Wikidata content that can be returned to a code implementation, by a single callback. The same limit applies to the size of the result returned from a code implementation.</span> <span id="Compositions"></span> <div class="mw-translate-fuzzy"> == ফাংশন প্রণয়ন == </div> <div class="mw-translate-fuzzy"> নিম্নলিখিতগুলিতে আমরা একটি প্রণয়ন আকারে বাস্তবায়ন তৈরি করার সুনির্দিষ্ট উদাহরণ প্রদান করি। ধরুন আমরা একটি ফাংশনের জন্য একটি বাস্তবায়ন তৈরি করতে চাই যা দুটি ইনপুট স্ট্রিংকে তাদের মধ্যে একটি খালি স্থান ছেড়ে একত্রিত করে এবং তার ফলাফলটি ফেরত দেয়। ধরা যাক সেই ফাংশনের Z-আইডি হল Z11057। </div> <div class="mw-translate-fuzzy"> পছন্দসই আউটপুট তৈরি করার জন্য বিদ্যমান ফাংশনগুলিকে কীভাবে একত্রিত করা যায় সে সম্পর্কে প্রথমে চিন্তা করা সাধারণত একটি ভাল ধারণা। কখনও কখনও এটি তুচ্ছ হতে পারে এবং আপনি কেবল প্রণয়নকৃত ফাংশন নিয়ে এগিয়ে যেতে পারেন, তবে অনেক ক্ষেত্রে পছন্দসই প্রণয়নটি নোট করা উপযুক্ত। ফাংশন প্রণয়ন সম্পাদনার ক্ষেত্রে উইকিফংশন প্রণয়ন ইন্টারফেসটি এখনও খুব ভাল নয়, তাই আপনি ঠিক কী তৈরি করতে চান তা প্রথমে নির্ধারণ করা ভাল। </div> <div class="mw-translate-fuzzy"> উদাহরণস্বরূপ, প্রদত্ত ফাংশনের জন্য, আমরা বিদ্যমান [[{{Z|Z10000}}|''অক্ষরসারি গুলোকে সংযুক্ত করার ফাংশন'']] ব্যবহার করতে পারি। সেই ফাংশনটি দুটি অক্ষরসারি নেয় এবং তাদের একটি অক্ষরসারিতে পরিণত করে। কিন্তু আমাদের তাদের মাঝে একটি শূন্যস্থান যোগ করতে হবে। তাই আমরা প্রথমে, প্রথম অক্ষরসারির শেষে একটি শূন্যস্থান সংযুক্ত করি এবং তারপর সেই প্রথম অক্ষরসারির ফলাফলের সাথে দ্বিতীয় অক্ষরসারিটিকে সংযুক্ত করি। সুতরাং আমাদের প্রণয়নটিকে এইভাবে বর্ণনা করা যেতে পারে: </div> <syntaxhighlight lang="prolog"> join_strings( join_strings( Z30000K1, " " ), Z30000K2 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> There are multiple ways to write a composition: notice that the same thing could be accomplished with: </div> <syntaxhighlight lang="prolog"> join_strings( Z30000K1, join_strings( " ", Z30000K2 ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> An alternative implementation could also use the existing Function {{Z|Z15175}}, so your composition could be: </div> <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> As you can see, there are multiple ways to accomplish this, so take your time and explore the existing functions available in the {{ll|Wikifunctions:Catalogue}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's try to create the second example, <code>join_strings(Z30000K1, join_strings(" ", Z30000K2))</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In order to create this: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›" icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search for the name of the outermost function you want to use, which in this example is "join two strings". Then, select the wanted function from the dropdown list.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">You will see two new fields, one for each of the arguments needed for the selected function.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">For the first argument, we want to select the first input to our function:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and select "Argument reference".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id" you can now select the first string of your function from the dropdown, which contains all available inputs.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">For the second argument, we want to use the result of another call to "join two strings":</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and select "Function call".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function you want to call, which is again "join two strings".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For this inner function call, configure the "first string" by simply typing a white space in the text field, and configure the "second string" as you did for step 6: change it using the "…" button to "Argument reference", and then select the second argument in the dropdown.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Your composition is now complete! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You can expand and collapse the details using the chevron buttons to see how it looks. If you already have Tests as recommended in the [[#Practice Test-Driven Development|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes the tests. Once your composition passes the tests, go ahead and publish it. </div> [[File:Composition implementation expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its expanded view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its expanded view</span>]] [[File:Composition implementation collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its collapsed view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its collapsed view</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions error handling == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As a Wikifunctions function creator, you might want to warn the user calling your function when something goes wrong in the code, or when their inputs do not fit a certain criteria. For example, if your Function expects a string input to contain a name, you might want to check that the name is not empty and, if it is, show an error message that the person using your Function can understand. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For this purpose, you can use <code>Wikifunctions.Error()</code> from your code implementations or the function {{Z|Z851}} from your compositions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section you will learn: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">How to throw errors from both code and composition implementations,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to write tests for error cases, and</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to catch and handle errors thrown by functions that you are using in your compositions.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Throwing errors from code implementations === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> When writing code, both from JavaScript and Python, you can use <code>Wikifunctions.Error()</code> to end the execution with a wanted error. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> <code>Wikifunctions.Error()</code> has two parameters: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Error type: a string containing the ZID of the error type you want to return.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Error arguments: a list of string arguments to build the error.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's go one by one: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Error type ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> An error type is an object that describes a kind of error that could happen in the system. There are a number of built-in error types but you can also build other error types that are more suited to your use case. When using errors, the best idea is to browse through the available error types, which can be explored in [[Special:ListObjectsByType/Z50|this list]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If there are no errors that fit your case, create a new one by going to the create page, and selecting "Error type" in the type selector. Then, set the necessary fields: </div> [[File:Error type.png|thumb|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Error type creation in Wikifunctions</span>|<span lang="en" dir="ltr" class="mw-content-ltr">To create new Error type (Z50), edit the label and add the necessary keys.</span>]] * <span lang="en" dir="ltr" class="mw-content-ltr">'''Label''' – This is the main title of the error, which should contain a short but descriptive message. Set the error label on the right-side box titled "About".</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Keys''' – Keys contain additional information about what caused the error. For example, if an input had the wrong format, you might want to inform the user of what was the input content when raising the error. To use them in your implementations, keys should be strings. To create a key, click on the "[+]" icon below "keys", select "String" under "value type", and add a label that describes it appropriately, for example "current input". Once you have all the necessary keys, you can Publish your error type and keep the ID of the newly created object.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error message''' – Error types can contain a multilingual array of HTML parametrized error messages. The parameter notation is $1, $2, etc., where the digit corresponds to the error type key. For example, when creating an error type with one string key "current input", the error message can use the positional parameter "$1", which will be replaced with the value of the "current input" key at the time of rendering the error. To add HTML messages, click on the "[+]" icon below "html fragments", select a language and input the HTML string.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Error arguments ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Error arguments correspond to the keys of the Error type, and they should provide additional information to understand the error. Error arguments should always be Strings. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Wikifunctions.Error() ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say that you want an error to be thrown when either your first or your second input are empty. You have already created the error type, and the assigned ZID was <code>Z30005</code>. Your error type has two string keys: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Input key: contains the key of the failing input</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Input value: contains the current value of the failing input</span> <div lang="en" dir="ltr" class="mw-content-ltr"> To raise an error in your JavaScript implementation you should do something like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { // If the first input is empty, raise error Z30005 // with two string args: [ first input key, first input value ] Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { // If the second input is empty, raise error Z30005 // with two string args: [ second input key, second input value ] Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> To raise an error in your Python implementation you should do something like this: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": # If the first input is empty, raise error Z30005 # with two string args: [ first input key, first input value ] Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": # If the second input is empty, raise error Z30005 # with two string args: [ first input key, first input value ] Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Remember that calling <code>Wikifunctions.Error()</code> ends the execution! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Throwing errors from compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If you are creating a composition implementation, you can throw an error by calling the special function {{Z|Z851}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Throw Error function (Z851) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z851}} function is similar to the <code>Wikifunctions.Error()</code> method and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – A reference to the Error type you want to raise</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error parameters''' – A list with the arguments to create your Error, which should also be Strings.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Throw Error ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say you want to modify your composition so that it first checks that the arguments are not empty, and raises an error when it finds an empty one. Then, if none of them are empty, it runs the original composition, which is: </div> <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> To do this, you need to create conditional paths, for which you can use the {{Z|Z802}} function. Think of it like this: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the first argument is empty, throw an error for the first argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Else, proceed to check the second argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the second argument is empty, throw an error for the second argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Else, proceed with the success path and return the joint strings with the space separator</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Or in functional pseudo code: </div> <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), throw_error( Z30005, [ "Z30000K1", Z30000K1 ] ), if( is_empty_string( Z30000K2 ), throw_error( Z30005, [ "Z30000K2", Z30000K2 ] ), join_with_separator( Z30000K1, Z30000K2, " " ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's create this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+” button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›” icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the outermost function you want to use, which in this case is "if".</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Check the validity of the first argument:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "condition", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "is empty string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "input", click on the "…" button and select "argument reference"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id", select the first input (e.g. "first string")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse the "condition" function call if you want, by clicking on the down-chevron next to "condition". You should see something like "f(x) is empty string( → first string )"</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Throw error if the condition is true:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "then", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Throw Error"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error type", search and select your error type (you can directly input the error ID if you know it, e.g. Z30005)</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error parameters", add two items by clicking on the "+" button</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For "Item 1" (offending argument key), set its type to "String" and write the argument identifier (e.g. "first input", or "Z30000K1")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For "Item 2" (offending argument value), click on the "…" next to "Item 2" and select "argument reference"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id", select the first input (e.g. "first string")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse the "then" function call if you want, by clicking on the down-chevron next to "then". You should see something like "f(x) Throw Error( Input was the wrong format, Typed list( Object, "first input", → first string ) )"</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Continue to check the second argument if the first was good:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "else", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "if"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Set up "condition" to check the validity of the second argument by following the same process as described in step 5.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Set up "then" to throw an error for the second argument by following the same process as described in step 6.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Finally, set up the success path:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to the nested "else", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the successful function, which in this case can be "join strings with separator"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and set it to "argument reference", then select "first string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and set it to "argument reference", then select "second string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "separator" add a space into the text field</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The resulting function call should look like this: </div> [[File:Throw error expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function</span>]] [[File:Throw error collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function, in its collapsed view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function, in its collapsed view</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Handling errors in compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> While it is useful to allow functions to raise expected errors, it is crucial to be able to handle errors in your compositions in order to safely use these functions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say you want to create a new function "full name of a person" – we will refer to it with the ZID <code>Z30010</code>. This function should return the full name of a person given a first and last names, but if any of the two fields are empty, it should return the text "Unknown" instead. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You could create a composition using our example function "Join two strings with a space" or <code>Z30000</code> to generate the name. If any of the inputs are empty, you know that <code>Z30000</code> will throw an error of type <code>Z30005</code>. Using the function {{Z|Z850}} as a wrapper, you can attempt the join operation and intercept a possible error to simply return "Unknown" whenever it occurs. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Try-Catch function (Z850) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z850}} function is built-in with ZID <code>Z850</code> and takes three arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – The initial function call to run. If nothing goes wrong, the response will be the result of this function call.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – An error type to catch in case it is thrown during the execution of the first function call.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error handler''' – A function call that will be run in case the error specified above is caught during the execution of the initial function call. If that happens, the result of the error handler will be the value returned.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Try-Catch ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Once we have all the functions for our composition, we can craft it like this: </div> <syntaxhighlight lang="prolog"> try_catch( join_with_space( Z30010K1, Z30010K2 ), Z30005, echo( "Unknown" ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This means that: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">The "Join two strings with a space" function will be tried with the two inputs and, if everything goes well, the output of this function will be returned</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If any of the inputs are blank, "Join two strings with a space" with raise an error of type <code>Z30005</code></span> * <span lang="en" dir="ltr" class="mw-content-ltr">Our {{Z|Z850}} will then detect this error and run the {{Z|Z801}} function to return "Unknown"</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's create this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›” icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the outermost function you want to use, which in this case is "Try-Catch".</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Set the main function call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under the field where the "Try-Catch" function is selected, next to the "function call" key, click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the function "join two strings with space"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and select "argument reference", then select the "first name" argument from the dropdown.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and select "argument reference", then select the "second name" argument from the dropdown.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Select the error to catch:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error type", search and select "bad string input" – you can search directly by its ZID <code>Z30005</code></span> # <span lang="en" dir="ltr" class="mw-content-ltr">Set the error handler function call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "error handler", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "echo"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "input" and "type", search and select the type "String"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now, under "input", type "Unknown" in the text field</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The resulting function should look like this: </div> [[File:Try catch expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in expanded mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in expanded mode</span>]] [[File:Try catch collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in collapsed mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in collapsed mode</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Testing your failure use cases === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As we introduced in the above section about [[#Practice Test-Driven Development|practicing TDD]], it's important to test not only the most common paths, but also the possible edge cases. It is equally important to test failure behavior. In this section we will give you the tools necessary to test that your function fails with a given set of inputs, and that the error thrown is the expected one. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> To do that, you will need other two system functions: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Is error type (Z852) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z852}} function is built-in with ZID <code>Z852</code> and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error''' – An {{Z|Z5}} object, which can be thrown by a failing call. An error instance has a type and a value.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – A reference to an {{Z|Z50}} which will be compared to the type of the Error passed as a first argument. If that's the case, the function will return true.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Get error thrown by function call (Z853) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z853}} function is built-in with ZID <code>Z853</code> and takes one argument: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – A function call which can either return a successful value of any type, or throw an error.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> This function returns a {{Z|Z882}} with a {{Z|Z40}} in first place and an {{Z|Z1}} in the second: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the Function call runs successfully and hence does not throw any error, the returned pair will contain False in the first place, and void in the second.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the Function call throws an error, the returned pair will contain True in the first place, and the caught error in the second.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> To use this function in your compositions, you might need to use the additional functions: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">{{Z|Z821}}, and</span> * {{Z|Z822}} <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Testing errors ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say our target function, "Join two strings with a space" or <code>Z30000</code>, throws an error of type <code>Z30005</code> and we want to test this behavior. To do that we need to: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Throw a failing function call</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Get the error using the function {{Z|Z853}}</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Check that the error is the right type with {{Z|Z852}}</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Tests have two fields: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Call''' – A function call that will produce an output with the inputs you want to test. This call will return a value.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Result validation''' – A function call that will validate that the value returned by the call above is the expected one. The first argument of this function call will be automatically assigned to take the return value of the first call.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> For step-by-step instructions on how to create tests, see {{ll|Wikifunctions:Introduction#Create_tests}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In our example, we can structure it like this — but this is not the only way! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The call, which will return an {{Z|Z5}} object: </div> <syntaxhighlight lang="prolog"> error = get_second_element_of_typed_list( get_error_thrown_by( join_strings_by_whitespace( "", "not empty" ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> And the result validation, which will take the {{Z|Z5}} object as its first argument: </div> <syntaxhighlight lang="prolog"> is_error_type( error, Z30005 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's do this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding a test by clicking on the "+" button in the "Tests" table from your Function page. The "call" and "result validation" fields already have some functions pre-set, but to test the errors we will need to change them.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">First, let's set the call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "call", click the "›" chevron button to expand the function call.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", edit the field and search and select the function "Get second element of a typed pair"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Once selected, next to "Typed pair", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Get error thrown by function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "function call", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Join two strings with a space" (or by ZID <code>Z30000</code>)</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now set the inputs so that they cause a failure: at least one of them should be empty.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse your "call" by clicking again on the down-chevron button if you want!</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Next, let's set the result validation:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "result validation", click the "›" chevron button to expand the function call.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", edit the field and search and select the function "Is error type"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now you will only be asked to configure the second argument. Under "error type", search and select your <code>Z30005</code> error type.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">And you are done! You can now click the circular arrow in the "Implementations" box and you should see green checks.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> If everything went right, you can now save your test. It should look like this: </div> [[File:Get error expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in expanded mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in expanded mode</span>]] [[File:Get error collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in collapsed mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in collapsed mode</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Creating actionable error messages === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As described above, Error Types have an optional key <code>Z50K3</code> which contains a multilingual list of HTML strings. When rendering information about an error, the messages stored in the error type can help create a clear, precise, informative, translatable and actionable error message. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For that purpose, error messages can contain parameters like <code>$1</code>, <code>$2</code>, etc., where the digit corresponds to the error type argument and its value in the error instance. These error messages are rendered in Wikifunctions inside the "Details" dialog window after executing a function call. Additionally, these error messages are surfaced in other client interfaces, like Abstract Wikipedia, to provide better guidance to Abstract Content editors. </div> [[File:Wikifunctions actionable error message example in the Details dialog.png|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">The error message is rendered using the HTML message of the error type and the error argument values.</span>]] [[File:Wikifunctions actionable error message example in Abstract Wikipedia.png|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">When available, the HTML error message is rendered in the Abstract Wikipedia preview section.</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> Let's use a real example to understand the benefits of HTML error messages: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The function {{Z|Z37847}} returns the first Lexeme reference given a Wikidata Item reference and a language. When there is no Lexeme for this Item-Language combination, it throws an error of type {{Z|Z28248}}, which has three keys: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K1''' is the input Wikidata item QID</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K2''' is the connecting property, in this case <code>P5137/item for this sense</code></span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K3''' is the language code</span> <div lang="en" dir="ltr" class="mw-content-ltr"> When calling this function for a Wikidata lexeme that doesn't exist, the call will throw an error instance like this: </div> <syntaxhighlight lang="json" highlight="10,12"> { "Z1K1": "Z5", "Z5K1": "Z28248", "Z5K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z885", "Z885K1": "Z28248" }, "Z28248K1": "Q319", "Z28248K2": "P5137", "Z28248K3": "ast" } } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> While the error type label indicates: <code>No matching lexeme for item in language</code>, a better error message should indicate: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">which is the failing item,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">which is the language missing, and</span> * <span lang="en" dir="ltr" class="mw-content-ltr">what are the possible ways to fix it.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The error message <code>Z50K3</code> field can provide this functionality. Whenever an Error Type has an error message for the user language (or any of its fallbacks), the error message shown will be rendered by: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">First, replacing the message parameters with the values of the keys. In our example, any <code>$1</code> will be replaced with the value of <code>Z28248K1</code> ("Q319"), <code>$2</code> with "P5137", and <code>$3</code> with "ast",</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Last, sanitizing and rendering the HTML message.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> So a HTML message like: </div> <syntaxhighlight lang="html"> There is no matching lexeme for the item $1 in "$3".<br> <a href="http://wikidata.org/wiki/$1">Edit in Wikidata</a> </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Will become: </div> : There is no matching lexeme for the item Q319 in "ast" : [[d:Q319|Edit in Wikidata]] <div lang="en" dir="ltr" class="mw-content-ltr"> == Debugging your implementations == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Sometimes things can go wrong. A function might behave differently than expected or a value might not look quite right. Sometimes implementations are really complex and, because they are run in a sandboxed environment, it can seem really difficult to debug. To help understand what's going on inside a function call, Wikifunctions includes a small set of debugging tools. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> These tools don't change the result of a function, but will add extra information to the returned metadata, which you can observe after running the function. You can use <code>Wikifunctions.Debug()</code> from your code implementations or the function {{Z|Z854}} from your compositions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section you will learn: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">How to add debug messages from both code and composition implementations,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to inspect the metadata manually or via the UI to inspect these logs.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Debugging your code implementations === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> When writing code, both from JavaScript and Python3, you can use <code>Wikifunctions.Debug()</code> to add a message to your debugging log and continue the execution. </div> {{phab|T441028}} <div lang="en" dir="ltr" class="mw-content-ltr"> <code>Wikifunctions.Debug()</code> has one parameter, which is generally expected to be a string. However, any other object passed as parameter will get directly converted into a string. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If we want to add debug logs to our code implementations for our "Join two strings with a space" example function, we can do, in JavaScript: </div> <syntaxhighlight lang="JavaScript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { Wikifunctions.Debug( `first input is empty "${ Z30000K1 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { Wikifunctions.Debug( `second input is empty "${ Z30000K2 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } Wikifunctions.Debug( "both inputs are fine" ); return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> And the same in your Python3 implementation will be: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": Wikifunctions.Debug( 'first input is empty "'+Z30000K1+'"' ) Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": Wikifunctions.Debug( 'second input is empty "'+Z30000K2+'"' ) Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) Wikifunctions.Debug( 'both inputs are fine' ) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This way, no matter what happens, we will be adding one message to your debugging logs: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the function call fails when checking on the first or second input, the result of the execution will be a failure, but it will contain one informative log about what branch caused the failure.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the function call succeeds—because both inputs are valid—the function call will return the joined string, but the returned metadata will also contain a debug log.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Debugging your compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> To support debugging compositions, Wikifunctions provides the built-in function {{Z|Z854}}. This function allows you to attach debug messages to the execution of any function call that generates the final output. The debug logs collected during the evaluation are returned as part of the execution metadata, under the <code>executorDebugLogs</code> key. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Add debug log to function call (Z854) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z854}} function is built-in with ZID <code>Z854</code> and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – Any composition you want to execute.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Debug log''' – A string message that will be recorded if the given function call is evaluated.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> When the wrapped function call runs, the provided message is added to the execution logs. If that function call is not executed, or its execution is not part of the final output, its debug log will not appear in the final result metadata. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You will benefit from this built-in if you want to observe: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Which branch of a conditional was executed, or</span> * <span lang="en" dir="ltr" class="mw-content-ltr">the order of evaluation in a composition.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Add debug log to function call ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say that you want to add debug logs to our example function "Join two strings with a space" or <code>Z30000</code>, so that different messages are added to the different possible outcomes. You could use our debugging builtin like this: </div> <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), add_debug_log( throw_error( Z30005, ... ), 'failed on first input' ) if( is_empty_string( Z30000K2 ), add_debug_log( throw_error( Z30005, ... ), 'failed on second input' ), add_debug_log( join_with_separator( Z30000K1, Z30000K2, " " ), 'both inputs are ok!' ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This way, </div> * <span lang="en" dir="ltr" class="mw-content-ltr">when called with an empty first input, the function will return a failed response, and the metadata will contain an <code>executorDebugLogs</code> entry with the "failed on first input" log.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">When called with an empty second input, the call will also fail, but the logged message will be "failed on second input"</span> * <span lang="en" dir="ltr" class="mw-content-ltr">When called with valid inputs, the function will return a successful response, and additionally the metadata will contain "both inputs are ok" in its <code>executorDebugLogs</code> key.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> This is the way this composition would look: </div> [[File:Add debug log expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Composition implementation using Add debug logs to log all possible execution paths</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Composition implementation using Add debug logs to log all possible execution paths</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Accessing execution debug logs === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Whether your execution logs are added via <code>Wikifunctions.Debug()</code> or via the {{Z|Z854}} built-in function, they are returned as part of the response metadata. To see the logs, once you run your function, click on the "Details" button that appears at the bottom of the "Result" section. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The error and debug information will appear at the top of the "Details" dialog. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> This is what you would see when running the composition from our previous example with valid and invalid inputs: </div> {| class="wikitable" | [[File:Execution logs success.png|frameless|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a successful execution with debug logs</span>]] | [[File:Execution logs failure.png|frameless|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a failed execution with debug logs</span>]] |- | <span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a successful execution: shows no errors, but displays the successful execution log: ''"both inputs are ok!"''</span> | <span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a failed execution: shows the error information, and the additional execution log for the first failure branch: ''"failed on first input"''</span> |} [[Category:How to create implementations| {{#translation:}}]] 32qyt6ij401uckv5kzow6m7ivd5q2xz Wikifunctions:Naming conventions/uk 4 28841 331149 325779 2026-10-23T08:29:50Z FuzzyBot 207 Updating to match new version of source page 331149 wikitext text/x-wiki <languages/> {{shortcut|[[WF:NC]]}} {{Draft}} <div lang="en" dir="ltr" class="mw-content-ltr"> The page aims to sum up some conventions related to how are objects named at Wikifunctions. Since it's still a young project, there are not many guidelines defined yet. </div> <span id="Capitalization"></span> == Вживання великої літери == <div lang="en" dir="ltr" class="mw-content-ltr"> Some languages use capital and small letters. Labels of objects should be written in such languages as if they were an ordinary phrase. Use of [[:w:en:Title case|Title case]] is discouraged. For example, instead of ''Calculate A Distance Between Earth And Sun On a Given Date'', type something like ''calculate a distance between Earth and Sun on a given date''. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Capitalize only proper nouns and other words as required by the rules of the language in which you are writing. For example, this applies to nouns in German, and to some classes of words in English, such as days of week and names of languages. Don't capitalize those things if the rules of your language don't require this. When naming a foreign language in a label, use the label language's capitalization conventions (for example, "Toki Pona" should be capitalized in an English label). Abbreviations should use their conventional form; for example, in English, use "[[:en:RSA (cryptosystem)|RSA]]" and not "rsa" for the encryption algorithm name. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> By convention, names of objects that describe data types, should have their first letter capitalized (for example, [[Z1]] or [[Z8]]). </div> <span id="Search_characters"></span> == Пошукові символи == <div lang="en" dir="ltr" class="mw-content-ltr"> The search engine uses a few characters as modifiers, so avoid these at the start of a word. These characters are: <code>~ * \? - " !</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Note that “?” on its own (rather than “\?”) is not a modifier. It is, however, a “greyspace” character. Other “greyspace” characters are <code>~ ! @ # $ % ^ & ( ) _ + - = { } | [ ] \ : " ; ' < > ? , . /</code>. The search engine treats these (singly or in combination) as part of the word boundary. This is not generally a problem, but if they are likely to be significant in searches, you should avoid them at the start or end of a word (or between words), unless necessary (for example, [[Z11729]]). See [[:mw:Special:MyLanguage/Help:CirrusSearch|Help:CirrusSearch]] for details of how to search for text containing any of these characters. </div> <span id="Implementation_names"></span> == Назви реалізацій == <div lang="en" dir="ltr" class="mw-content-ltr"> When creating an Implementation, please mention the language you used in its name (Python/JavaScript/Composition). If there are more than one implementation in the same language, it's recommended to give a little detail in the title of what makes this implementation different. For example, naming the algorithm name (if one exists). </div> <span id="Test_cases"></span> == Тести == <div lang="en" dir="ltr" class="mw-content-ltr"> Labels of a test case should provide some clue about what you are checking there. It doesn't have to include values for every input and output, but should at least specify a domain that you're checking. For instance, you might want to say that this test checks the behavior of a string function when it's given letters from the Cyrillic alphabet, or of a mathematical function when a fraction or complex number is passed. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If the test case is related to a string function, and you include a string argument in the test case name, please surround the argument in quotes or mark it in some other way so it will be clear what the value is. It's especially helpful if the value has significant whitespace at the beginning or end (for example, when testing a text-trimming function). </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Configuration of functions for given languages == </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Should start with "config for."</span> ** <span lang="en" dir="ltr" class="mw-content-ltr">If the configuration is a display function, it should be "config for displaying", followed by the exact name of the type.</span> ** <span lang="en" dir="ltr" class="mw-content-ltr">If the configuration is a read function, it should be "config for reading", following by the exact name of the type.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> == Types == </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Should be in sentence case (e.g. Rational number)</span> ** <span lang="en" dir="ltr" class="mw-content-ltr">This rule should not be followed if the type name is used outside of Wikifunctions and more often than not is in a snake-case form (e.g. {{Z|Z20838}})</span> <div lang="en" dir="ltr" class="mw-content-ltr"> == Multi-lingual labels == </div> {{Phab|T359663}} <div lang="en" dir="ltr" class="mw-content-ltr"> Labels in ''multiple languages'' (using the <code>mul</code> language code, per [[d:Special:MyLanguage/Help:Default values for labels and aliases|Wikidata's convention]]) can be used to specify the label in a way that doesn't involve words, for example as a mathematical expression. See {{Z|10512}} for an example. At the moment of writing, the software doesn't use these labels as a fallback though. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == language-specific local naming conventions == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Some languages may have their own language-specific naming conventions (these should probably be decided through discussions within the community that speaks the language, though many are likely drafts). </div> * [[Wikifunctions:Naming conventions/日本語]] (Japanese) [[Category:Policy{{#translation:}}]] aqj0g28g5ue9mnd95mgjrj4uqixqe4s Wikifunctions:What Wikifunctions is not/fa 4 30549 331057 190622 2026-10-23T08:06:05Z FuzzyBot 207 Updating to match new version of source page 331057 wikitext text/x-wiki <languages/> {{shortcut|[[WF:NOT]]}} {{Draft}} ویکی‌توابع یک نوع جدید وب‌سایت است و جامعه جدیدی را در هدف دارد. ما امید داریم که با بسیاری از ابزارها، سایت‌ها و جوامعی که وجود دارند همکاری کنیم: ما می‌خواهیم با محیط‌های توسعه یکپارچه، سیستم عامل های کامپیوتری ابری، سایت های توسعه برنامه‌ها و بسیاری دیگر همکاری کنیم. اما ما همچنین هدفمان بر روی «چیز خاصی» بودن است: یک پروژه ویکی‌مدیا برای همه که در آن کتاب‌خانه‌ای از توابع کد را ایجاد و نگه‌داری کنند تا کمکی شود به پروژه ویکی‌مدیا و به همه که بتوانند یک تابع مشترک را در کدشان فراخوانند. <div class="mw-translate-fuzzy"> پس حال بیایید ببینیم '''ویکی‌توابع چه‌چیزی نیست'''. </div> <span id="Wikifunctions_is_not_an_encyclopædia_of_algorithms"></span> == ویکی‌توابع دانش‌نامه الگوریتم‌ها نیست == این به‌این معناست که ما هدفمان بر روی جمع‌آوری الگوریتم‌های معروف و نه‌چندان معرف مانند [[w:Euclidean algorithm|الگوریتم اقلیدس]]، [[w:Newton's method|روش نیوتن]] نیست. ما نمی‌خواهیم همه الگوریتم‌های جهان را با وفاداری و زمینه تاریخی‌اش در این ویکی بگذاریم. بله، ما انتظار داریم که یک یا حتی چند تابع برای [[w:Greatest common divisor|بزرگ‌ترین شمارنده مشترک]] داشته باشیم که هر یک از روش‌های متفاوتی استفاده می‌کنند، ولی هدف اصلی ویکی‌توابع جمع‌آوری الگوریتم‌ها نیست. البته بدون بعضی از آنها کامل نمی‌شود. اگر می‌خواهید الگوریتم جمع‌آوری کنید، بسیاری از ویکی‌پدیاها [[w:List of algorithms|منبع خوبی]] هستند. <div lang="en" dir="ltr" class="mw-content-ltr"> Unlike an encyclopedic overview of existing algorithms, Wikifunctions will also invite original work. We will not be restricted to functions that have been published elsewhere first, and we do not require for every function and implementation to be based on previously published work. Wikifunctions, much like Wikibooks and very unlike Wikipedia, will be open to novel contributions. The main criteria for implementations will be: under which conditions can we run a given implementation, and what resources is it expected to take? </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not an app development site == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We do not expect to make it possible to create full-fledged, stand-alone apps within Wikifunctions — there will be no place to store state, we don't aim to allow calling external APIs or directly cause changes to other sites, and we don't aim to package up apps with icons and UX, etc. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We absolutely expect Wikifunctions to be a very useful resource for app developers, and can very much imagine apps that are basically wrappers around one or more functions from Wikifunctions, but these would still need code and other assets which wouldn't be part of Wikifunctions. We are not competing in the area of no-code or low-code development sites. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a code hosting service == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions will host code — but not for whole projects, merely for individual functions. There won't be libraries, apps, or services developed on Wikifunctions with bug-trackers, forums, etc. There won't be a Web-based version control system such as ''Mercurial'' or ''Git'' running against Wikifunctions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Again, we hope that there will be libraries, apps, and services that will rely on functions available in Wikifunctions, but they would be developed on a different site, such as ''Gerrit'', ''GitHub'', or ''GitLab''. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a programming language, nor is trying to evangelise a particular language == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions will allow for functions to be implemented in a multitude of programming languages. The possibility to compose functions together to create higher level functions may look a little bit like a new programming language, but it will be extremely limited compared to most other programming languages, since we only allow for nested function calls and that's it. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not an Integrated Development Environment (IDE) == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We won't provide you with an interface for creating and developing software projects, interfacing with build, testing, and source control systems. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a question-and-answer website == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We are not competing with ''Stack Overflow'' and similar websites, where a developer would ask how to achieve a certain task and have community members discuss and answer the question. We won't contain code snippets to help answer the question, but we will organize code within our website to enable the evaluation of functions within a library of functions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a cloud computing platform == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We do not provide computing resources and access to services and APIs so that you can run your computational needs on our platform, either for money or for free. Use of Wikifunctions's evaluation platform is to improve access to knowledge for everyone. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a code snippet website == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We are not competing with code snippet sites such as GitHub Gists, [[w:Rosetta_Code|Rosetta Code]], [https://esolangs.org/ esolangs.org], or [http://helloworldcollection.de/ helloworldcollection.de]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions differs in that it allows running code and composing existing functions together to create new ones. As well, Wikifunctions is for useful and meaningful code, not temporary, arbitrary snippets that other platforms may accept. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a code education platform == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We are not focused on teaching people how to code, the material in Wikifunctions will not be laid out in a pedagogical order, and we also won't make sure to comprehensively cover all topics important for coding. In fact, we aim for Wikifunctions to be usable for people who don't know how to code and who don't need to learn how to code to use most of Wikifunctions effectively. Though the Wikifunctions community may well help each other in sharing best practices, style guides, and tips on how to use the site in different languages, these will be aimed at the purpose of serving the world's knowledge. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not (only) the boiler room for Abstract Wikipedia == </div> [[File:Mechanical_room_in_basement._Wayne_N._Aspinall_Federal_Building_and_U.S._Courthouse,_Grand_Junction,_Colorado_LCCN2014650034.tif|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">A '[[d:Q6804549|boiler room]]', where unsightly-but-vital machinery is hidden</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> Natural language generation (NLG) is the focus of {{SITENAME}} as of 2026, and the site began as part of the wider [[meta:Special:MyLanguage/Abstract_Wikipedia|Abstract Wikipedia project]], but NLG is far from the only field in which functions are being developed. That is to say, WF is necessary for AW, but AW is not necessary for WF. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> On top of the computer science staples of Boolean logic, arithmetic, and list manipulation, we have useful functions relating to disciplines such as [[Z16718|chemistry]], [[Z35550|dimensional analysis]], [[Z20074|electrical engineering]], [[Z22162|genomics]], [[Z10393|information theory]], [[Z26830|meteorology]], [[Z13955|number theory]], [[Z27919|physiology]], [[Z20094|probability]], [[Z24497|quantum mechanics]], [[Z14226|railroad engineering]], [[Z28600|timekeeping/chronometry]], and [[Z26841|trigonometry]]. </div> [[Category:Project concept{{#translation:}}]] 7iijcrhvbayd82nt3de3v9so5ll7d29 Wikifunctions:How to create implementations/lb 4 30804 331118 296941 2026-10-23T08:23:25Z FuzzyBot 207 Updating to match new version of source page 331118 wikitext text/x-wiki <languages/> <div lang="en" dir="ltr" class="mw-content-ltr"> This page provides a more detailed guide to '''creating implementations''', beyond the overview at {{ll|Wikifunctions:Introduction}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Types of Implementations == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In Wikifunctions, an '''implementation''' can take one of two main forms: '''code''' or '''composition'''. A code implementation directly expresses the function’s logic in any of the available programming languages (currently, Python3 or JavaScript). It’s most useful when the function’s behavior can’t easily be built from existing Wikifunctions, or when precise control over data processing is needed. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> A composition implementation, on the other hand, defines the function entirely by combining other existing functions, without writing code. Compositions are easier to understand, reuse, and translate into other languages automatically, but they depend on suitable building blocks already being available and often are less performant. In general, start by checking whether your goal can be achieved through composition; if it can’t, or if performance or fine-grained logic matters, choose a code implementation instead. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> There's a third type of implementation: '''built-ins'''. These are run by system-built code, and are not editable. Most likely all pre-defined functions will have a built-in implementation. In such cases, when opening the implementation page, you will see a message stating ''"{{int|wikilambda-implementation-selector-none}}"'' </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Practice Test-Driven Development == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> '''Test-Driven Development''', or '''TDD''', is a way of creating software where you write tests before you write the actual code. Tests are just a way of understanding what your function is supposed to do by listing examples and how they should work. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In Wikifunctions, writing tests first offers significant benefits. If you are working on an implementation, you can run your code against the existing tests to check that it behaves as expected. This makes it easier to catch errors early before even publishing your implementation. Tests are also a powerful way to describe the function you need. By writing tests, '''you clearly communicate the expected behavior''', and the community can step in and help with the implementation, or create alternative implementations. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Imagine you want to implement a Function that combines two strings with a space in between. A basic test for this might look like: </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello", "world" ) => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Once you have defined the basic behavior, it's important to '''think about edge cases'''—situations where the inputs are such that you might need some special behavior. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, what if your first string ends in a space, or your second string starts with a space? Should the function keep all existing spaces and add another one, or should it return a neatly spaced result with just a single space between the words? Depending on your requirements, you should build a test for such a case. For example, a test for this edge case could be either one of these — but not both!: </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> or ... </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Make sure that all possible special cases are covered by your tests, and once you have them, make sure that they are all connected to the Function by selecting them and clicking "Connect". </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Code implementations == </div> [[File:Code implementation.png|thumb|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions code editor initialized with a function template</span>|<span lang="en" dir="ltr" class="mw-content-ltr">When adding a new code implementation, the function template is initialized with the function and argument names</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> When creating an implementation using code, the Wikifunctions UI will set up a code editor with the selected language activated for syntax highlighting and validation. When the function to implement and the programming language are selected, this editor will be set with the correct function template: '''do not remove or edit this'''! Keep your code inside this function signature: if you need auxiliary functions, you can simply declare them inside your top-level function declaration. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Using input types in your code === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions types {{Z|Z6}} and {{Z|Z40}} can be used as if they were native types in both JavaScript and Python3. For example, a String input can be concatenated or a Boolean be directly used in a logical expression. To use other types in your code implementations, you will have to look deeper into the type, figure out if it has a conversion to a native equivalent, and treat it accordingly. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, let's say we want to write some Python code that handles an input of type {{Z|Z20420}}. In the page for this type, let's look at its "type converters to code" and search for a Python one. The converter {{Z|Z20424}} will be applied to our date input before our code, so looking at "native type" we know that our input will be a Python ''dict'' and looking at the implementation we can see the keys we can expect: </div> <syntaxhighlight lang="python3"> return { 'K1': year, 'K2': month, 'K3': day } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> When a type doesn't have a converter, you'll have to access its parts directly using its keys. For example, let's assume that your function <code>Z30000</code> has one input <code>Z30000K1</code> of type {{Z|Z11}}. This type has two keys: <code>Z11K1</code> for the language (itself an object of type {{Z|Z60}}), and <code>Z11K2</code> for the string value. Similarly, the language object has a key <code>Z60K1</code> for the language code. So, to get a string with the language code and the text, you can write: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1 ) { // e.g. "en: some text" return Z30000K1.Z11K1.Z60K1 + ": " + Z30000K1.Z11K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> For a quick reference of the available type conversions visit [[Special:MyLanguage/Wikifunctions:Execution targets#Default type conversion|the default type conversion table]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Returning the right outputs === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Similarly to the way you treat inputs, outputs need to match the type specified in the function definition. Some can be treated as simply as native types, so any string output will be converted into a Wikifunctions {{Z|Z6}} object and any native boolean returned by your implementation will be converted into a Wikifunctions {{Z|Z40}} object. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Those types that have "type converters from code" will apply the appropriate function to the output, in order to build the required type. Following the example of {{Z|Z20420}}, the {{Z|Z20443}} will transform the output from your implementation–a dict with K1, K2 and K3 keys–into its correct ZObject representation. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For types that don't have converters from code, you can carefully build and return the output objects. For example, imagine that our function <code>Z30000</code> takes two string inputs: language code and text, and should return a {{Z|Z11}} object. You can do this in Python by using the <code>ZObject</code> constructor: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): lang_object = ZObject( {"Z1K1": "Z9", "Z9K1": "Z60"}, Z60K1 = Z30000K1 ) return ZObject( {"Z1K1": "Z9", "Z9K1": "Z11"}, Z11K1 = lang_object, Z11K2 = Z30000K2 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Or in JavaScript: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { const langObject = new ZObject( new Map( [ [ "Z60K1", Z30000K1 ] ] ), { "Z1K1": "Z9", "Z9K1": "Z60" } ); const monolingualKeys = new Map( [ [ "Z11K1", langObject ], [ "Z11K2", Z30000K2 ] ] ); return new ZObject( monolingualKeys, { "Z1K1": "Z9", "Z9K1": "Z11" } ); } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> You can learn more about the <code>ZObject</code> class and other useful constructors in {{ll|Wikifunctions:Execution_targets#Custom_and_non-built-in_type_conversion}} </div> {{phab|T392750}}<div lang="en" dir="ltr" class="mw-content-ltr"> As of 2026-05, trying to return a list of lists may fail, so you're not able to implement such functions in code. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Code in Python === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section, we give a concrete example on how to create an implementation in the form of Code in Python. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is Z30000. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The implementation is defined using the ZID of the function. So are the arguments of the function. So in the case of the function Z30000 with its two arguments, the function template should look like this: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> As we described before, we know that the arguments (<code>Z30000K1</code> and <code>Z30000K2</code>) are Strings, so we can treat them as simply as we use native strings in Python. Also, the function should return a String. For our example, we simply return the two arguments concatenated with a space in between: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Since this is Python, do not forget to indent this line. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If you have followed our advice to [[#Practice Test-Driven Development|practice TDD]], you will already have a set of tests that you know should work. If that's the case, while building your implementation you can click on the circular arrow in the Tests panel, and see if your implementation passes all of them. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Remember that the runtime has no state. Don’t assume values for global or static variables. If you have further questions about what you can and cannot do in Python, ask on [[Wikifunctions:Python implementations]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Code in JavaScript === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section, we give a concrete example on how to create an implementation in the form of Code in JavaScript. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is <code>Z30000</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The implementation is defined using the ZID of the function. So are the arguments of the function. So in the case of the function <code>Z30000</code> with its two arguments, the function template should look like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> We know that the arguments (<code>Z30000K1</code> and <code>Z30000K2</code>) are Strings, so we can treat them as native strings in JavaScript. Also, the function should return a String. To complete our function, you can then add a line concatenating the input strings, like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> If you have tests as recommended in the [[#Practice Test-Driven Development|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes all of them. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Remember that the runtime has no state. Don’t assume values for global or static variables. If you have further questions about what you can and cannot do in JavaScript, ask on [[Wikifunctions:JavaScript implementations]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Calling another Wikifunctions function === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> A code implementation can call certain other Wikifunctions functions, receive the output of the call, and use that output in further processing. We refer to such calls as callbacks. At present, due to security and performance concerns, only the following built-in Wikidata fetch and search functions can be called in this way: {{Z|Z6820}}, {{Z|Z6821}}, {{Z|Z6822}}, {{Z|Z6824}}, {{Z|Z6825}}, {{Z|Z6826}}, {{Z|Z6830}}, and {{Z|Z6831}}. This capability is in an initial stage of deployment; we hope to allow calls to a broader range of functions in the future. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Let’s look at a JavaScript implementation containing a callback. This implementation fetches an item from Wikidata, extracts the label of that item in a given language, and returns the label string. The item to fetch is given by argument <code>Z400K1</code>, and the language is given by <code>Z400K2</code>. </div> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const item = Wikifunctions.Call('Z6821', Z400K1); for (const label of item.Z6001K2.Z12K1) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> A callback is made by calling <code>Wikifunctions.Call</code>, as shown in the example. The first argument to <code>Wikifunctions.Call</code> is always the ZID of the function to be called – in this case, {{Z|Z6821}}, which takes a single argument. Following that, the arguments to be passed to that function are listed, separated by commas. Here, that argument, <code>Z400K1</code>, is the same value that was passed to the function <code>Z400</code>. This is a common pattern of argument passing to callbacks, but their arguments can also be built using the <code>ZObject</code> constructor (as explained above), or obtained in other ways. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The value of <code>Z400K1</code> would be an instance of {{Z|Z6091}}, containing the QID of the item to be fetched. Line 2 of the example calls <code>Z6821</code> to fetch that item from Wikidata and assigns the resulting ZObject to the const <code>item</code>. The remaining code iterates over the item’s labels until it finds the one matching the language given by <code>Z400K2</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For the first example above, we have used <code>Z6821</code> for simplicity. However - unless an entire entity is needed by the implementation, it is strongly recommended to use <code>Z6820</code> to retrieve Wikidata items, which can be quite large. Although a call to <code>Z6820</code> is a bit more complex, its parameters allow for fetching selected portions of a Wikidata item, which can greatly improve performance and avoid some errors, by reducing the network bandwidth and processing time that are needed. (<code>Z6820</code> can also be used in place of <code>Z6822</code>, <code>Z6824</code>, <code>Z6825</code>, and <code>Z6826</code>, to get similar bandwidth-reduction benefits.) </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Just below we show how <code>Z6820</code> can be used, in <code>Wikifunctions.Call</code>, to implement the same behavior as above. Note that we use the second argument passed to <code>Z6820</code>, <code>[labelsPart]</code>, to say “Just return the item’s labels”, and we use the third argument, <code>[Z400K2]</code>, to say “Just return labels in the given language”. (This argument would also apply to aliases and descriptions, if they were included in the result.) </div> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const labelsPart = new ZObject( new Map( [ ['Z6030K1', new ZReference('Z6033')] ] ), {Z1K1: 'Z9', Z9K1: 'Z6030'} ); const entities = Wikifunctions.Call( 'Z6820', [Z400K1], [labelsPart], [Z400K2], []); const item = entities.get(Z400K1.Z6091K1); const labels = item.Z6001K2.Z12K1; for (const label of labels) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Other things to note: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Even though code implementations are now able to fetch Wikidata entities, it is recommended that they not be written to return ''entire'' entities. This is because of current limitations on the size of the value returned from a code implementation. To fetch and return an entire large entity, it’s better to call the fetch function from a composition.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Only one callback can execute at a time. For security reasons, it is not possible to use the concurrency features of JavaScript or Python to execute multiple callbacks in parallel.</span> ** <span lang="en" dir="ltr" class="mw-content-ltr">Keep in mind, however, that you can fetch multiple entities at once using Z6820.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">There is currently a 3 MiB limit on the size of Wikidata content that can be returned to a code implementation, by a single callback. The same limit applies to the size of the result returned from a code implementation.</span> <span id="Compositions"></span> <div class="mw-translate-fuzzy"> == Kompositioun == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section, we give a concrete example on how to create an implementation in the form of a composition. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is <code>Z30000</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> It is usually a good idea to first think about how to combine existing functions in order to create the desired output. Sometimes this might be trivial, and you can just go ahead with composing functions, but in many cases it is worthwhile to note the desired composition down. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, for the given Function, we could use the existing Function {{Z|Z10000}}. That Function takes two strings and makes one string out of them. But we need to add a space in between. So we first concatenate a space to the end of the first string, and then concatenate the second string to the result of that first concatenation. So our composition could be noted down like this: </div> <syntaxhighlight lang="prolog"> join_strings( join_strings( Z30000K1, " " ), Z30000K2 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> There are multiple ways to write a composition: notice that the same thing could be accomplished with: </div> <syntaxhighlight lang="prolog"> join_strings( Z30000K1, join_strings( " ", Z30000K2 ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> An alternative implementation could also use the existing Function {{Z|Z15175}}, so your composition could be: </div> <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> As you can see, there are multiple ways to accomplish this, so take your time and explore the existing functions available in the {{ll|Wikifunctions:Catalogue}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's try to create the second example, <code>join_strings(Z30000K1, join_strings(" ", Z30000K2))</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In order to create this: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›" icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search for the name of the outermost function you want to use, which in this example is "join two strings". Then, select the wanted function from the dropdown list.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">You will see two new fields, one for each of the arguments needed for the selected function.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">For the first argument, we want to select the first input to our function:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and select "Argument reference".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id" you can now select the first string of your function from the dropdown, which contains all available inputs.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">For the second argument, we want to use the result of another call to "join two strings":</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and select "Function call".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function you want to call, which is again "join two strings".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For this inner function call, configure the "first string" by simply typing a white space in the text field, and configure the "second string" as you did for step 6: change it using the "…" button to "Argument reference", and then select the second argument in the dropdown.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Your composition is now complete! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You can expand and collapse the details using the chevron buttons to see how it looks. If you already have Tests as recommended in the [[#Practice Test-Driven Development|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes the tests. Once your composition passes the tests, go ahead and publish it. </div> [[File:Composition implementation expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its expanded view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its expanded view</span>]] [[File:Composition implementation collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its collapsed view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its collapsed view</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions error handling == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As a Wikifunctions function creator, you might want to warn the user calling your function when something goes wrong in the code, or when their inputs do not fit a certain criteria. For example, if your Function expects a string input to contain a name, you might want to check that the name is not empty and, if it is, show an error message that the person using your Function can understand. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For this purpose, you can use <code>Wikifunctions.Error()</code> from your code implementations or the function {{Z|Z851}} from your compositions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section you will learn: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">How to throw errors from both code and composition implementations,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to write tests for error cases, and</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to catch and handle errors thrown by functions that you are using in your compositions.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Throwing errors from code implementations === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> When writing code, both from JavaScript and Python, you can use <code>Wikifunctions.Error()</code> to end the execution with a wanted error. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> <code>Wikifunctions.Error()</code> has two parameters: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Error type: a string containing the ZID of the error type you want to return.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Error arguments: a list of string arguments to build the error.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's go one by one: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Error type ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> An error type is an object that describes a kind of error that could happen in the system. There are a number of built-in error types but you can also build other error types that are more suited to your use case. When using errors, the best idea is to browse through the available error types, which can be explored in [[Special:ListObjectsByType/Z50|this list]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If there are no errors that fit your case, create a new one by going to the create page, and selecting "Error type" in the type selector. Then, set the necessary fields: </div> [[File:Error type.png|thumb|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Error type creation in Wikifunctions</span>|<span lang="en" dir="ltr" class="mw-content-ltr">To create new Error type (Z50), edit the label and add the necessary keys.</span>]] * <span lang="en" dir="ltr" class="mw-content-ltr">'''Label''' – This is the main title of the error, which should contain a short but descriptive message. Set the error label on the right-side box titled "About".</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Keys''' – Keys contain additional information about what caused the error. For example, if an input had the wrong format, you might want to inform the user of what was the input content when raising the error. To use them in your implementations, keys should be strings. To create a key, click on the "[+]" icon below "keys", select "String" under "value type", and add a label that describes it appropriately, for example "current input". Once you have all the necessary keys, you can Publish your error type and keep the ID of the newly created object.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error message''' – Error types can contain a multilingual array of HTML parametrized error messages. The parameter notation is $1, $2, etc., where the digit corresponds to the error type key. For example, when creating an error type with one string key "current input", the error message can use the positional parameter "$1", which will be replaced with the value of the "current input" key at the time of rendering the error. To add HTML messages, click on the "[+]" icon below "html fragments", select a language and input the HTML string.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Error arguments ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Error arguments correspond to the keys of the Error type, and they should provide additional information to understand the error. Error arguments should always be Strings. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Wikifunctions.Error() ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say that you want an error to be thrown when either your first or your second input are empty. You have already created the error type, and the assigned ZID was <code>Z30005</code>. Your error type has two string keys: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Input key: contains the key of the failing input</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Input value: contains the current value of the failing input</span> <div lang="en" dir="ltr" class="mw-content-ltr"> To raise an error in your JavaScript implementation you should do something like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { // If the first input is empty, raise error Z30005 // with two string args: [ first input key, first input value ] Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { // If the second input is empty, raise error Z30005 // with two string args: [ second input key, second input value ] Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> To raise an error in your Python implementation you should do something like this: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": # If the first input is empty, raise error Z30005 # with two string args: [ first input key, first input value ] Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": # If the second input is empty, raise error Z30005 # with two string args: [ first input key, first input value ] Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Remember that calling <code>Wikifunctions.Error()</code> ends the execution! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Throwing errors from compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If you are creating a composition implementation, you can throw an error by calling the special function {{Z|Z851}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Throw Error function (Z851) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z851}} function is similar to the <code>Wikifunctions.Error()</code> method and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – A reference to the Error type you want to raise</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error parameters''' – A list with the arguments to create your Error, which should also be Strings.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Throw Error ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say you want to modify your composition so that it first checks that the arguments are not empty, and raises an error when it finds an empty one. Then, if none of them are empty, it runs the original composition, which is: </div> <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> To do this, you need to create conditional paths, for which you can use the {{Z|Z802}} function. Think of it like this: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the first argument is empty, throw an error for the first argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Else, proceed to check the second argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the second argument is empty, throw an error for the second argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Else, proceed with the success path and return the joint strings with the space separator</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Or in functional pseudo code: </div> <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), throw_error( Z30005, [ "Z30000K1", Z30000K1 ] ), if( is_empty_string( Z30000K2 ), throw_error( Z30005, [ "Z30000K2", Z30000K2 ] ), join_with_separator( Z30000K1, Z30000K2, " " ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's create this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+” button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›” icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the outermost function you want to use, which in this case is "if".</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Check the validity of the first argument:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "condition", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "is empty string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "input", click on the "…" button and select "argument reference"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id", select the first input (e.g. "first string")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse the "condition" function call if you want, by clicking on the down-chevron next to "condition". You should see something like "f(x) is empty string( → first string )"</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Throw error if the condition is true:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "then", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Throw Error"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error type", search and select your error type (you can directly input the error ID if you know it, e.g. Z30005)</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error parameters", add two items by clicking on the "+" button</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For "Item 1" (offending argument key), set its type to "String" and write the argument identifier (e.g. "first input", or "Z30000K1")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For "Item 2" (offending argument value), click on the "…" next to "Item 2" and select "argument reference"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id", select the first input (e.g. "first string")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse the "then" function call if you want, by clicking on the down-chevron next to "then". You should see something like "f(x) Throw Error( Input was the wrong format, Typed list( Object, "first input", → first string ) )"</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Continue to check the second argument if the first was good:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "else", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "if"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Set up "condition" to check the validity of the second argument by following the same process as described in step 5.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Set up "then" to throw an error for the second argument by following the same process as described in step 6.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Finally, set up the success path:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to the nested "else", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the successful function, which in this case can be "join strings with separator"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and set it to "argument reference", then select "first string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and set it to "argument reference", then select "second string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "separator" add a space into the text field</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The resulting function call should look like this: </div> [[File:Throw error expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function</span>]] [[File:Throw error collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function, in its collapsed view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function, in its collapsed view</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Handling errors in compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> While it is useful to allow functions to raise expected errors, it is crucial to be able to handle errors in your compositions in order to safely use these functions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say you want to create a new function "full name of a person" – we will refer to it with the ZID <code>Z30010</code>. This function should return the full name of a person given a first and last names, but if any of the two fields are empty, it should return the text "Unknown" instead. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You could create a composition using our example function "Join two strings with a space" or <code>Z30000</code> to generate the name. If any of the inputs are empty, you know that <code>Z30000</code> will throw an error of type <code>Z30005</code>. Using the function {{Z|Z850}} as a wrapper, you can attempt the join operation and intercept a possible error to simply return "Unknown" whenever it occurs. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Try-Catch function (Z850) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z850}} function is built-in with ZID <code>Z850</code> and takes three arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – The initial function call to run. If nothing goes wrong, the response will be the result of this function call.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – An error type to catch in case it is thrown during the execution of the first function call.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error handler''' – A function call that will be run in case the error specified above is caught during the execution of the initial function call. If that happens, the result of the error handler will be the value returned.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Try-Catch ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Once we have all the functions for our composition, we can craft it like this: </div> <syntaxhighlight lang="prolog"> try_catch( join_with_space( Z30010K1, Z30010K2 ), Z30005, echo( "Unknown" ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This means that: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">The "Join two strings with a space" function will be tried with the two inputs and, if everything goes well, the output of this function will be returned</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If any of the inputs are blank, "Join two strings with a space" with raise an error of type <code>Z30005</code></span> * <span lang="en" dir="ltr" class="mw-content-ltr">Our {{Z|Z850}} will then detect this error and run the {{Z|Z801}} function to return "Unknown"</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's create this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›” icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the outermost function you want to use, which in this case is "Try-Catch".</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Set the main function call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under the field where the "Try-Catch" function is selected, next to the "function call" key, click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the function "join two strings with space"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and select "argument reference", then select the "first name" argument from the dropdown.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and select "argument reference", then select the "second name" argument from the dropdown.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Select the error to catch:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error type", search and select "bad string input" – you can search directly by its ZID <code>Z30005</code></span> # <span lang="en" dir="ltr" class="mw-content-ltr">Set the error handler function call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "error handler", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "echo"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "input" and "type", search and select the type "String"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now, under "input", type "Unknown" in the text field</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The resulting function should look like this: </div> [[File:Try catch expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in expanded mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in expanded mode</span>]] [[File:Try catch collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in collapsed mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in collapsed mode</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Testing your failure use cases === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As we introduced in the above section about [[#Practice Test-Driven Development|practicing TDD]], it's important to test not only the most common paths, but also the possible edge cases. It is equally important to test failure behavior. In this section we will give you the tools necessary to test that your function fails with a given set of inputs, and that the error thrown is the expected one. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> To do that, you will need other two system functions: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Is error type (Z852) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z852}} function is built-in with ZID <code>Z852</code> and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error''' – An {{Z|Z5}} object, which can be thrown by a failing call. An error instance has a type and a value.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – A reference to an {{Z|Z50}} which will be compared to the type of the Error passed as a first argument. If that's the case, the function will return true.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Get error thrown by function call (Z853) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z853}} function is built-in with ZID <code>Z853</code> and takes one argument: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – A function call which can either return a successful value of any type, or throw an error.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> This function returns a {{Z|Z882}} with a {{Z|Z40}} in first place and an {{Z|Z1}} in the second: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the Function call runs successfully and hence does not throw any error, the returned pair will contain False in the first place, and void in the second.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the Function call throws an error, the returned pair will contain True in the first place, and the caught error in the second.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> To use this function in your compositions, you might need to use the additional functions: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">{{Z|Z821}}, and</span> * {{Z|Z822}} <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Testing errors ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say our target function, "Join two strings with a space" or <code>Z30000</code>, throws an error of type <code>Z30005</code> and we want to test this behavior. To do that we need to: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Throw a failing function call</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Get the error using the function {{Z|Z853}}</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Check that the error is the right type with {{Z|Z852}}</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Tests have two fields: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Call''' – A function call that will produce an output with the inputs you want to test. This call will return a value.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Result validation''' – A function call that will validate that the value returned by the call above is the expected one. The first argument of this function call will be automatically assigned to take the return value of the first call.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> For step-by-step instructions on how to create tests, see {{ll|Wikifunctions:Introduction#Create_tests}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In our example, we can structure it like this — but this is not the only way! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The call, which will return an {{Z|Z5}} object: </div> <syntaxhighlight lang="prolog"> error = get_second_element_of_typed_list( get_error_thrown_by( join_strings_by_whitespace( "", "not empty" ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> And the result validation, which will take the {{Z|Z5}} object as its first argument: </div> <syntaxhighlight lang="prolog"> is_error_type( error, Z30005 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's do this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding a test by clicking on the "+" button in the "Tests" table from your Function page. The "call" and "result validation" fields already have some functions pre-set, but to test the errors we will need to change them.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">First, let's set the call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "call", click the "›" chevron button to expand the function call.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", edit the field and search and select the function "Get second element of a typed pair"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Once selected, next to "Typed pair", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Get error thrown by function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "function call", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Join two strings with a space" (or by ZID <code>Z30000</code>)</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now set the inputs so that they cause a failure: at least one of them should be empty.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse your "call" by clicking again on the down-chevron button if you want!</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Next, let's set the result validation:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "result validation", click the "›" chevron button to expand the function call.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", edit the field and search and select the function "Is error type"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now you will only be asked to configure the second argument. Under "error type", search and select your <code>Z30005</code> error type.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">And you are done! You can now click the circular arrow in the "Implementations" box and you should see green checks.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> If everything went right, you can now save your test. It should look like this: </div> [[File:Get error expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in expanded mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in expanded mode</span>]] [[File:Get error collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in collapsed mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in collapsed mode</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Creating actionable error messages === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As described above, Error Types have an optional key <code>Z50K3</code> which contains a multilingual list of HTML strings. When rendering information about an error, the messages stored in the error type can help create a clear, precise, informative, translatable and actionable error message. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For that purpose, error messages can contain parameters like <code>$1</code>, <code>$2</code>, etc., where the digit corresponds to the error type argument and its value in the error instance. These error messages are rendered in Wikifunctions inside the "Details" dialog window after executing a function call. Additionally, these error messages are surfaced in other client interfaces, like Abstract Wikipedia, to provide better guidance to Abstract Content editors. </div> [[File:Wikifunctions actionable error message example in the Details dialog.png|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">The error message is rendered using the HTML message of the error type and the error argument values.</span>]] [[File:Wikifunctions actionable error message example in Abstract Wikipedia.png|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">When available, the HTML error message is rendered in the Abstract Wikipedia preview section.</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> Let's use a real example to understand the benefits of HTML error messages: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The function {{Z|Z37847}} returns the first Lexeme reference given a Wikidata Item reference and a language. When there is no Lexeme for this Item-Language combination, it throws an error of type {{Z|Z28248}}, which has three keys: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K1''' is the input Wikidata item QID</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K2''' is the connecting property, in this case <code>P5137/item for this sense</code></span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K3''' is the language code</span> <div lang="en" dir="ltr" class="mw-content-ltr"> When calling this function for a Wikidata lexeme that doesn't exist, the call will throw an error instance like this: </div> <syntaxhighlight lang="json" highlight="10,12"> { "Z1K1": "Z5", "Z5K1": "Z28248", "Z5K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z885", "Z885K1": "Z28248" }, "Z28248K1": "Q319", "Z28248K2": "P5137", "Z28248K3": "ast" } } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> While the error type label indicates: <code>No matching lexeme for item in language</code>, a better error message should indicate: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">which is the failing item,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">which is the language missing, and</span> * <span lang="en" dir="ltr" class="mw-content-ltr">what are the possible ways to fix it.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The error message <code>Z50K3</code> field can provide this functionality. Whenever an Error Type has an error message for the user language (or any of its fallbacks), the error message shown will be rendered by: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">First, replacing the message parameters with the values of the keys. In our example, any <code>$1</code> will be replaced with the value of <code>Z28248K1</code> ("Q319"), <code>$2</code> with "P5137", and <code>$3</code> with "ast",</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Last, sanitizing and rendering the HTML message.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> So a HTML message like: </div> <syntaxhighlight lang="html"> There is no matching lexeme for the item $1 in "$3".<br> <a href="http://wikidata.org/wiki/$1">Edit in Wikidata</a> </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Will become: </div> : There is no matching lexeme for the item Q319 in "ast" : [[d:Q319|Edit in Wikidata]] <div lang="en" dir="ltr" class="mw-content-ltr"> == Debugging your implementations == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Sometimes things can go wrong. A function might behave differently than expected or a value might not look quite right. Sometimes implementations are really complex and, because they are run in a sandboxed environment, it can seem really difficult to debug. To help understand what's going on inside a function call, Wikifunctions includes a small set of debugging tools. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> These tools don't change the result of a function, but will add extra information to the returned metadata, which you can observe after running the function. You can use <code>Wikifunctions.Debug()</code> from your code implementations or the function {{Z|Z854}} from your compositions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section you will learn: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">How to add debug messages from both code and composition implementations,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to inspect the metadata manually or via the UI to inspect these logs.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Debugging your code implementations === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> When writing code, both from JavaScript and Python3, you can use <code>Wikifunctions.Debug()</code> to add a message to your debugging log and continue the execution. </div> {{phab|T441028}} <div lang="en" dir="ltr" class="mw-content-ltr"> <code>Wikifunctions.Debug()</code> has one parameter, which is generally expected to be a string. However, any other object passed as parameter will get directly converted into a string. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If we want to add debug logs to our code implementations for our "Join two strings with a space" example function, we can do, in JavaScript: </div> <syntaxhighlight lang="JavaScript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { Wikifunctions.Debug( `first input is empty "${ Z30000K1 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { Wikifunctions.Debug( `second input is empty "${ Z30000K2 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } Wikifunctions.Debug( "both inputs are fine" ); return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> And the same in your Python3 implementation will be: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": Wikifunctions.Debug( 'first input is empty "'+Z30000K1+'"' ) Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": Wikifunctions.Debug( 'second input is empty "'+Z30000K2+'"' ) Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) Wikifunctions.Debug( 'both inputs are fine' ) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This way, no matter what happens, we will be adding one message to your debugging logs: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the function call fails when checking on the first or second input, the result of the execution will be a failure, but it will contain one informative log about what branch caused the failure.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the function call succeeds—because both inputs are valid—the function call will return the joined string, but the returned metadata will also contain a debug log.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Debugging your compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> To support debugging compositions, Wikifunctions provides the built-in function {{Z|Z854}}. This function allows you to attach debug messages to the execution of any function call that generates the final output. The debug logs collected during the evaluation are returned as part of the execution metadata, under the <code>executorDebugLogs</code> key. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Add debug log to function call (Z854) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z854}} function is built-in with ZID <code>Z854</code> and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – Any composition you want to execute.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Debug log''' – A string message that will be recorded if the given function call is evaluated.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> When the wrapped function call runs, the provided message is added to the execution logs. If that function call is not executed, or its execution is not part of the final output, its debug log will not appear in the final result metadata. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You will benefit from this built-in if you want to observe: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Which branch of a conditional was executed, or</span> * <span lang="en" dir="ltr" class="mw-content-ltr">the order of evaluation in a composition.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Add debug log to function call ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say that you want to add debug logs to our example function "Join two strings with a space" or <code>Z30000</code>, so that different messages are added to the different possible outcomes. You could use our debugging builtin like this: </div> <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), add_debug_log( throw_error( Z30005, ... ), 'failed on first input' ) if( is_empty_string( Z30000K2 ), add_debug_log( throw_error( Z30005, ... ), 'failed on second input' ), add_debug_log( join_with_separator( Z30000K1, Z30000K2, " " ), 'both inputs are ok!' ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This way, </div> * <span lang="en" dir="ltr" class="mw-content-ltr">when called with an empty first input, the function will return a failed response, and the metadata will contain an <code>executorDebugLogs</code> entry with the "failed on first input" log.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">When called with an empty second input, the call will also fail, but the logged message will be "failed on second input"</span> * <span lang="en" dir="ltr" class="mw-content-ltr">When called with valid inputs, the function will return a successful response, and additionally the metadata will contain "both inputs are ok" in its <code>executorDebugLogs</code> key.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> This is the way this composition would look: </div> [[File:Add debug log expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Composition implementation using Add debug logs to log all possible execution paths</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Composition implementation using Add debug logs to log all possible execution paths</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Accessing execution debug logs === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Whether your execution logs are added via <code>Wikifunctions.Debug()</code> or via the {{Z|Z854}} built-in function, they are returned as part of the response metadata. To see the logs, once you run your function, click on the "Details" button that appears at the bottom of the "Result" section. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The error and debug information will appear at the top of the "Details" dialog. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> This is what you would see when running the composition from our previous example with valid and invalid inputs: </div> {| class="wikitable" | [[File:Execution logs success.png|frameless|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a successful execution with debug logs</span>]] | [[File:Execution logs failure.png|frameless|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a failed execution with debug logs</span>]] |- | <span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a successful execution: shows no errors, but displays the successful execution log: ''"both inputs are ok!"''</span> | <span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a failed execution: shows the error information, and the additional execution log for the first failure branch: ''"failed on first input"''</span> |} [[Category:How to create implementations| {{#translation:}}]] 5cd12m7irnalwgqr9qfobsq40gvbpin Wikifunctions:What Wikifunctions is not/lb 4 30833 331065 190629 2026-10-23T08:06:07Z FuzzyBot 207 Updating to match new version of source page 331065 wikitext text/x-wiki <languages/> {{shortcut|[[WF:NOT]]}} {{Draft}} <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions is a new kind of website, aiming for a new community. We very much hope to work together with many tools, sites, communities, and kinds of systems that are out there: we want to play together with IDEs, with cloud computing platforms, with app development sites, and many more. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> But we also aim to be a novel thing and we hope to shape a new unique space out for us: a Wikimedia project for everyone to collaboratively create and maintain a library of code functions to support the Wikimedia projects and beyond, for everyone to call and re-use in the world's natural and programming languages. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The scope of the project is within bounds, though. So, let us also explore '''what Wikifunctions is not'''. </div> <span id="Wikifunctions_is_not_an_encyclopædia_of_algorithms"></span> === Wikifunctions ass keng Enzyklopedie fir Algorithmen == <div lang="en" dir="ltr" class="mw-content-ltr"> This means that we will '''not''' concentrate on having pages for famous and not-so famous algorithms such as [[w:Euclidean algorithm|Euclid's]], [[w:Newton's method|Newton's]], or [[w:Dijkstra's algorithm|Dijkstra's algorithm]], aiming to represent all existing algorithms faithfully and in their historical context. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Yes, we expect to have a function for the [[w:Greatest common divisor|greatest common divisor]] (GCD) of two integers. And there might be one or more implementations which are based on Euclid's algorithm to calculate the GCD. But Wikifunctions' main goal is not to gather algorithms, and it would not be incomplete if it didn't include some, and used alternatives instead to compute the GCD. If you are looking for that, many Wikipedias are actually [[w:List of algorithms|great resources]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Unlike an encyclopedic overview of existing algorithms, Wikifunctions will also invite original work. We will not be restricted to functions that have been published elsewhere first, and we do not require for every function and implementation to be based on previously published work. Wikifunctions, much like Wikibooks and very unlike Wikipedia, will be open to novel contributions. The main criteria for implementations will be: under which conditions can we run a given implementation, and what resources is it expected to take? </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not an app development site == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We do not expect to make it possible to create full-fledged, stand-alone apps within Wikifunctions — there will be no place to store state, we don't aim to allow calling external APIs or directly cause changes to other sites, and we don't aim to package up apps with icons and UX, etc. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We absolutely expect Wikifunctions to be a very useful resource for app developers, and can very much imagine apps that are basically wrappers around one or more functions from Wikifunctions, but these would still need code and other assets which wouldn't be part of Wikifunctions. We are not competing in the area of no-code or low-code development sites. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a code hosting service == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions will host code — but not for whole projects, merely for individual functions. There won't be libraries, apps, or services developed on Wikifunctions with bug-trackers, forums, etc. There won't be a Web-based version control system such as ''Mercurial'' or ''Git'' running against Wikifunctions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Again, we hope that there will be libraries, apps, and services that will rely on functions available in Wikifunctions, but they would be developed on a different site, such as ''Gerrit'', ''GitHub'', or ''GitLab''. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a programming language, nor is trying to evangelise a particular language == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions will allow for functions to be implemented in a multitude of programming languages. The possibility to compose functions together to create higher level functions may look a little bit like a new programming language, but it will be extremely limited compared to most other programming languages, since we only allow for nested function calls and that's it. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not an Integrated Development Environment (IDE) == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We won't provide you with an interface for creating and developing software projects, interfacing with build, testing, and source control systems. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a question-and-answer website == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We are not competing with ''Stack Overflow'' and similar websites, where a developer would ask how to achieve a certain task and have community members discuss and answer the question. We won't contain code snippets to help answer the question, but we will organize code within our website to enable the evaluation of functions within a library of functions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a cloud computing platform == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We do not provide computing resources and access to services and APIs so that you can run your computational needs on our platform, either for money or for free. Use of Wikifunctions's evaluation platform is to improve access to knowledge for everyone. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a code snippet website == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We are not competing with code snippet sites such as GitHub Gists, [[w:Rosetta_Code|Rosetta Code]], [https://esolangs.org/ esolangs.org], or [http://helloworldcollection.de/ helloworldcollection.de]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions differs in that it allows running code and composing existing functions together to create new ones. As well, Wikifunctions is for useful and meaningful code, not temporary, arbitrary snippets that other platforms may accept. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a code education platform == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We are not focused on teaching people how to code, the material in Wikifunctions will not be laid out in a pedagogical order, and we also won't make sure to comprehensively cover all topics important for coding. In fact, we aim for Wikifunctions to be usable for people who don't know how to code and who don't need to learn how to code to use most of Wikifunctions effectively. Though the Wikifunctions community may well help each other in sharing best practices, style guides, and tips on how to use the site in different languages, these will be aimed at the purpose of serving the world's knowledge. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not (only) the boiler room for Abstract Wikipedia == </div> [[File:Mechanical_room_in_basement._Wayne_N._Aspinall_Federal_Building_and_U.S._Courthouse,_Grand_Junction,_Colorado_LCCN2014650034.tif|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">A '[[d:Q6804549|boiler room]]', where unsightly-but-vital machinery is hidden</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> Natural language generation (NLG) is the focus of {{SITENAME}} as of 2026, and the site began as part of the wider [[meta:Special:MyLanguage/Abstract_Wikipedia|Abstract Wikipedia project]], but NLG is far from the only field in which functions are being developed. That is to say, WF is necessary for AW, but AW is not necessary for WF. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> On top of the computer science staples of Boolean logic, arithmetic, and list manipulation, we have useful functions relating to disciplines such as [[Z16718|chemistry]], [[Z35550|dimensional analysis]], [[Z20074|electrical engineering]], [[Z22162|genomics]], [[Z10393|information theory]], [[Z26830|meteorology]], [[Z13955|number theory]], [[Z27919|physiology]], [[Z20094|probability]], [[Z24497|quantum mechanics]], [[Z14226|railroad engineering]], [[Z28600|timekeeping/chronometry]], and [[Z26841|trigonometry]]. </div> [[Category:Project concept{{#translation:}}]] of1oo202iawz351l9xi7prax8n7miny Z17958 0 34217 331155 250059 2026-10-23T08:38:46Z WikiLambda system 3 Updated the implementation list (see [[Help:Wikifunctions/Implementation_ordering_and_choosing|About implementation selection]]) 331155 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z17958" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z8", "Z17K2": "Z17958K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "an endofunction (domain=codomain)" }, { "Z1K1": "Z11", "Z11K1": "Z1004", "Z11K2": "une endofonction (domaine = codomaine)" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "Endofunktion" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z17958K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "initial input, must be compatible to (co)domain types" }, { "Z1K1": "Z11", "Z11K1": "Z1004", "Z11K2": "entrée initiale, doit être compatible" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "Eingabe" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z13518", "Z17K2": "Z17958K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "n times " }, { "Z1K1": "Z11", "Z11K1": "Z1004", "Z11K2": "N fois" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "Anzahl n" } ] } } ], "Z8K2": "Z1", "Z8K3": [ "Z20", "Z18001", "Z17960", "Z17961", "Z20325" ], "Z8K4": [ "Z14", "Z26421", "Z17959" ], "Z8K5": "Z17958" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "run unary endofunction n times" }, { "Z1K1": "Z11", "Z11K1": "Z1004", "Z11K2": "exécuter une endofonction unaire N fois" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "unäre Endofunktion n-mal ausführen" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1002", "Z31K2": [ "Z6", "run n times", "endofunction n times", "recursively run unary function" ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } g697h5wxknd4y3jb6nlsabncqs8vma4 Wikifunctions:How to create implementations/he 4 35103 331113 276449 2026-10-23T08:23:21Z FuzzyBot 207 Updating to match new version of source page 331113 wikitext text/x-wiki <languages/> הדף הזה מספק מדריך מפורט יותר ל'''יצירת מימושים''', מעבר לסקירה הכללית בדף {{ll|Wikifunctions:Introduction}}. <div lang="en" dir="ltr" class="mw-content-ltr"> == Types of Implementations == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In Wikifunctions, an '''implementation''' can take one of two main forms: '''code''' or '''composition'''. A code implementation directly expresses the function’s logic in any of the available programming languages (currently, Python3 or JavaScript). It’s most useful when the function’s behavior can’t easily be built from existing Wikifunctions, or when precise control over data processing is needed. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> A composition implementation, on the other hand, defines the function entirely by combining other existing functions, without writing code. Compositions are easier to understand, reuse, and translate into other languages automatically, but they depend on suitable building blocks already being available and often are less performant. In general, start by checking whether your goal can be achieved through composition; if it can’t, or if performance or fine-grained logic matters, choose a code implementation instead. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> There's a third type of implementation: '''built-ins'''. These are run by system-built code, and are not editable. Most likely all pre-defined functions will have a built-in implementation. In such cases, when opening the implementation page, you will see a message stating ''"{{int|wikilambda-implementation-selector-none}}"'' </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Practice Test-Driven Development == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> '''Test-Driven Development''', or '''TDD''', is a way of creating software where you write tests before you write the actual code. Tests are just a way of understanding what your function is supposed to do by listing examples and how they should work. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In Wikifunctions, writing tests first offers significant benefits. If you are working on an implementation, you can run your code against the existing tests to check that it behaves as expected. This makes it easier to catch errors early before even publishing your implementation. Tests are also a powerful way to describe the function you need. By writing tests, '''you clearly communicate the expected behavior''', and the community can step in and help with the implementation, or create alternative implementations. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Imagine you want to implement a Function that combines two strings with a space in between. A basic test for this might look like: </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello", "world" ) => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Once you have defined the basic behavior, it's important to '''think about edge cases'''—situations where the inputs are such that you might need some special behavior. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, what if your first string ends in a space, or your second string starts with a space? Should the function keep all existing spaces and add another one, or should it return a neatly spaced result with just a single space between the words? Depending on your requirements, you should build a test for such a case. For example, a test for this edge case could be either one of these — but not both!: </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> or ... </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Make sure that all possible special cases are covered by your tests, and once you have them, make sure that they are all connected to the Function by selecting them and clicking "Connect". </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Code implementations == </div> [[File:Code implementation.png|thumb|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions code editor initialized with a function template</span>|<span lang="en" dir="ltr" class="mw-content-ltr">When adding a new code implementation, the function template is initialized with the function and argument names</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> When creating an implementation using code, the Wikifunctions UI will set up a code editor with the selected language activated for syntax highlighting and validation. When the function to implement and the programming language are selected, this editor will be set with the correct function template: '''do not remove or edit this'''! Keep your code inside this function signature: if you need auxiliary functions, you can simply declare them inside your top-level function declaration. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Using input types in your code === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions types {{Z|Z6}} and {{Z|Z40}} can be used as if they were native types in both JavaScript and Python3. For example, a String input can be concatenated or a Boolean be directly used in a logical expression. To use other types in your code implementations, you will have to look deeper into the type, figure out if it has a conversion to a native equivalent, and treat it accordingly. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, let's say we want to write some Python code that handles an input of type {{Z|Z20420}}. In the page for this type, let's look at its "type converters to code" and search for a Python one. The converter {{Z|Z20424}} will be applied to our date input before our code, so looking at "native type" we know that our input will be a Python ''dict'' and looking at the implementation we can see the keys we can expect: </div> <syntaxhighlight lang="python3"> return { 'K1': year, 'K2': month, 'K3': day } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> When a type doesn't have a converter, you'll have to access its parts directly using its keys. For example, let's assume that your function <code>Z30000</code> has one input <code>Z30000K1</code> of type {{Z|Z11}}. This type has two keys: <code>Z11K1</code> for the language (itself an object of type {{Z|Z60}}), and <code>Z11K2</code> for the string value. Similarly, the language object has a key <code>Z60K1</code> for the language code. So, to get a string with the language code and the text, you can write: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1 ) { // e.g. "en: some text" return Z30000K1.Z11K1.Z60K1 + ": " + Z30000K1.Z11K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> For a quick reference of the available type conversions visit [[Special:MyLanguage/Wikifunctions:Execution targets#Default type conversion|the default type conversion table]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Returning the right outputs === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Similarly to the way you treat inputs, outputs need to match the type specified in the function definition. Some can be treated as simply as native types, so any string output will be converted into a Wikifunctions {{Z|Z6}} object and any native boolean returned by your implementation will be converted into a Wikifunctions {{Z|Z40}} object. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Those types that have "type converters from code" will apply the appropriate function to the output, in order to build the required type. Following the example of {{Z|Z20420}}, the {{Z|Z20443}} will transform the output from your implementation–a dict with K1, K2 and K3 keys–into its correct ZObject representation. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For types that don't have converters from code, you can carefully build and return the output objects. For example, imagine that our function <code>Z30000</code> takes two string inputs: language code and text, and should return a {{Z|Z11}} object. You can do this in Python by using the <code>ZObject</code> constructor: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): lang_object = ZObject( {"Z1K1": "Z9", "Z9K1": "Z60"}, Z60K1 = Z30000K1 ) return ZObject( {"Z1K1": "Z9", "Z9K1": "Z11"}, Z11K1 = lang_object, Z11K2 = Z30000K2 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Or in JavaScript: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { const langObject = new ZObject( new Map( [ [ "Z60K1", Z30000K1 ] ] ), { "Z1K1": "Z9", "Z9K1": "Z60" } ); const monolingualKeys = new Map( [ [ "Z11K1", langObject ], [ "Z11K2", Z30000K2 ] ] ); return new ZObject( monolingualKeys, { "Z1K1": "Z9", "Z9K1": "Z11" } ); } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> You can learn more about the <code>ZObject</code> class and other useful constructors in {{ll|Wikifunctions:Execution_targets#Custom_and_non-built-in_type_conversion}} </div> {{phab|T392750}}<div lang="en" dir="ltr" class="mw-content-ltr"> As of 2026-05, trying to return a list of lists may fail, so you're not able to implement such functions in code. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Code in Python === </div> <div class="mw-translate-fuzzy"> בפרק הזה, אנחנו נותנים דוגמה מוחשית על יצירת מימוש בצורת קוד בפייתון. נניח שאנחנו רוצים ליצור מימוש לפונקציה שמאחדת שתי מחרוזות קלט על־ידי הוספת רווח ביניהן, ומחזירה את התוצאה של זה. נניח שמזהה ה־Z של הפונקציה הזאת הוא Z11057. </div> <div class="mw-translate-fuzzy"> המימוש מוגדר באמצעות מזהה ה־Z של הפונקציה. כך גם הארגומנטים של הפונקציה. אז במקרה של פונקציה Z11057 עם שני הארגומנטים שלה, השורה הראשונה צריכה להיראות כך: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> As we described before, we know that the arguments (<code>Z30000K1</code> and <code>Z30000K2</code>) are Strings, so we can treat them as simply as we use native strings in Python. Also, the function should return a String. For our example, we simply return the two arguments concatenated with a space in between: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): return Z30000K1 + " " + Z30000K2 </syntaxhighlight> היות שזה פיתון, אל תשכחו להזיח את השורה הזאת. <div lang="en" dir="ltr" class="mw-content-ltr"> If you have followed our advice to [[#Practice Test-Driven Development|practice TDD]], you will already have a set of tests that you know should work. If that's the case, while building your implementation you can click on the circular arrow in the Tests panel, and see if your implementation passes all of them. </div> יש לזכור שלקוד בזמן הריצה אין מצב (state). אין להניח מה יהיו הערכים של משתנים גלובליים או סטטיים. אם יש לך שאלות נוספות לגבי מה אפשר ומה אי־אפשר לעשות בפייתון, אפשר לשאול בדף [[Wikifunctions:Python implementations]]. <div lang="en" dir="ltr" class="mw-content-ltr"> === Code in JavaScript === </div> <div class="mw-translate-fuzzy"> בפרק הזה, אנחנו נותנים דוגמה מוחשית על יצירת מימוש בצורת קוד ב־JavaScript. נניח שאנחנו רוצים ליצור מימוש לפונקציה שמאחדת שתי מחרוזות קלט על־ידי הוספת רווח ביניהן, ומחזירה את התוצאה של זה. נניח שמזהה ה־Z של הפונקציה הזאת הוא Z11057. </div> <div class="mw-translate-fuzzy"> המימוש מוגדר באמצעות מזהה ה־Z של הפונקציה. כך גם הארגומנטים של הפונקציה. אז במקרה של פונקציה Z11057 עם שני הארגומנטים שלה, השורה הראשונה צריכה להיראות כך: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> We know that the arguments (<code>Z30000K1</code> and <code>Z30000K2</code>) are Strings, so we can treat them as native strings in JavaScript. Also, the function should return a String. To complete our function, you can then add a line concatenating the input strings, like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> If you have tests as recommended in the [[#Practice Test-Driven Development|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes all of them. </div> יש לזכור שלקוד בזמן הריצה אין מצב (state). אין להניח מה יהיו הערכים של משתנים גלובליים או סטטיים. אם יש לך שאלות נוספות לגבי מה אפשר ומה אי־אפשר לעשות ב־JavaScript, אפשר לשאול בדף [[Wikifunctions:JavaScript implementations]]. <div lang="en" dir="ltr" class="mw-content-ltr"> === Calling another Wikifunctions function === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> A code implementation can call certain other Wikifunctions functions, receive the output of the call, and use that output in further processing. We refer to such calls as callbacks. At present, due to security and performance concerns, only the following built-in Wikidata fetch and search functions can be called in this way: {{Z|Z6820}}, {{Z|Z6821}}, {{Z|Z6822}}, {{Z|Z6824}}, {{Z|Z6825}}, {{Z|Z6826}}, {{Z|Z6830}}, and {{Z|Z6831}}. This capability is in an initial stage of deployment; we hope to allow calls to a broader range of functions in the future. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Let’s look at a JavaScript implementation containing a callback. This implementation fetches an item from Wikidata, extracts the label of that item in a given language, and returns the label string. The item to fetch is given by argument <code>Z400K1</code>, and the language is given by <code>Z400K2</code>. </div> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const item = Wikifunctions.Call('Z6821', Z400K1); for (const label of item.Z6001K2.Z12K1) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> A callback is made by calling <code>Wikifunctions.Call</code>, as shown in the example. The first argument to <code>Wikifunctions.Call</code> is always the ZID of the function to be called – in this case, {{Z|Z6821}}, which takes a single argument. Following that, the arguments to be passed to that function are listed, separated by commas. Here, that argument, <code>Z400K1</code>, is the same value that was passed to the function <code>Z400</code>. This is a common pattern of argument passing to callbacks, but their arguments can also be built using the <code>ZObject</code> constructor (as explained above), or obtained in other ways. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The value of <code>Z400K1</code> would be an instance of {{Z|Z6091}}, containing the QID of the item to be fetched. Line 2 of the example calls <code>Z6821</code> to fetch that item from Wikidata and assigns the resulting ZObject to the const <code>item</code>. The remaining code iterates over the item’s labels until it finds the one matching the language given by <code>Z400K2</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For the first example above, we have used <code>Z6821</code> for simplicity. However - unless an entire entity is needed by the implementation, it is strongly recommended to use <code>Z6820</code> to retrieve Wikidata items, which can be quite large. Although a call to <code>Z6820</code> is a bit more complex, its parameters allow for fetching selected portions of a Wikidata item, which can greatly improve performance and avoid some errors, by reducing the network bandwidth and processing time that are needed. (<code>Z6820</code> can also be used in place of <code>Z6822</code>, <code>Z6824</code>, <code>Z6825</code>, and <code>Z6826</code>, to get similar bandwidth-reduction benefits.) </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Just below we show how <code>Z6820</code> can be used, in <code>Wikifunctions.Call</code>, to implement the same behavior as above. Note that we use the second argument passed to <code>Z6820</code>, <code>[labelsPart]</code>, to say “Just return the item’s labels”, and we use the third argument, <code>[Z400K2]</code>, to say “Just return labels in the given language”. (This argument would also apply to aliases and descriptions, if they were included in the result.) </div> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const labelsPart = new ZObject( new Map( [ ['Z6030K1', new ZReference('Z6033')] ] ), {Z1K1: 'Z9', Z9K1: 'Z6030'} ); const entities = Wikifunctions.Call( 'Z6820', [Z400K1], [labelsPart], [Z400K2], []); const item = entities.get(Z400K1.Z6091K1); const labels = item.Z6001K2.Z12K1; for (const label of labels) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Other things to note: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Even though code implementations are now able to fetch Wikidata entities, it is recommended that they not be written to return ''entire'' entities. This is because of current limitations on the size of the value returned from a code implementation. To fetch and return an entire large entity, it’s better to call the fetch function from a composition.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Only one callback can execute at a time. For security reasons, it is not possible to use the concurrency features of JavaScript or Python to execute multiple callbacks in parallel.</span> ** <span lang="en" dir="ltr" class="mw-content-ltr">Keep in mind, however, that you can fetch multiple entities at once using Z6820.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">There is currently a 3 MiB limit on the size of Wikidata content that can be returned to a code implementation, by a single callback. The same limit applies to the size of the result returned from a code implementation.</span> <span id="Compositions"></span> <div class="mw-translate-fuzzy"> == הרכבה == </div> <div class="mw-translate-fuzzy"> בפרק הזה נותנים דוגמה מוחשית על יצירת מימוש בצורת הרכבה (composition). נניח שאנחנו רוצים ליצור מימוש לפונקציה שמאחדת שתי מחרוזות קלט על־ידי הוספת רווח ביניהן, ומחזירה את התוצאה של זה. נניח שמזהה ה־Z של הפונקציה הזאת הוא Z11057. </div> <div class="mw-translate-fuzzy"> בדרך־כלל כדאי לחשוב תחילה כיצד לשלב פונקציות קיימות כדי ליצור את הפלט הרצוי. לפעמים זה יכול להיות טריוויאלי, ואפשר פשוט להמשיך עם הרכבת פונקציות, אבל במקרים רבים כדאי לרשום מה ההרכבה הרצויה. ממשק ההרכבה של ויקיפונקציות עדיין לא טוב כל־כך בעריכת הרכבות, ולכן מומלץ קודם להבין מה בדיוק ברצונך ליצור. </div> <div class="mw-translate-fuzzy"> למשל, עבור הפונקציה הנתונה, נוכל להשתמש ב[[{{Z|Z10000}}|פונקציה לשרשור מחרוזות]], שכבר קיימת. הפונקציה הזאת לוקחת שתי מחרוזות ויוצרת מהן מחרוזת אחת. אבל אנחנו צריכים להוסיף רווח ביניהן. אז תחילה אנו משרשרים רווח לקצה המחרוזת הראשונה, ולאחר מכן משרשרים את המחרוזת השנייה לתוצאה של השרשור הראשון הזה. אז אפשר לרשום את ההרכבה שלנו כך: </div> <syntaxhighlight lang="prolog"> join_strings( join_strings( Z30000K1, " " ), Z30000K2 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> There are multiple ways to write a composition: notice that the same thing could be accomplished with: </div> <syntaxhighlight lang="prolog"> join_strings( Z30000K1, join_strings( " ", Z30000K2 ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> An alternative implementation could also use the existing Function {{Z|Z15175}}, so your composition could be: </div> <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> As you can see, there are multiple ways to accomplish this, so take your time and explore the existing functions available in the {{ll|Wikifunctions:Catalogue}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's try to create the second example, <code>join_strings(Z30000K1, join_strings(" ", Z30000K2))</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In order to create this: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›" icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search for the name of the outermost function you want to use, which in this example is "join two strings". Then, select the wanted function from the dropdown list.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">You will see two new fields, one for each of the arguments needed for the selected function.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">For the first argument, we want to select the first input to our function:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and select "Argument reference".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id" you can now select the first string of your function from the dropdown, which contains all available inputs.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">For the second argument, we want to use the result of another call to "join two strings":</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and select "Function call".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function you want to call, which is again "join two strings".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For this inner function call, configure the "first string" by simply typing a white space in the text field, and configure the "second string" as you did for step 6: change it using the "…" button to "Argument reference", and then select the second argument in the dropdown.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Your composition is now complete! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You can expand and collapse the details using the chevron buttons to see how it looks. If you already have Tests as recommended in the [[#Practice Test-Driven Development|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes the tests. Once your composition passes the tests, go ahead and publish it. </div> [[File:Composition implementation expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its expanded view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its expanded view</span>]] [[File:Composition implementation collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its collapsed view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its collapsed view</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions error handling == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As a Wikifunctions function creator, you might want to warn the user calling your function when something goes wrong in the code, or when their inputs do not fit a certain criteria. For example, if your Function expects a string input to contain a name, you might want to check that the name is not empty and, if it is, show an error message that the person using your Function can understand. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For this purpose, you can use <code>Wikifunctions.Error()</code> from your code implementations or the function {{Z|Z851}} from your compositions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section you will learn: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">How to throw errors from both code and composition implementations,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to write tests for error cases, and</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to catch and handle errors thrown by functions that you are using in your compositions.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Throwing errors from code implementations === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> When writing code, both from JavaScript and Python, you can use <code>Wikifunctions.Error()</code> to end the execution with a wanted error. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> <code>Wikifunctions.Error()</code> has two parameters: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Error type: a string containing the ZID of the error type you want to return.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Error arguments: a list of string arguments to build the error.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's go one by one: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Error type ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> An error type is an object that describes a kind of error that could happen in the system. There are a number of built-in error types but you can also build other error types that are more suited to your use case. When using errors, the best idea is to browse through the available error types, which can be explored in [[Special:ListObjectsByType/Z50|this list]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If there are no errors that fit your case, create a new one by going to the create page, and selecting "Error type" in the type selector. Then, set the necessary fields: </div> [[File:Error type.png|thumb|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Error type creation in Wikifunctions</span>|<span lang="en" dir="ltr" class="mw-content-ltr">To create new Error type (Z50), edit the label and add the necessary keys.</span>]] * <span lang="en" dir="ltr" class="mw-content-ltr">'''Label''' – This is the main title of the error, which should contain a short but descriptive message. Set the error label on the right-side box titled "About".</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Keys''' – Keys contain additional information about what caused the error. For example, if an input had the wrong format, you might want to inform the user of what was the input content when raising the error. To use them in your implementations, keys should be strings. To create a key, click on the "[+]" icon below "keys", select "String" under "value type", and add a label that describes it appropriately, for example "current input". Once you have all the necessary keys, you can Publish your error type and keep the ID of the newly created object.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error message''' – Error types can contain a multilingual array of HTML parametrized error messages. The parameter notation is $1, $2, etc., where the digit corresponds to the error type key. For example, when creating an error type with one string key "current input", the error message can use the positional parameter "$1", which will be replaced with the value of the "current input" key at the time of rendering the error. To add HTML messages, click on the "[+]" icon below "html fragments", select a language and input the HTML string.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Error arguments ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Error arguments correspond to the keys of the Error type, and they should provide additional information to understand the error. Error arguments should always be Strings. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Wikifunctions.Error() ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say that you want an error to be thrown when either your first or your second input are empty. You have already created the error type, and the assigned ZID was <code>Z30005</code>. Your error type has two string keys: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Input key: contains the key of the failing input</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Input value: contains the current value of the failing input</span> <div lang="en" dir="ltr" class="mw-content-ltr"> To raise an error in your JavaScript implementation you should do something like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { // If the first input is empty, raise error Z30005 // with two string args: [ first input key, first input value ] Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { // If the second input is empty, raise error Z30005 // with two string args: [ second input key, second input value ] Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> To raise an error in your Python implementation you should do something like this: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": # If the first input is empty, raise error Z30005 # with two string args: [ first input key, first input value ] Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": # If the second input is empty, raise error Z30005 # with two string args: [ first input key, first input value ] Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Remember that calling <code>Wikifunctions.Error()</code> ends the execution! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Throwing errors from compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If you are creating a composition implementation, you can throw an error by calling the special function {{Z|Z851}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Throw Error function (Z851) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z851}} function is similar to the <code>Wikifunctions.Error()</code> method and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – A reference to the Error type you want to raise</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error parameters''' – A list with the arguments to create your Error, which should also be Strings.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Throw Error ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say you want to modify your composition so that it first checks that the arguments are not empty, and raises an error when it finds an empty one. Then, if none of them are empty, it runs the original composition, which is: </div> <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> To do this, you need to create conditional paths, for which you can use the {{Z|Z802}} function. Think of it like this: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the first argument is empty, throw an error for the first argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Else, proceed to check the second argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the second argument is empty, throw an error for the second argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Else, proceed with the success path and return the joint strings with the space separator</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Or in functional pseudo code: </div> <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), throw_error( Z30005, [ "Z30000K1", Z30000K1 ] ), if( is_empty_string( Z30000K2 ), throw_error( Z30005, [ "Z30000K2", Z30000K2 ] ), join_with_separator( Z30000K1, Z30000K2, " " ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's create this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+” button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›” icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the outermost function you want to use, which in this case is "if".</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Check the validity of the first argument:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "condition", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "is empty string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "input", click on the "…" button and select "argument reference"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id", select the first input (e.g. "first string")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse the "condition" function call if you want, by clicking on the down-chevron next to "condition". You should see something like "f(x) is empty string( → first string )"</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Throw error if the condition is true:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "then", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Throw Error"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error type", search and select your error type (you can directly input the error ID if you know it, e.g. Z30005)</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error parameters", add two items by clicking on the "+" button</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For "Item 1" (offending argument key), set its type to "String" and write the argument identifier (e.g. "first input", or "Z30000K1")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For "Item 2" (offending argument value), click on the "…" next to "Item 2" and select "argument reference"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id", select the first input (e.g. "first string")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse the "then" function call if you want, by clicking on the down-chevron next to "then". You should see something like "f(x) Throw Error( Input was the wrong format, Typed list( Object, "first input", → first string ) )"</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Continue to check the second argument if the first was good:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "else", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "if"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Set up "condition" to check the validity of the second argument by following the same process as described in step 5.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Set up "then" to throw an error for the second argument by following the same process as described in step 6.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Finally, set up the success path:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to the nested "else", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the successful function, which in this case can be "join strings with separator"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and set it to "argument reference", then select "first string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and set it to "argument reference", then select "second string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "separator" add a space into the text field</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The resulting function call should look like this: </div> [[File:Throw error expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function</span>]] [[File:Throw error collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function, in its collapsed view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function, in its collapsed view</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Handling errors in compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> While it is useful to allow functions to raise expected errors, it is crucial to be able to handle errors in your compositions in order to safely use these functions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say you want to create a new function "full name of a person" – we will refer to it with the ZID <code>Z30010</code>. This function should return the full name of a person given a first and last names, but if any of the two fields are empty, it should return the text "Unknown" instead. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You could create a composition using our example function "Join two strings with a space" or <code>Z30000</code> to generate the name. If any of the inputs are empty, you know that <code>Z30000</code> will throw an error of type <code>Z30005</code>. Using the function {{Z|Z850}} as a wrapper, you can attempt the join operation and intercept a possible error to simply return "Unknown" whenever it occurs. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Try-Catch function (Z850) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z850}} function is built-in with ZID <code>Z850</code> and takes three arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – The initial function call to run. If nothing goes wrong, the response will be the result of this function call.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – An error type to catch in case it is thrown during the execution of the first function call.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error handler''' – A function call that will be run in case the error specified above is caught during the execution of the initial function call. If that happens, the result of the error handler will be the value returned.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Try-Catch ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Once we have all the functions for our composition, we can craft it like this: </div> <syntaxhighlight lang="prolog"> try_catch( join_with_space( Z30010K1, Z30010K2 ), Z30005, echo( "Unknown" ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This means that: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">The "Join two strings with a space" function will be tried with the two inputs and, if everything goes well, the output of this function will be returned</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If any of the inputs are blank, "Join two strings with a space" with raise an error of type <code>Z30005</code></span> * <span lang="en" dir="ltr" class="mw-content-ltr">Our {{Z|Z850}} will then detect this error and run the {{Z|Z801}} function to return "Unknown"</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's create this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›” icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the outermost function you want to use, which in this case is "Try-Catch".</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Set the main function call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under the field where the "Try-Catch" function is selected, next to the "function call" key, click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the function "join two strings with space"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and select "argument reference", then select the "first name" argument from the dropdown.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and select "argument reference", then select the "second name" argument from the dropdown.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Select the error to catch:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error type", search and select "bad string input" – you can search directly by its ZID <code>Z30005</code></span> # <span lang="en" dir="ltr" class="mw-content-ltr">Set the error handler function call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "error handler", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "echo"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "input" and "type", search and select the type "String"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now, under "input", type "Unknown" in the text field</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The resulting function should look like this: </div> [[File:Try catch expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in expanded mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in expanded mode</span>]] [[File:Try catch collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in collapsed mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in collapsed mode</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Testing your failure use cases === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As we introduced in the above section about [[#Practice Test-Driven Development|practicing TDD]], it's important to test not only the most common paths, but also the possible edge cases. It is equally important to test failure behavior. In this section we will give you the tools necessary to test that your function fails with a given set of inputs, and that the error thrown is the expected one. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> To do that, you will need other two system functions: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Is error type (Z852) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z852}} function is built-in with ZID <code>Z852</code> and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error''' – An {{Z|Z5}} object, which can be thrown by a failing call. An error instance has a type and a value.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – A reference to an {{Z|Z50}} which will be compared to the type of the Error passed as a first argument. If that's the case, the function will return true.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Get error thrown by function call (Z853) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z853}} function is built-in with ZID <code>Z853</code> and takes one argument: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – A function call which can either return a successful value of any type, or throw an error.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> This function returns a {{Z|Z882}} with a {{Z|Z40}} in first place and an {{Z|Z1}} in the second: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the Function call runs successfully and hence does not throw any error, the returned pair will contain False in the first place, and void in the second.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the Function call throws an error, the returned pair will contain True in the first place, and the caught error in the second.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> To use this function in your compositions, you might need to use the additional functions: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">{{Z|Z821}}, and</span> * {{Z|Z822}} <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Testing errors ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say our target function, "Join two strings with a space" or <code>Z30000</code>, throws an error of type <code>Z30005</code> and we want to test this behavior. To do that we need to: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Throw a failing function call</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Get the error using the function {{Z|Z853}}</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Check that the error is the right type with {{Z|Z852}}</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Tests have two fields: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Call''' – A function call that will produce an output with the inputs you want to test. This call will return a value.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Result validation''' – A function call that will validate that the value returned by the call above is the expected one. The first argument of this function call will be automatically assigned to take the return value of the first call.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> For step-by-step instructions on how to create tests, see {{ll|Wikifunctions:Introduction#Create_tests}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In our example, we can structure it like this — but this is not the only way! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The call, which will return an {{Z|Z5}} object: </div> <syntaxhighlight lang="prolog"> error = get_second_element_of_typed_list( get_error_thrown_by( join_strings_by_whitespace( "", "not empty" ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> And the result validation, which will take the {{Z|Z5}} object as its first argument: </div> <syntaxhighlight lang="prolog"> is_error_type( error, Z30005 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's do this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding a test by clicking on the "+" button in the "Tests" table from your Function page. The "call" and "result validation" fields already have some functions pre-set, but to test the errors we will need to change them.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">First, let's set the call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "call", click the "›" chevron button to expand the function call.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", edit the field and search and select the function "Get second element of a typed pair"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Once selected, next to "Typed pair", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Get error thrown by function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "function call", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Join two strings with a space" (or by ZID <code>Z30000</code>)</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now set the inputs so that they cause a failure: at least one of them should be empty.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse your "call" by clicking again on the down-chevron button if you want!</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Next, let's set the result validation:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "result validation", click the "›" chevron button to expand the function call.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", edit the field and search and select the function "Is error type"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now you will only be asked to configure the second argument. Under "error type", search and select your <code>Z30005</code> error type.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">And you are done! You can now click the circular arrow in the "Implementations" box and you should see green checks.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> If everything went right, you can now save your test. It should look like this: </div> [[File:Get error expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in expanded mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in expanded mode</span>]] [[File:Get error collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in collapsed mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in collapsed mode</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Creating actionable error messages === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As described above, Error Types have an optional key <code>Z50K3</code> which contains a multilingual list of HTML strings. When rendering information about an error, the messages stored in the error type can help create a clear, precise, informative, translatable and actionable error message. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For that purpose, error messages can contain parameters like <code>$1</code>, <code>$2</code>, etc., where the digit corresponds to the error type argument and its value in the error instance. These error messages are rendered in Wikifunctions inside the "Details" dialog window after executing a function call. Additionally, these error messages are surfaced in other client interfaces, like Abstract Wikipedia, to provide better guidance to Abstract Content editors. </div> [[File:Wikifunctions actionable error message example in the Details dialog.png|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">The error message is rendered using the HTML message of the error type and the error argument values.</span>]] [[File:Wikifunctions actionable error message example in Abstract Wikipedia.png|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">When available, the HTML error message is rendered in the Abstract Wikipedia preview section.</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> Let's use a real example to understand the benefits of HTML error messages: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The function {{Z|Z37847}} returns the first Lexeme reference given a Wikidata Item reference and a language. When there is no Lexeme for this Item-Language combination, it throws an error of type {{Z|Z28248}}, which has three keys: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K1''' is the input Wikidata item QID</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K2''' is the connecting property, in this case <code>P5137/item for this sense</code></span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K3''' is the language code</span> <div lang="en" dir="ltr" class="mw-content-ltr"> When calling this function for a Wikidata lexeme that doesn't exist, the call will throw an error instance like this: </div> <syntaxhighlight lang="json" highlight="10,12"> { "Z1K1": "Z5", "Z5K1": "Z28248", "Z5K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z885", "Z885K1": "Z28248" }, "Z28248K1": "Q319", "Z28248K2": "P5137", "Z28248K3": "ast" } } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> While the error type label indicates: <code>No matching lexeme for item in language</code>, a better error message should indicate: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">which is the failing item,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">which is the language missing, and</span> * <span lang="en" dir="ltr" class="mw-content-ltr">what are the possible ways to fix it.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The error message <code>Z50K3</code> field can provide this functionality. Whenever an Error Type has an error message for the user language (or any of its fallbacks), the error message shown will be rendered by: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">First, replacing the message parameters with the values of the keys. In our example, any <code>$1</code> will be replaced with the value of <code>Z28248K1</code> ("Q319"), <code>$2</code> with "P5137", and <code>$3</code> with "ast",</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Last, sanitizing and rendering the HTML message.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> So a HTML message like: </div> <syntaxhighlight lang="html"> There is no matching lexeme for the item $1 in "$3".<br> <a href="http://wikidata.org/wiki/$1">Edit in Wikidata</a> </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Will become: </div> : There is no matching lexeme for the item Q319 in "ast" : [[d:Q319|Edit in Wikidata]] <div lang="en" dir="ltr" class="mw-content-ltr"> == Debugging your implementations == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Sometimes things can go wrong. A function might behave differently than expected or a value might not look quite right. Sometimes implementations are really complex and, because they are run in a sandboxed environment, it can seem really difficult to debug. To help understand what's going on inside a function call, Wikifunctions includes a small set of debugging tools. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> These tools don't change the result of a function, but will add extra information to the returned metadata, which you can observe after running the function. You can use <code>Wikifunctions.Debug()</code> from your code implementations or the function {{Z|Z854}} from your compositions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section you will learn: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">How to add debug messages from both code and composition implementations,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to inspect the metadata manually or via the UI to inspect these logs.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Debugging your code implementations === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> When writing code, both from JavaScript and Python3, you can use <code>Wikifunctions.Debug()</code> to add a message to your debugging log and continue the execution. </div> {{phab|T441028}} <div lang="en" dir="ltr" class="mw-content-ltr"> <code>Wikifunctions.Debug()</code> has one parameter, which is generally expected to be a string. However, any other object passed as parameter will get directly converted into a string. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If we want to add debug logs to our code implementations for our "Join two strings with a space" example function, we can do, in JavaScript: </div> <syntaxhighlight lang="JavaScript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { Wikifunctions.Debug( `first input is empty "${ Z30000K1 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { Wikifunctions.Debug( `second input is empty "${ Z30000K2 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } Wikifunctions.Debug( "both inputs are fine" ); return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> And the same in your Python3 implementation will be: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": Wikifunctions.Debug( 'first input is empty "'+Z30000K1+'"' ) Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": Wikifunctions.Debug( 'second input is empty "'+Z30000K2+'"' ) Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) Wikifunctions.Debug( 'both inputs are fine' ) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This way, no matter what happens, we will be adding one message to your debugging logs: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the function call fails when checking on the first or second input, the result of the execution will be a failure, but it will contain one informative log about what branch caused the failure.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the function call succeeds—because both inputs are valid—the function call will return the joined string, but the returned metadata will also contain a debug log.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Debugging your compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> To support debugging compositions, Wikifunctions provides the built-in function {{Z|Z854}}. This function allows you to attach debug messages to the execution of any function call that generates the final output. The debug logs collected during the evaluation are returned as part of the execution metadata, under the <code>executorDebugLogs</code> key. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Add debug log to function call (Z854) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z854}} function is built-in with ZID <code>Z854</code> and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – Any composition you want to execute.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Debug log''' – A string message that will be recorded if the given function call is evaluated.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> When the wrapped function call runs, the provided message is added to the execution logs. If that function call is not executed, or its execution is not part of the final output, its debug log will not appear in the final result metadata. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You will benefit from this built-in if you want to observe: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Which branch of a conditional was executed, or</span> * <span lang="en" dir="ltr" class="mw-content-ltr">the order of evaluation in a composition.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Add debug log to function call ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say that you want to add debug logs to our example function "Join two strings with a space" or <code>Z30000</code>, so that different messages are added to the different possible outcomes. You could use our debugging builtin like this: </div> <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), add_debug_log( throw_error( Z30005, ... ), 'failed on first input' ) if( is_empty_string( Z30000K2 ), add_debug_log( throw_error( Z30005, ... ), 'failed on second input' ), add_debug_log( join_with_separator( Z30000K1, Z30000K2, " " ), 'both inputs are ok!' ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This way, </div> * <span lang="en" dir="ltr" class="mw-content-ltr">when called with an empty first input, the function will return a failed response, and the metadata will contain an <code>executorDebugLogs</code> entry with the "failed on first input" log.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">When called with an empty second input, the call will also fail, but the logged message will be "failed on second input"</span> * <span lang="en" dir="ltr" class="mw-content-ltr">When called with valid inputs, the function will return a successful response, and additionally the metadata will contain "both inputs are ok" in its <code>executorDebugLogs</code> key.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> This is the way this composition would look: </div> [[File:Add debug log expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Composition implementation using Add debug logs to log all possible execution paths</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Composition implementation using Add debug logs to log all possible execution paths</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Accessing execution debug logs === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Whether your execution logs are added via <code>Wikifunctions.Debug()</code> or via the {{Z|Z854}} built-in function, they are returned as part of the response metadata. To see the logs, once you run your function, click on the "Details" button that appears at the bottom of the "Result" section. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The error and debug information will appear at the top of the "Details" dialog. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> This is what you would see when running the composition from our previous example with valid and invalid inputs: </div> {| class="wikitable" | [[File:Execution logs success.png|frameless|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a successful execution with debug logs</span>]] | [[File:Execution logs failure.png|frameless|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a failed execution with debug logs</span>]] |- | <span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a successful execution: shows no errors, but displays the successful execution log: ''"both inputs are ok!"''</span> | <span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a failed execution: shows the error information, and the additional execution log for the first failure branch: ''"failed on first input"''</span> |} [[Category:How to create implementations| {{#translation:}}]] mj1tizb7s6kknfcvv5hzyw0zua04epg Wikifunctions:How to create implementations/sk 4 35417 331122 296945 2026-10-23T08:23:28Z FuzzyBot 207 Updating to match new version of source page 331122 wikitext text/x-wiki <languages/> Táto stránka poskytuje podrobnejšieho sprievodcu '''vytváraním implementácií''', podrobnej ako v {{ll|Wikifunctions:Introduction}}. <div lang="en" dir="ltr" class="mw-content-ltr"> == Types of Implementations == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In Wikifunctions, an '''implementation''' can take one of two main forms: '''code''' or '''composition'''. A code implementation directly expresses the function’s logic in any of the available programming languages (currently, Python3 or JavaScript). It’s most useful when the function’s behavior can’t easily be built from existing Wikifunctions, or when precise control over data processing is needed. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> A composition implementation, on the other hand, defines the function entirely by combining other existing functions, without writing code. Compositions are easier to understand, reuse, and translate into other languages automatically, but they depend on suitable building blocks already being available and often are less performant. In general, start by checking whether your goal can be achieved through composition; if it can’t, or if performance or fine-grained logic matters, choose a code implementation instead. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> There's a third type of implementation: '''built-ins'''. These are run by system-built code, and are not editable. Most likely all pre-defined functions will have a built-in implementation. In such cases, when opening the implementation page, you will see a message stating ''"{{int|wikilambda-implementation-selector-none}}"'' </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Practice Test-Driven Development == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> '''Test-Driven Development''', or '''TDD''', is a way of creating software where you write tests before you write the actual code. Tests are just a way of understanding what your function is supposed to do by listing examples and how they should work. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In Wikifunctions, writing tests first offers significant benefits. If you are working on an implementation, you can run your code against the existing tests to check that it behaves as expected. This makes it easier to catch errors early before even publishing your implementation. Tests are also a powerful way to describe the function you need. By writing tests, '''you clearly communicate the expected behavior''', and the community can step in and help with the implementation, or create alternative implementations. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Imagine you want to implement a Function that combines two strings with a space in between. A basic test for this might look like: </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello", "world" ) => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Once you have defined the basic behavior, it's important to '''think about edge cases'''—situations where the inputs are such that you might need some special behavior. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, what if your first string ends in a space, or your second string starts with a space? Should the function keep all existing spaces and add another one, or should it return a neatly spaced result with just a single space between the words? Depending on your requirements, you should build a test for such a case. For example, a test for this edge case could be either one of these — but not both!: </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> or ... </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Make sure that all possible special cases are covered by your tests, and once you have them, make sure that they are all connected to the Function by selecting them and clicking "Connect". </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Code implementations == </div> [[File:Code implementation.png|thumb|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions code editor initialized with a function template</span>|<span lang="en" dir="ltr" class="mw-content-ltr">When adding a new code implementation, the function template is initialized with the function and argument names</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> When creating an implementation using code, the Wikifunctions UI will set up a code editor with the selected language activated for syntax highlighting and validation. When the function to implement and the programming language are selected, this editor will be set with the correct function template: '''do not remove or edit this'''! Keep your code inside this function signature: if you need auxiliary functions, you can simply declare them inside your top-level function declaration. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Using input types in your code === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions types {{Z|Z6}} and {{Z|Z40}} can be used as if they were native types in both JavaScript and Python3. For example, a String input can be concatenated or a Boolean be directly used in a logical expression. To use other types in your code implementations, you will have to look deeper into the type, figure out if it has a conversion to a native equivalent, and treat it accordingly. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, let's say we want to write some Python code that handles an input of type {{Z|Z20420}}. In the page for this type, let's look at its "type converters to code" and search for a Python one. The converter {{Z|Z20424}} will be applied to our date input before our code, so looking at "native type" we know that our input will be a Python ''dict'' and looking at the implementation we can see the keys we can expect: </div> <syntaxhighlight lang="python3"> return { 'K1': year, 'K2': month, 'K3': day } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> When a type doesn't have a converter, you'll have to access its parts directly using its keys. For example, let's assume that your function <code>Z30000</code> has one input <code>Z30000K1</code> of type {{Z|Z11}}. This type has two keys: <code>Z11K1</code> for the language (itself an object of type {{Z|Z60}}), and <code>Z11K2</code> for the string value. Similarly, the language object has a key <code>Z60K1</code> for the language code. So, to get a string with the language code and the text, you can write: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1 ) { // e.g. "en: some text" return Z30000K1.Z11K1.Z60K1 + ": " + Z30000K1.Z11K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> For a quick reference of the available type conversions visit [[Special:MyLanguage/Wikifunctions:Execution targets#Default type conversion|the default type conversion table]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Returning the right outputs === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Similarly to the way you treat inputs, outputs need to match the type specified in the function definition. Some can be treated as simply as native types, so any string output will be converted into a Wikifunctions {{Z|Z6}} object and any native boolean returned by your implementation will be converted into a Wikifunctions {{Z|Z40}} object. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Those types that have "type converters from code" will apply the appropriate function to the output, in order to build the required type. Following the example of {{Z|Z20420}}, the {{Z|Z20443}} will transform the output from your implementation–a dict with K1, K2 and K3 keys–into its correct ZObject representation. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For types that don't have converters from code, you can carefully build and return the output objects. For example, imagine that our function <code>Z30000</code> takes two string inputs: language code and text, and should return a {{Z|Z11}} object. You can do this in Python by using the <code>ZObject</code> constructor: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): lang_object = ZObject( {"Z1K1": "Z9", "Z9K1": "Z60"}, Z60K1 = Z30000K1 ) return ZObject( {"Z1K1": "Z9", "Z9K1": "Z11"}, Z11K1 = lang_object, Z11K2 = Z30000K2 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Or in JavaScript: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { const langObject = new ZObject( new Map( [ [ "Z60K1", Z30000K1 ] ] ), { "Z1K1": "Z9", "Z9K1": "Z60" } ); const monolingualKeys = new Map( [ [ "Z11K1", langObject ], [ "Z11K2", Z30000K2 ] ] ); return new ZObject( monolingualKeys, { "Z1K1": "Z9", "Z9K1": "Z11" } ); } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> You can learn more about the <code>ZObject</code> class and other useful constructors in {{ll|Wikifunctions:Execution_targets#Custom_and_non-built-in_type_conversion}} </div> {{phab|T392750}}<div lang="en" dir="ltr" class="mw-content-ltr"> As of 2026-05, trying to return a list of lists may fail, so you're not able to implement such functions in code. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Code in Python === </div> <div class="mw-translate-fuzzy"> V nasledujúcom texte uvádzame konkrétny príklad, ako vytvoriť Implementáciu vo forme kódu v Pythone. Povedzme, že chceme vytvoriť implementáciu funkcie, ktorá spojí dva vstupné reťazce s medzerou medzi nimi, čím vráti výsledok. Predpokladajme, že ZID tejto funkcie je Z11057. </div> <div class="mw-translate-fuzzy"> Implementácia sa definuje pomocou ZID funkcie. Rovnako ako argumenty funkcie. Takže v prípade funkcie Z11057 s jej dvoma argumentmi by mala byť prvý riadok takto: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> As we described before, we know that the arguments (<code>Z30000K1</code> and <code>Z30000K2</code>) are Strings, so we can treat them as simply as we use native strings in Python. Also, the function should return a String. For our example, we simply return the two arguments concatenated with a space in between: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): return Z30000K1 + " " + Z30000K2 </syntaxhighlight> Keďže ide o Python, nezabudnite tento riadok odsadiť. <div lang="en" dir="ltr" class="mw-content-ltr"> If you have followed our advice to [[#Practice Test-Driven Development|practice TDD]], you will already have a set of tests that you know should work. If that's the case, while building your implementation you can click on the circular arrow in the Tests panel, and see if your implementation passes all of them. </div> Pamätajte, že vykonávanie funkcie nemá stavový charakter. Nepoužívajte globálne alebo statické premenné. Ak máte ďalšie otázky o tom, čo môžete a nemôžete robiť v Pythone, opýtajte sa na [[Wikifunctions:Python implementations]]. <div lang="en" dir="ltr" class="mw-content-ltr"> === Code in JavaScript === </div> <div class="mw-translate-fuzzy"> V nasledujúcom texte uvádzame konkrétny príklad, ako vytvoriť Implementáciu vo forme kódu v JavaScripte. Povedzme, že chceme vytvoriť implementáciu funkcie, ktorá spojí dva vstupné reťazce s medzerou medzi nimi, čím vráti výsledok. Predpokladajme, že ZID tejto funkcie je Z11057. </div> <div class="mw-translate-fuzzy"> Implementácia sa definuje pomocou ZID funkcie. Rovnako ako argumenty funkcie. Takže v prípade funkcie Z11057 s jej dvoma argumentmi by mala byť prvý riadok takto: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> We know that the arguments (<code>Z30000K1</code> and <code>Z30000K2</code>) are Strings, so we can treat them as native strings in JavaScript. Also, the function should return a String. To complete our function, you can then add a line concatenating the input strings, like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> If you have tests as recommended in the [[#Practice Test-Driven Development|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes all of them. </div> Pamätajte, že vykonávanie funkcie nemá stavový charakter. Nepoužívajte globálne alebo statické premenné. Ak máte ďalšie otázky o tom, čo môžete a nemôžete robiť v JavaScript, opýtajte sa na [[Wikifunctions:JavaScript implementations]]. <div lang="en" dir="ltr" class="mw-content-ltr"> === Calling another Wikifunctions function === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> A code implementation can call certain other Wikifunctions functions, receive the output of the call, and use that output in further processing. We refer to such calls as callbacks. At present, due to security and performance concerns, only the following built-in Wikidata fetch and search functions can be called in this way: {{Z|Z6820}}, {{Z|Z6821}}, {{Z|Z6822}}, {{Z|Z6824}}, {{Z|Z6825}}, {{Z|Z6826}}, {{Z|Z6830}}, and {{Z|Z6831}}. This capability is in an initial stage of deployment; we hope to allow calls to a broader range of functions in the future. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Let’s look at a JavaScript implementation containing a callback. This implementation fetches an item from Wikidata, extracts the label of that item in a given language, and returns the label string. The item to fetch is given by argument <code>Z400K1</code>, and the language is given by <code>Z400K2</code>. </div> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const item = Wikifunctions.Call('Z6821', Z400K1); for (const label of item.Z6001K2.Z12K1) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> A callback is made by calling <code>Wikifunctions.Call</code>, as shown in the example. The first argument to <code>Wikifunctions.Call</code> is always the ZID of the function to be called – in this case, {{Z|Z6821}}, which takes a single argument. Following that, the arguments to be passed to that function are listed, separated by commas. Here, that argument, <code>Z400K1</code>, is the same value that was passed to the function <code>Z400</code>. This is a common pattern of argument passing to callbacks, but their arguments can also be built using the <code>ZObject</code> constructor (as explained above), or obtained in other ways. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The value of <code>Z400K1</code> would be an instance of {{Z|Z6091}}, containing the QID of the item to be fetched. Line 2 of the example calls <code>Z6821</code> to fetch that item from Wikidata and assigns the resulting ZObject to the const <code>item</code>. The remaining code iterates over the item’s labels until it finds the one matching the language given by <code>Z400K2</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For the first example above, we have used <code>Z6821</code> for simplicity. However - unless an entire entity is needed by the implementation, it is strongly recommended to use <code>Z6820</code> to retrieve Wikidata items, which can be quite large. Although a call to <code>Z6820</code> is a bit more complex, its parameters allow for fetching selected portions of a Wikidata item, which can greatly improve performance and avoid some errors, by reducing the network bandwidth and processing time that are needed. (<code>Z6820</code> can also be used in place of <code>Z6822</code>, <code>Z6824</code>, <code>Z6825</code>, and <code>Z6826</code>, to get similar bandwidth-reduction benefits.) </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Just below we show how <code>Z6820</code> can be used, in <code>Wikifunctions.Call</code>, to implement the same behavior as above. Note that we use the second argument passed to <code>Z6820</code>, <code>[labelsPart]</code>, to say “Just return the item’s labels”, and we use the third argument, <code>[Z400K2]</code>, to say “Just return labels in the given language”. (This argument would also apply to aliases and descriptions, if they were included in the result.) </div> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const labelsPart = new ZObject( new Map( [ ['Z6030K1', new ZReference('Z6033')] ] ), {Z1K1: 'Z9', Z9K1: 'Z6030'} ); const entities = Wikifunctions.Call( 'Z6820', [Z400K1], [labelsPart], [Z400K2], []); const item = entities.get(Z400K1.Z6091K1); const labels = item.Z6001K2.Z12K1; for (const label of labels) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Other things to note: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Even though code implementations are now able to fetch Wikidata entities, it is recommended that they not be written to return ''entire'' entities. This is because of current limitations on the size of the value returned from a code implementation. To fetch and return an entire large entity, it’s better to call the fetch function from a composition.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Only one callback can execute at a time. For security reasons, it is not possible to use the concurrency features of JavaScript or Python to execute multiple callbacks in parallel.</span> ** <span lang="en" dir="ltr" class="mw-content-ltr">Keep in mind, however, that you can fetch multiple entities at once using Z6820.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">There is currently a 3 MiB limit on the size of Wikidata content that can be returned to a code implementation, by a single callback. The same limit applies to the size of the result returned from a code implementation.</span> <span id="Compositions"></span> <div class="mw-translate-fuzzy"> == Zloženie == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section, we give a concrete example on how to create an implementation in the form of a composition. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is <code>Z30000</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> It is usually a good idea to first think about how to combine existing functions in order to create the desired output. Sometimes this might be trivial, and you can just go ahead with composing functions, but in many cases it is worthwhile to note the desired composition down. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, for the given Function, we could use the existing Function {{Z|Z10000}}. That Function takes two strings and makes one string out of them. But we need to add a space in between. So we first concatenate a space to the end of the first string, and then concatenate the second string to the result of that first concatenation. So our composition could be noted down like this: </div> <syntaxhighlight lang="prolog"> join_strings( join_strings( Z30000K1, " " ), Z30000K2 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> There are multiple ways to write a composition: notice that the same thing could be accomplished with: </div> <syntaxhighlight lang="prolog"> join_strings( Z30000K1, join_strings( " ", Z30000K2 ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> An alternative implementation could also use the existing Function {{Z|Z15175}}, so your composition could be: </div> <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> As you can see, there are multiple ways to accomplish this, so take your time and explore the existing functions available in the {{ll|Wikifunctions:Catalogue}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's try to create the second example, <code>join_strings(Z30000K1, join_strings(" ", Z30000K2))</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In order to create this: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›" icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search for the name of the outermost function you want to use, which in this example is "join two strings". Then, select the wanted function from the dropdown list.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">You will see two new fields, one for each of the arguments needed for the selected function.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">For the first argument, we want to select the first input to our function:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and select "Argument reference".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id" you can now select the first string of your function from the dropdown, which contains all available inputs.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">For the second argument, we want to use the result of another call to "join two strings":</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and select "Function call".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function you want to call, which is again "join two strings".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For this inner function call, configure the "first string" by simply typing a white space in the text field, and configure the "second string" as you did for step 6: change it using the "…" button to "Argument reference", and then select the second argument in the dropdown.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Your composition is now complete! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You can expand and collapse the details using the chevron buttons to see how it looks. If you already have Tests as recommended in the [[#Practice Test-Driven Development|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes the tests. Once your composition passes the tests, go ahead and publish it. </div> [[File:Composition implementation expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its expanded view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its expanded view</span>]] [[File:Composition implementation collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its collapsed view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its collapsed view</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions error handling == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As a Wikifunctions function creator, you might want to warn the user calling your function when something goes wrong in the code, or when their inputs do not fit a certain criteria. For example, if your Function expects a string input to contain a name, you might want to check that the name is not empty and, if it is, show an error message that the person using your Function can understand. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For this purpose, you can use <code>Wikifunctions.Error()</code> from your code implementations or the function {{Z|Z851}} from your compositions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section you will learn: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">How to throw errors from both code and composition implementations,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to write tests for error cases, and</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to catch and handle errors thrown by functions that you are using in your compositions.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Throwing errors from code implementations === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> When writing code, both from JavaScript and Python, you can use <code>Wikifunctions.Error()</code> to end the execution with a wanted error. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> <code>Wikifunctions.Error()</code> has two parameters: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Error type: a string containing the ZID of the error type you want to return.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Error arguments: a list of string arguments to build the error.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's go one by one: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Error type ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> An error type is an object that describes a kind of error that could happen in the system. There are a number of built-in error types but you can also build other error types that are more suited to your use case. When using errors, the best idea is to browse through the available error types, which can be explored in [[Special:ListObjectsByType/Z50|this list]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If there are no errors that fit your case, create a new one by going to the create page, and selecting "Error type" in the type selector. Then, set the necessary fields: </div> [[File:Error type.png|thumb|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Error type creation in Wikifunctions</span>|<span lang="en" dir="ltr" class="mw-content-ltr">To create new Error type (Z50), edit the label and add the necessary keys.</span>]] * <span lang="en" dir="ltr" class="mw-content-ltr">'''Label''' – This is the main title of the error, which should contain a short but descriptive message. Set the error label on the right-side box titled "About".</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Keys''' – Keys contain additional information about what caused the error. For example, if an input had the wrong format, you might want to inform the user of what was the input content when raising the error. To use them in your implementations, keys should be strings. To create a key, click on the "[+]" icon below "keys", select "String" under "value type", and add a label that describes it appropriately, for example "current input". Once you have all the necessary keys, you can Publish your error type and keep the ID of the newly created object.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error message''' – Error types can contain a multilingual array of HTML parametrized error messages. The parameter notation is $1, $2, etc., where the digit corresponds to the error type key. For example, when creating an error type with one string key "current input", the error message can use the positional parameter "$1", which will be replaced with the value of the "current input" key at the time of rendering the error. To add HTML messages, click on the "[+]" icon below "html fragments", select a language and input the HTML string.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Error arguments ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Error arguments correspond to the keys of the Error type, and they should provide additional information to understand the error. Error arguments should always be Strings. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Wikifunctions.Error() ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say that you want an error to be thrown when either your first or your second input are empty. You have already created the error type, and the assigned ZID was <code>Z30005</code>. Your error type has two string keys: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Input key: contains the key of the failing input</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Input value: contains the current value of the failing input</span> <div lang="en" dir="ltr" class="mw-content-ltr"> To raise an error in your JavaScript implementation you should do something like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { // If the first input is empty, raise error Z30005 // with two string args: [ first input key, first input value ] Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { // If the second input is empty, raise error Z30005 // with two string args: [ second input key, second input value ] Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> To raise an error in your Python implementation you should do something like this: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": # If the first input is empty, raise error Z30005 # with two string args: [ first input key, first input value ] Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": # If the second input is empty, raise error Z30005 # with two string args: [ first input key, first input value ] Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Remember that calling <code>Wikifunctions.Error()</code> ends the execution! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Throwing errors from compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If you are creating a composition implementation, you can throw an error by calling the special function {{Z|Z851}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Throw Error function (Z851) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z851}} function is similar to the <code>Wikifunctions.Error()</code> method and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – A reference to the Error type you want to raise</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error parameters''' – A list with the arguments to create your Error, which should also be Strings.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Throw Error ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say you want to modify your composition so that it first checks that the arguments are not empty, and raises an error when it finds an empty one. Then, if none of them are empty, it runs the original composition, which is: </div> <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> To do this, you need to create conditional paths, for which you can use the {{Z|Z802}} function. Think of it like this: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the first argument is empty, throw an error for the first argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Else, proceed to check the second argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the second argument is empty, throw an error for the second argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Else, proceed with the success path and return the joint strings with the space separator</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Or in functional pseudo code: </div> <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), throw_error( Z30005, [ "Z30000K1", Z30000K1 ] ), if( is_empty_string( Z30000K2 ), throw_error( Z30005, [ "Z30000K2", Z30000K2 ] ), join_with_separator( Z30000K1, Z30000K2, " " ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's create this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+” button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›” icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the outermost function you want to use, which in this case is "if".</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Check the validity of the first argument:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "condition", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "is empty string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "input", click on the "…" button and select "argument reference"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id", select the first input (e.g. "first string")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse the "condition" function call if you want, by clicking on the down-chevron next to "condition". You should see something like "f(x) is empty string( → first string )"</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Throw error if the condition is true:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "then", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Throw Error"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error type", search and select your error type (you can directly input the error ID if you know it, e.g. Z30005)</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error parameters", add two items by clicking on the "+" button</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For "Item 1" (offending argument key), set its type to "String" and write the argument identifier (e.g. "first input", or "Z30000K1")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For "Item 2" (offending argument value), click on the "…" next to "Item 2" and select "argument reference"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id", select the first input (e.g. "first string")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse the "then" function call if you want, by clicking on the down-chevron next to "then". You should see something like "f(x) Throw Error( Input was the wrong format, Typed list( Object, "first input", → first string ) )"</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Continue to check the second argument if the first was good:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "else", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "if"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Set up "condition" to check the validity of the second argument by following the same process as described in step 5.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Set up "then" to throw an error for the second argument by following the same process as described in step 6.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Finally, set up the success path:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to the nested "else", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the successful function, which in this case can be "join strings with separator"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and set it to "argument reference", then select "first string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and set it to "argument reference", then select "second string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "separator" add a space into the text field</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The resulting function call should look like this: </div> [[File:Throw error expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function</span>]] [[File:Throw error collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function, in its collapsed view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function, in its collapsed view</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Handling errors in compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> While it is useful to allow functions to raise expected errors, it is crucial to be able to handle errors in your compositions in order to safely use these functions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say you want to create a new function "full name of a person" – we will refer to it with the ZID <code>Z30010</code>. This function should return the full name of a person given a first and last names, but if any of the two fields are empty, it should return the text "Unknown" instead. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You could create a composition using our example function "Join two strings with a space" or <code>Z30000</code> to generate the name. If any of the inputs are empty, you know that <code>Z30000</code> will throw an error of type <code>Z30005</code>. Using the function {{Z|Z850}} as a wrapper, you can attempt the join operation and intercept a possible error to simply return "Unknown" whenever it occurs. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Try-Catch function (Z850) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z850}} function is built-in with ZID <code>Z850</code> and takes three arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – The initial function call to run. If nothing goes wrong, the response will be the result of this function call.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – An error type to catch in case it is thrown during the execution of the first function call.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error handler''' – A function call that will be run in case the error specified above is caught during the execution of the initial function call. If that happens, the result of the error handler will be the value returned.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Try-Catch ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Once we have all the functions for our composition, we can craft it like this: </div> <syntaxhighlight lang="prolog"> try_catch( join_with_space( Z30010K1, Z30010K2 ), Z30005, echo( "Unknown" ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This means that: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">The "Join two strings with a space" function will be tried with the two inputs and, if everything goes well, the output of this function will be returned</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If any of the inputs are blank, "Join two strings with a space" with raise an error of type <code>Z30005</code></span> * <span lang="en" dir="ltr" class="mw-content-ltr">Our {{Z|Z850}} will then detect this error and run the {{Z|Z801}} function to return "Unknown"</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's create this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›” icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the outermost function you want to use, which in this case is "Try-Catch".</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Set the main function call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under the field where the "Try-Catch" function is selected, next to the "function call" key, click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the function "join two strings with space"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and select "argument reference", then select the "first name" argument from the dropdown.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and select "argument reference", then select the "second name" argument from the dropdown.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Select the error to catch:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error type", search and select "bad string input" – you can search directly by its ZID <code>Z30005</code></span> # <span lang="en" dir="ltr" class="mw-content-ltr">Set the error handler function call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "error handler", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "echo"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "input" and "type", search and select the type "String"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now, under "input", type "Unknown" in the text field</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The resulting function should look like this: </div> [[File:Try catch expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in expanded mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in expanded mode</span>]] [[File:Try catch collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in collapsed mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in collapsed mode</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Testing your failure use cases === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As we introduced in the above section about [[#Practice Test-Driven Development|practicing TDD]], it's important to test not only the most common paths, but also the possible edge cases. It is equally important to test failure behavior. In this section we will give you the tools necessary to test that your function fails with a given set of inputs, and that the error thrown is the expected one. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> To do that, you will need other two system functions: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Is error type (Z852) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z852}} function is built-in with ZID <code>Z852</code> and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error''' – An {{Z|Z5}} object, which can be thrown by a failing call. An error instance has a type and a value.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – A reference to an {{Z|Z50}} which will be compared to the type of the Error passed as a first argument. If that's the case, the function will return true.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Get error thrown by function call (Z853) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z853}} function is built-in with ZID <code>Z853</code> and takes one argument: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – A function call which can either return a successful value of any type, or throw an error.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> This function returns a {{Z|Z882}} with a {{Z|Z40}} in first place and an {{Z|Z1}} in the second: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the Function call runs successfully and hence does not throw any error, the returned pair will contain False in the first place, and void in the second.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the Function call throws an error, the returned pair will contain True in the first place, and the caught error in the second.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> To use this function in your compositions, you might need to use the additional functions: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">{{Z|Z821}}, and</span> * {{Z|Z822}} <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Testing errors ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say our target function, "Join two strings with a space" or <code>Z30000</code>, throws an error of type <code>Z30005</code> and we want to test this behavior. To do that we need to: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Throw a failing function call</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Get the error using the function {{Z|Z853}}</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Check that the error is the right type with {{Z|Z852}}</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Tests have two fields: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Call''' – A function call that will produce an output with the inputs you want to test. This call will return a value.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Result validation''' – A function call that will validate that the value returned by the call above is the expected one. The first argument of this function call will be automatically assigned to take the return value of the first call.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> For step-by-step instructions on how to create tests, see {{ll|Wikifunctions:Introduction#Create_tests}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In our example, we can structure it like this — but this is not the only way! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The call, which will return an {{Z|Z5}} object: </div> <syntaxhighlight lang="prolog"> error = get_second_element_of_typed_list( get_error_thrown_by( join_strings_by_whitespace( "", "not empty" ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> And the result validation, which will take the {{Z|Z5}} object as its first argument: </div> <syntaxhighlight lang="prolog"> is_error_type( error, Z30005 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's do this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding a test by clicking on the "+" button in the "Tests" table from your Function page. The "call" and "result validation" fields already have some functions pre-set, but to test the errors we will need to change them.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">First, let's set the call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "call", click the "›" chevron button to expand the function call.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", edit the field and search and select the function "Get second element of a typed pair"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Once selected, next to "Typed pair", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Get error thrown by function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "function call", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Join two strings with a space" (or by ZID <code>Z30000</code>)</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now set the inputs so that they cause a failure: at least one of them should be empty.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse your "call" by clicking again on the down-chevron button if you want!</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Next, let's set the result validation:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "result validation", click the "›" chevron button to expand the function call.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", edit the field and search and select the function "Is error type"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now you will only be asked to configure the second argument. Under "error type", search and select your <code>Z30005</code> error type.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">And you are done! You can now click the circular arrow in the "Implementations" box and you should see green checks.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> If everything went right, you can now save your test. It should look like this: </div> [[File:Get error expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in expanded mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in expanded mode</span>]] [[File:Get error collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in collapsed mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in collapsed mode</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Creating actionable error messages === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As described above, Error Types have an optional key <code>Z50K3</code> which contains a multilingual list of HTML strings. When rendering information about an error, the messages stored in the error type can help create a clear, precise, informative, translatable and actionable error message. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For that purpose, error messages can contain parameters like <code>$1</code>, <code>$2</code>, etc., where the digit corresponds to the error type argument and its value in the error instance. These error messages are rendered in Wikifunctions inside the "Details" dialog window after executing a function call. Additionally, these error messages are surfaced in other client interfaces, like Abstract Wikipedia, to provide better guidance to Abstract Content editors. </div> [[File:Wikifunctions actionable error message example in the Details dialog.png|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">The error message is rendered using the HTML message of the error type and the error argument values.</span>]] [[File:Wikifunctions actionable error message example in Abstract Wikipedia.png|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">When available, the HTML error message is rendered in the Abstract Wikipedia preview section.</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> Let's use a real example to understand the benefits of HTML error messages: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The function {{Z|Z37847}} returns the first Lexeme reference given a Wikidata Item reference and a language. When there is no Lexeme for this Item-Language combination, it throws an error of type {{Z|Z28248}}, which has three keys: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K1''' is the input Wikidata item QID</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K2''' is the connecting property, in this case <code>P5137/item for this sense</code></span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K3''' is the language code</span> <div lang="en" dir="ltr" class="mw-content-ltr"> When calling this function for a Wikidata lexeme that doesn't exist, the call will throw an error instance like this: </div> <syntaxhighlight lang="json" highlight="10,12"> { "Z1K1": "Z5", "Z5K1": "Z28248", "Z5K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z885", "Z885K1": "Z28248" }, "Z28248K1": "Q319", "Z28248K2": "P5137", "Z28248K3": "ast" } } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> While the error type label indicates: <code>No matching lexeme for item in language</code>, a better error message should indicate: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">which is the failing item,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">which is the language missing, and</span> * <span lang="en" dir="ltr" class="mw-content-ltr">what are the possible ways to fix it.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The error message <code>Z50K3</code> field can provide this functionality. Whenever an Error Type has an error message for the user language (or any of its fallbacks), the error message shown will be rendered by: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">First, replacing the message parameters with the values of the keys. In our example, any <code>$1</code> will be replaced with the value of <code>Z28248K1</code> ("Q319"), <code>$2</code> with "P5137", and <code>$3</code> with "ast",</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Last, sanitizing and rendering the HTML message.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> So a HTML message like: </div> <syntaxhighlight lang="html"> There is no matching lexeme for the item $1 in "$3".<br> <a href="http://wikidata.org/wiki/$1">Edit in Wikidata</a> </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Will become: </div> : There is no matching lexeme for the item Q319 in "ast" : [[d:Q319|Edit in Wikidata]] <div lang="en" dir="ltr" class="mw-content-ltr"> == Debugging your implementations == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Sometimes things can go wrong. A function might behave differently than expected or a value might not look quite right. Sometimes implementations are really complex and, because they are run in a sandboxed environment, it can seem really difficult to debug. To help understand what's going on inside a function call, Wikifunctions includes a small set of debugging tools. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> These tools don't change the result of a function, but will add extra information to the returned metadata, which you can observe after running the function. You can use <code>Wikifunctions.Debug()</code> from your code implementations or the function {{Z|Z854}} from your compositions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section you will learn: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">How to add debug messages from both code and composition implementations,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to inspect the metadata manually or via the UI to inspect these logs.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Debugging your code implementations === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> When writing code, both from JavaScript and Python3, you can use <code>Wikifunctions.Debug()</code> to add a message to your debugging log and continue the execution. </div> {{phab|T441028}} <div lang="en" dir="ltr" class="mw-content-ltr"> <code>Wikifunctions.Debug()</code> has one parameter, which is generally expected to be a string. However, any other object passed as parameter will get directly converted into a string. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If we want to add debug logs to our code implementations for our "Join two strings with a space" example function, we can do, in JavaScript: </div> <syntaxhighlight lang="JavaScript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { Wikifunctions.Debug( `first input is empty "${ Z30000K1 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { Wikifunctions.Debug( `second input is empty "${ Z30000K2 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } Wikifunctions.Debug( "both inputs are fine" ); return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> And the same in your Python3 implementation will be: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": Wikifunctions.Debug( 'first input is empty "'+Z30000K1+'"' ) Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": Wikifunctions.Debug( 'second input is empty "'+Z30000K2+'"' ) Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) Wikifunctions.Debug( 'both inputs are fine' ) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This way, no matter what happens, we will be adding one message to your debugging logs: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the function call fails when checking on the first or second input, the result of the execution will be a failure, but it will contain one informative log about what branch caused the failure.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the function call succeeds—because both inputs are valid—the function call will return the joined string, but the returned metadata will also contain a debug log.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Debugging your compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> To support debugging compositions, Wikifunctions provides the built-in function {{Z|Z854}}. This function allows you to attach debug messages to the execution of any function call that generates the final output. The debug logs collected during the evaluation are returned as part of the execution metadata, under the <code>executorDebugLogs</code> key. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Add debug log to function call (Z854) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z854}} function is built-in with ZID <code>Z854</code> and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – Any composition you want to execute.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Debug log''' – A string message that will be recorded if the given function call is evaluated.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> When the wrapped function call runs, the provided message is added to the execution logs. If that function call is not executed, or its execution is not part of the final output, its debug log will not appear in the final result metadata. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You will benefit from this built-in if you want to observe: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Which branch of a conditional was executed, or</span> * <span lang="en" dir="ltr" class="mw-content-ltr">the order of evaluation in a composition.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Add debug log to function call ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say that you want to add debug logs to our example function "Join two strings with a space" or <code>Z30000</code>, so that different messages are added to the different possible outcomes. You could use our debugging builtin like this: </div> <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), add_debug_log( throw_error( Z30005, ... ), 'failed on first input' ) if( is_empty_string( Z30000K2 ), add_debug_log( throw_error( Z30005, ... ), 'failed on second input' ), add_debug_log( join_with_separator( Z30000K1, Z30000K2, " " ), 'both inputs are ok!' ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This way, </div> * <span lang="en" dir="ltr" class="mw-content-ltr">when called with an empty first input, the function will return a failed response, and the metadata will contain an <code>executorDebugLogs</code> entry with the "failed on first input" log.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">When called with an empty second input, the call will also fail, but the logged message will be "failed on second input"</span> * <span lang="en" dir="ltr" class="mw-content-ltr">When called with valid inputs, the function will return a successful response, and additionally the metadata will contain "both inputs are ok" in its <code>executorDebugLogs</code> key.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> This is the way this composition would look: </div> [[File:Add debug log expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Composition implementation using Add debug logs to log all possible execution paths</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Composition implementation using Add debug logs to log all possible execution paths</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Accessing execution debug logs === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Whether your execution logs are added via <code>Wikifunctions.Debug()</code> or via the {{Z|Z854}} built-in function, they are returned as part of the response metadata. To see the logs, once you run your function, click on the "Details" button that appears at the bottom of the "Result" section. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The error and debug information will appear at the top of the "Details" dialog. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> This is what you would see when running the composition from our previous example with valid and invalid inputs: </div> {| class="wikitable" | [[File:Execution logs success.png|frameless|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a successful execution with debug logs</span>]] | [[File:Execution logs failure.png|frameless|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a failed execution with debug logs</span>]] |- | <span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a successful execution: shows no errors, but displays the successful execution log: ''"both inputs are ok!"''</span> | <span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a failed execution: shows the error information, and the additional execution log for the first failure branch: ''"failed on first input"''</span> |} [[Category:How to create implementations| {{#translation:}}]] ajsqlsdsjkv4gdkh2vkfhwqrpdzzins Wikifunctions:Naming conventions/fr 4 38021 331143 325772 2026-10-23T08:29:48Z FuzzyBot 207 Updating to match new version of source page 331143 wikitext text/x-wiki <languages/> {{shortcut|[[WF:NC]]}} {{Draft}} Le but de cette page est de résumer certaines conventions relatives à la façon dont les objets sont nommés sur Wikifunctions. Comme le projet est encore jeune, les lignes directrices ne sont pas trop nombreuses. <span id="Capitalization"></span> == Majuscules == Certains langages utilisent les majuscules et les minuscules. Le libellé des objets doit être écrit dans ces langages comme dans une phrase ordinaire. L'utilisation de la [[:w:en:Title case|Casse du titre]] n'est pas recommandée. Par exemple, au lieu de ''Calculer La Distance entre la Terre et le Soleil A une Date Donnée'', entrez quelque chose comme ''calculate la distance entre la Terre et le Soleil à une date donnée''. Utiliser les majuscules uniquement pour les noms propres et les autres mots comme décrit dans les règles du langage que vous utilisez. Par exemple ceci s'applique aux noms en allemand et à certaines classes de mots en anglais, comme les jours de la semaine et le nom des langues. N'utilisez pas les majuscules si les règles de votre langue ne l'exigent pas. Si vous utilisez le nom d'une langue étrangère dans un libellé, utilisez les conventions des majuscules de la langue du libellé (par exemple "Toki Pona" doit s'écrire ainsi pour un libellé anglais). Les abréviations doivent utiliser leur forme conventionnelle; par exemple en anglais, utilisez ''[[:fr:Chiffrement RSA|RSA]]'' et non pas ''rsa'' pour le nom de l'algorithme de cryptage. Par convention, le nom des objets décrivant des types de données doivent commencer par une majuscule (par exemple, [[Z1]] ou [[Z8]]). <span id="Search_characters"></span> == Caractères de recherche == Le moteur de recherche utilise certains caractères comme modificateurs, alors évitez de les utiliser en début de mot. Ces caractères sont: <code>~ * \? - " !</code>. Noter que "?" en tant que tel (plutôt que "\?") n'est pas un modifieur. Néanmoins c'est un caractère "greyspace" parmi d'autres qui sont : <code>~ ! @ # $ % ^ & ( ) _ + - = { } | [ ] \ : " ; ' < > ? , . /</code>. Le moteur de recherche les traite (seuls ou combinés) comme une partie du délimiteur de mots. Ce n'est généralement pas un problème mais s'ils sont significatifs dans une recherche vous devez les éviter au début et à la fin du mot (ou entre les mots), à moins qu'ils ne soient nécessaires (par exemple, [[Z11729]]). Voir [[:mw:Special:MyLanguage/Help:CirrusSearch|CirrusSearch]] pour les détails sur la recherche de texte utilisant ces caractères. <span id="Implementation_names"></span> == Noms d'implémentation == Lorsque vous créez une Implementation, veuillez mentionner la langue que vous avez utilisée dans son nom (Python / JavaScript / Composition). S'il y a plus d'une implémentation dans une même langue, il est recommandé de donner un peu de détails dans le titre de ce qui rend cette implémentation différente. Par exemple, nommer le nom de l'algorithme (s'il existe). <span id="Test_cases"></span> == Cas de test == Le libellé des cas de test doit renseigner sur ce que vous voulez vérifier. Il n'est pas nécessaire d'inclure les valeurs de chaque entrée et sortie, mais vous devez au moins spécifier un domaine que vous vérifiez. Par exemple, vous voudrez peut-être dire que ce test vérifie le comportement d'une fonction de chaîne quand on lui fournit des lettres de l'alphabet cyrillique, ou d'une function mathématique quand on lui passe une fraction ou un nombre complexe. Si le cas de test lié à une fonction de chaîne de caractères et que vous incluez un argument de type ''string'' dans le nom du cas de test, veuillez mettre cet argument entre guillemets (comme une citation) ou le marquer d'une autre manière afin de savoir clairement de quelle valeur il s'agit. Ceci est particulièrement utile si la valeur contient un espace blanc au début ou à la fin (par exemple, lors du test d'une fonction qui travaille avec les sous-chaînes). <span id="Configuration_of_functions_for_given_languages"></span> == Configuration des fonctions selon le langage == * doit commencer par "configuration pour" (ou une forme raccourcie) ** Si la configuration est une fonction d'affichage, elle doit être ''configuration d'affichage'', suivie du nom exact du type. ** Si la configuration est une fonction de lecture, elle doit être "configuration de lecture", suivie du nom exact du type. == Types == * doit être dans la casse de la phrase (par exemple, Nombre rationnel) ** Cette règle ne doit pas être suivie quand le nom du type est utilisé en dehors de Wikifunctions et le plus souvent quand elle n'est pas en casse mixte (comme {{Z|Z20838}}) <span id="Multi-lingual_labels"></span> == Libellés multilingues == {{Phab|T359663}} Les libellés en ''multiples langues'' (utilisant le code de langue <code>mul</code>, conformément aux [[d:Special:MyLanguage/Help:Default values for labels and aliases|conventions Wikidata]]) peuvent être utilisés pour spécifier le libellé d'une manière qui n'implique pas de mots, par exemple comme expression mathématique. Voir {{Z|10512}} pour un exemple. Au moment où nous écrivons, le logiciel n'utilise pas ces libellés comme repli. <div lang="en" dir="ltr" class="mw-content-ltr"> == language-specific local naming conventions == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Some languages may have their own language-specific naming conventions (these should probably be decided through discussions within the community that speaks the language, though many are likely drafts). </div> * [[Wikifunctions:Naming conventions/日本語]] (Japanese) [[Category:Policy{{#translation:}}]] ce0w983w0hbc9q9exyxzlcvrhfrzi8c Z20321 0 43659 331150 173505 2026-10-23T08:31:18Z Ameisenigel 44 de 331150 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z20321" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z20314", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z20314", "Z20314K1": { "Z1K1": "Z20159", "Z20159K1": "Z17814", "Z20159K2": { "Z1K1": "Z13518", "Z13518K1": "0" } } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z20166", "Z20166K2": { "Z1K1": "Z20159", "Z20159K1": "Z17815", "Z20159K2": { "Z1K1": "Z13518", "Z13518K1": "2" } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Before 0 AD is 2 BC" }, { "Z1K1": "Z11", "Z11K1": "Z1004", "Z11K2": "2 avant J.-C. précède 0 après Jésus-Christ" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "vor 0 kommt 2 v. Chr." } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } aoyjninq811kbnkpltwf103nwtncmos Z20322 0 43660 331151 173506 2026-10-23T08:33:01Z Ameisenigel 44 de 331151 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z20322" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z20314", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z20314", "Z20314K1": { "Z1K1": "Z20159", "Z20159K1": "Z17815", "Z20159K2": { "Z1K1": "Z13518", "Z13518K1": "0" } } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z20166", "Z20166K2": { "Z1K1": "Z20159", "Z20159K1": "Z17815", "Z20159K2": { "Z1K1": "Z13518", "Z13518K1": "1" } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Before 0 BC is 1 BC" }, { "Z1K1": "Z11", "Z11K1": "Z1004", "Z11K2": "1 avant J.-C. précède 0 avant Jésus-Christ" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "vor 0 v. Chr. kommt 1 v. Chr." } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 3hnamvadhrh4rtr8spqhjoh6j89i0fd Z20323 0 43661 331152 272158 2026-10-23T08:37:57Z Ameisenigel 44 de 331152 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z20323" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z19677", "Z17K2": "Z20323K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "1st known" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "erster bekannter Wert" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z19677", "Z17K2": "Z20323K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "2nd known" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "zweiter bekannter Wert" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z13518", "Z17K2": "Z20323K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Which is unknown (1, 2, or 3)" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "welcher Wert ist unbekannt (1, 2 oder 3)?" } ] } } ], "Z8K2": "Z19677", "Z8K3": [ "Z20", "Z20328", "Z20329", "Z20330" ], "Z8K4": [ "Z14", "Z20327", "Z34750" ], "Z8K5": "Z20323" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Triangle of Power operation" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "Dreieck der Potenzierung" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1002", "Z31K2": [ "Z6", "a^b=c" ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Insert the arguments in the order of: Base, Power, Result." }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "gib die Argumente in der folgenden Reihenfolge an: Basis, Exponent, Ergebnis" } ] } } baodiyq8yj7seek1p5u6tx08lwcqwzi Z20324 0 43662 331153 148836 2026-10-23T08:38:15Z Ameisenigel 44 de 331153 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z20324" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z17517", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z17204", "Z17204K1": { "Z1K1": "Z18", "Z18K1": "Z17517K2" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z17958", "Z17958K1": "Z17420", "Z17958K2": { "Z1K1": "Z18", "Z18K1": "Z17517K1" }, "Z17958K3": { "Z1K1": "Z7", "Z7K1": "Z17144", "Z17144K1": { "Z1K1": "Z18", "Z18K1": "Z17517K2" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z17958", "Z17958K1": "Z17435", "Z17958K2": { "Z1K1": "Z18", "Z18K1": "Z17517K1" }, "Z17958K3": { "Z1K1": "Z7", "Z7K1": "Z17144", "Z17144K1": { "Z1K1": "Z18", "Z18K1": "Z17517K2" } } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "composition, next/prev N times" }, { "Z1K1": "Z11", "Z11K1": "Z1004", "Z11K2": "se déplacer de N jours de la semaine, Composition" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "N Wochentage später als Komposition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 00abtta3x5qdz7uk4phv2av2esrauu0 Z20325 0 43663 331154 140701 2026-10-23T08:38:42Z Ameisenigel 44 de 331154 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z20325" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z17958", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z17958", "Z17958K1": "Z17420", "Z17958K2": "Z17407", "Z17958K3": { "Z1K1": "Z13518", "Z13518K1": "2" } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z17414", "Z17414K2": "Z17409" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "next(next(Friday)) = Sunday" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "nächster Wochentag zweimal ausführen" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 760kouq6o0h9cp2jq9niz56r64ye5ah Z20326 0 43664 331157 245188 2026-10-23T08:39:57Z Ameisenigel 44 de 331157 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z20326" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z20305", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z20305", "Z20305K1": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "4" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "0" } }, "Z20305K2": { "Z1K1": "Z7", "Z7K1": "Z13522", "Z13522K1": { "Z1K1": "Z7", "Z7K1": "Z19862", "Z19862K1": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "4" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "0" } } }, "Z13522K2": { "Z1K1": "Z13518", "Z13518K1": "0" } }, "Z20305K3": "undefined" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "undefined" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "denominator zero, so \"undefined\"" }, { "Z1K1": "Z11", "Z11K1": "Z1157", "Z11K2": "noemer 0, dus “ongedefinieerd”" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "Nenner ist 0, also \"undefined\"" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 5mrya9ootfme4rlsrp7dx5taj4ix1ge Z20327 0 43665 331158 305078 2026-10-23T08:40:17Z Ameisenigel 44 de 331158 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z20327" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z20323", "Z14K3": { "Z1K1": "Z16", "Z16K1": "Z610", "Z16K2": "def Z20323(Z20323K1, Z20323K2, Z20323K3):\n\timport math\n\timport fractions\n\tif Z20323K3 == 1:\n\t\t#nth root\n\t\treturn fractions.Fraction(Z20323K2 ** (1 / Z20323K1))\n\telif Z20323K3 == 2:\n\t\t#log\n\t\treturn fractions.Fraction(math.log(Z20323K2, Z20323K1))\n\telif Z20323K3 == 3:\n\t\t#standard exponent\n\t\treturn Z20323K1 ** Z20323K2\n\telse:\n\t\traise ValueError('Expected number from 1-3, got ' + Z20323K3)\n\t\t" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Triangle of Power operation Python" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "Dreieck der Potenzierung in Python" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } cd8rz2k216wtdijsnt8ar6rdlv9s46b Z20328 0 43666 331159 140707 2026-10-23T08:40:55Z Ameisenigel 44 de 331159 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z20328" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z20323", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z20323", "Z20323K1": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "2" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "1" } }, "Z20323K2": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "3" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "1" } }, "Z20323K3": { "Z1K1": "Z13518", "Z13518K1": "3" } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z19686", "Z19686K2": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "8" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "1" } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "2, 3, ? = 8" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "2/1, 3/1, ? = 8/1" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } fxkdx04ohim5vk5xj94030lnv1dhp4l Z20329 0 43667 331160 140708 2026-10-23T08:41:28Z Ameisenigel 44 de 331160 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z20329" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z20323", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z20323", "Z20323K1": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "2" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "1" } }, "Z20323K2": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "8" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "1" } }, "Z20323K3": { "Z1K1": "Z13518", "Z13518K1": "2" } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z19686", "Z19686K2": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "3" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "1" } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "2, ?, 8 = 3" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "2/1, ?, 8/1 = 3/1" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } qlny2qck6s8a5cbc0p6pb2vvendazz8 Z20330 0 43668 331161 140711 2026-10-23T08:42:02Z Ameisenigel 44 de 331161 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z20330" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z20323", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z20323", "Z20323K1": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "3" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "1" } }, "Z20323K2": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "8" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "1" } }, "Z20323K3": { "Z1K1": "Z13518", "Z13518K1": "1" } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z19686", "Z19686K2": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "2" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "1" } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "?, 3, 8 = 2" }, { "Z1K1": "Z11", "Z11K1": "Z1430", "Z11K2": "?, 3/1, 8/1 = 2/1" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } jkw66q61cncs29n7vl367s61f93qoup Wikifunctions:How to create implementations/th 4 46527 331125 296947 2026-10-23T08:23:30Z FuzzyBot 207 Updating to match new version of source page 331125 wikitext text/x-wiki <languages/> <div lang="en" dir="ltr" class="mw-content-ltr"> This page provides a more detailed guide to '''creating implementations''', beyond the overview at {{ll|Wikifunctions:Introduction}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Types of Implementations == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In Wikifunctions, an '''implementation''' can take one of two main forms: '''code''' or '''composition'''. A code implementation directly expresses the function’s logic in any of the available programming languages (currently, Python3 or JavaScript). It’s most useful when the function’s behavior can’t easily be built from existing Wikifunctions, or when precise control over data processing is needed. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> A composition implementation, on the other hand, defines the function entirely by combining other existing functions, without writing code. Compositions are easier to understand, reuse, and translate into other languages automatically, but they depend on suitable building blocks already being available and often are less performant. In general, start by checking whether your goal can be achieved through composition; if it can’t, or if performance or fine-grained logic matters, choose a code implementation instead. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> There's a third type of implementation: '''built-ins'''. These are run by system-built code, and are not editable. Most likely all pre-defined functions will have a built-in implementation. In such cases, when opening the implementation page, you will see a message stating ''"{{int|wikilambda-implementation-selector-none}}"'' </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Practice Test-Driven Development == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> '''Test-Driven Development''', or '''TDD''', is a way of creating software where you write tests before you write the actual code. Tests are just a way of understanding what your function is supposed to do by listing examples and how they should work. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In Wikifunctions, writing tests first offers significant benefits. If you are working on an implementation, you can run your code against the existing tests to check that it behaves as expected. This makes it easier to catch errors early before even publishing your implementation. Tests are also a powerful way to describe the function you need. By writing tests, '''you clearly communicate the expected behavior''', and the community can step in and help with the implementation, or create alternative implementations. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Imagine you want to implement a Function that combines two strings with a space in between. A basic test for this might look like: </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello", "world" ) => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Once you have defined the basic behavior, it's important to '''think about edge cases'''—situations where the inputs are such that you might need some special behavior. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, what if your first string ends in a space, or your second string starts with a space? Should the function keep all existing spaces and add another one, or should it return a neatly spaced result with just a single space between the words? Depending on your requirements, you should build a test for such a case. For example, a test for this edge case could be either one of these — but not both!: </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> or ... </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Make sure that all possible special cases are covered by your tests, and once you have them, make sure that they are all connected to the Function by selecting them and clicking "Connect". </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Code implementations == </div> [[File:Code implementation.png|thumb|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions code editor initialized with a function template</span>|<span lang="en" dir="ltr" class="mw-content-ltr">When adding a new code implementation, the function template is initialized with the function and argument names</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> When creating an implementation using code, the Wikifunctions UI will set up a code editor with the selected language activated for syntax highlighting and validation. When the function to implement and the programming language are selected, this editor will be set with the correct function template: '''do not remove or edit this'''! Keep your code inside this function signature: if you need auxiliary functions, you can simply declare them inside your top-level function declaration. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Using input types in your code === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions types {{Z|Z6}} and {{Z|Z40}} can be used as if they were native types in both JavaScript and Python3. For example, a String input can be concatenated or a Boolean be directly used in a logical expression. To use other types in your code implementations, you will have to look deeper into the type, figure out if it has a conversion to a native equivalent, and treat it accordingly. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, let's say we want to write some Python code that handles an input of type {{Z|Z20420}}. In the page for this type, let's look at its "type converters to code" and search for a Python one. The converter {{Z|Z20424}} will be applied to our date input before our code, so looking at "native type" we know that our input will be a Python ''dict'' and looking at the implementation we can see the keys we can expect: </div> <syntaxhighlight lang="python3"> return { 'K1': year, 'K2': month, 'K3': day } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> When a type doesn't have a converter, you'll have to access its parts directly using its keys. For example, let's assume that your function <code>Z30000</code> has one input <code>Z30000K1</code> of type {{Z|Z11}}. This type has two keys: <code>Z11K1</code> for the language (itself an object of type {{Z|Z60}}), and <code>Z11K2</code> for the string value. Similarly, the language object has a key <code>Z60K1</code> for the language code. So, to get a string with the language code and the text, you can write: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1 ) { // e.g. "en: some text" return Z30000K1.Z11K1.Z60K1 + ": " + Z30000K1.Z11K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> For a quick reference of the available type conversions visit [[Special:MyLanguage/Wikifunctions:Execution targets#Default type conversion|the default type conversion table]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Returning the right outputs === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Similarly to the way you treat inputs, outputs need to match the type specified in the function definition. Some can be treated as simply as native types, so any string output will be converted into a Wikifunctions {{Z|Z6}} object and any native boolean returned by your implementation will be converted into a Wikifunctions {{Z|Z40}} object. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Those types that have "type converters from code" will apply the appropriate function to the output, in order to build the required type. Following the example of {{Z|Z20420}}, the {{Z|Z20443}} will transform the output from your implementation–a dict with K1, K2 and K3 keys–into its correct ZObject representation. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For types that don't have converters from code, you can carefully build and return the output objects. For example, imagine that our function <code>Z30000</code> takes two string inputs: language code and text, and should return a {{Z|Z11}} object. You can do this in Python by using the <code>ZObject</code> constructor: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): lang_object = ZObject( {"Z1K1": "Z9", "Z9K1": "Z60"}, Z60K1 = Z30000K1 ) return ZObject( {"Z1K1": "Z9", "Z9K1": "Z11"}, Z11K1 = lang_object, Z11K2 = Z30000K2 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Or in JavaScript: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { const langObject = new ZObject( new Map( [ [ "Z60K1", Z30000K1 ] ] ), { "Z1K1": "Z9", "Z9K1": "Z60" } ); const monolingualKeys = new Map( [ [ "Z11K1", langObject ], [ "Z11K2", Z30000K2 ] ] ); return new ZObject( monolingualKeys, { "Z1K1": "Z9", "Z9K1": "Z11" } ); } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> You can learn more about the <code>ZObject</code> class and other useful constructors in {{ll|Wikifunctions:Execution_targets#Custom_and_non-built-in_type_conversion}} </div> {{phab|T392750}}<div lang="en" dir="ltr" class="mw-content-ltr"> As of 2026-05, trying to return a list of lists may fail, so you're not able to implement such functions in code. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Code in Python === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section, we give a concrete example on how to create an implementation in the form of Code in Python. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is Z30000. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The implementation is defined using the ZID of the function. So are the arguments of the function. So in the case of the function Z30000 with its two arguments, the function template should look like this: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> As we described before, we know that the arguments (<code>Z30000K1</code> and <code>Z30000K2</code>) are Strings, so we can treat them as simply as we use native strings in Python. Also, the function should return a String. For our example, we simply return the two arguments concatenated with a space in between: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Since this is Python, do not forget to indent this line. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If you have followed our advice to [[#Practice Test-Driven Development|practice TDD]], you will already have a set of tests that you know should work. If that's the case, while building your implementation you can click on the circular arrow in the Tests panel, and see if your implementation passes all of them. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Remember that the runtime has no state. Don’t assume values for global or static variables. If you have further questions about what you can and cannot do in Python, ask on [[Wikifunctions:Python implementations]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Code in JavaScript === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section, we give a concrete example on how to create an implementation in the form of Code in JavaScript. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is <code>Z30000</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The implementation is defined using the ZID of the function. So are the arguments of the function. So in the case of the function <code>Z30000</code> with its two arguments, the function template should look like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> We know that the arguments (<code>Z30000K1</code> and <code>Z30000K2</code>) are Strings, so we can treat them as native strings in JavaScript. Also, the function should return a String. To complete our function, you can then add a line concatenating the input strings, like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> If you have tests as recommended in the [[#Practice Test-Driven Development|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes all of them. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Remember that the runtime has no state. Don’t assume values for global or static variables. If you have further questions about what you can and cannot do in JavaScript, ask on [[Wikifunctions:JavaScript implementations]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Calling another Wikifunctions function === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> A code implementation can call certain other Wikifunctions functions, receive the output of the call, and use that output in further processing. We refer to such calls as callbacks. At present, due to security and performance concerns, only the following built-in Wikidata fetch and search functions can be called in this way: {{Z|Z6820}}, {{Z|Z6821}}, {{Z|Z6822}}, {{Z|Z6824}}, {{Z|Z6825}}, {{Z|Z6826}}, {{Z|Z6830}}, and {{Z|Z6831}}. This capability is in an initial stage of deployment; we hope to allow calls to a broader range of functions in the future. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Let’s look at a JavaScript implementation containing a callback. This implementation fetches an item from Wikidata, extracts the label of that item in a given language, and returns the label string. The item to fetch is given by argument <code>Z400K1</code>, and the language is given by <code>Z400K2</code>. </div> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const item = Wikifunctions.Call('Z6821', Z400K1); for (const label of item.Z6001K2.Z12K1) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> A callback is made by calling <code>Wikifunctions.Call</code>, as shown in the example. The first argument to <code>Wikifunctions.Call</code> is always the ZID of the function to be called – in this case, {{Z|Z6821}}, which takes a single argument. Following that, the arguments to be passed to that function are listed, separated by commas. Here, that argument, <code>Z400K1</code>, is the same value that was passed to the function <code>Z400</code>. This is a common pattern of argument passing to callbacks, but their arguments can also be built using the <code>ZObject</code> constructor (as explained above), or obtained in other ways. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The value of <code>Z400K1</code> would be an instance of {{Z|Z6091}}, containing the QID of the item to be fetched. Line 2 of the example calls <code>Z6821</code> to fetch that item from Wikidata and assigns the resulting ZObject to the const <code>item</code>. The remaining code iterates over the item’s labels until it finds the one matching the language given by <code>Z400K2</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For the first example above, we have used <code>Z6821</code> for simplicity. However - unless an entire entity is needed by the implementation, it is strongly recommended to use <code>Z6820</code> to retrieve Wikidata items, which can be quite large. Although a call to <code>Z6820</code> is a bit more complex, its parameters allow for fetching selected portions of a Wikidata item, which can greatly improve performance and avoid some errors, by reducing the network bandwidth and processing time that are needed. (<code>Z6820</code> can also be used in place of <code>Z6822</code>, <code>Z6824</code>, <code>Z6825</code>, and <code>Z6826</code>, to get similar bandwidth-reduction benefits.) </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Just below we show how <code>Z6820</code> can be used, in <code>Wikifunctions.Call</code>, to implement the same behavior as above. Note that we use the second argument passed to <code>Z6820</code>, <code>[labelsPart]</code>, to say “Just return the item’s labels”, and we use the third argument, <code>[Z400K2]</code>, to say “Just return labels in the given language”. (This argument would also apply to aliases and descriptions, if they were included in the result.) </div> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const labelsPart = new ZObject( new Map( [ ['Z6030K1', new ZReference('Z6033')] ] ), {Z1K1: 'Z9', Z9K1: 'Z6030'} ); const entities = Wikifunctions.Call( 'Z6820', [Z400K1], [labelsPart], [Z400K2], []); const item = entities.get(Z400K1.Z6091K1); const labels = item.Z6001K2.Z12K1; for (const label of labels) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Other things to note: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Even though code implementations are now able to fetch Wikidata entities, it is recommended that they not be written to return ''entire'' entities. This is because of current limitations on the size of the value returned from a code implementation. To fetch and return an entire large entity, it’s better to call the fetch function from a composition.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Only one callback can execute at a time. For security reasons, it is not possible to use the concurrency features of JavaScript or Python to execute multiple callbacks in parallel.</span> ** <span lang="en" dir="ltr" class="mw-content-ltr">Keep in mind, however, that you can fetch multiple entities at once using Z6820.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">There is currently a 3 MiB limit on the size of Wikidata content that can be returned to a code implementation, by a single callback. The same limit applies to the size of the result returned from a code implementation.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> == Compositions == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section, we give a concrete example on how to create an implementation in the form of a composition. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is <code>Z30000</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> It is usually a good idea to first think about how to combine existing functions in order to create the desired output. Sometimes this might be trivial, and you can just go ahead with composing functions, but in many cases it is worthwhile to note the desired composition down. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, for the given Function, we could use the existing Function {{Z|Z10000}}. That Function takes two strings and makes one string out of them. But we need to add a space in between. So we first concatenate a space to the end of the first string, and then concatenate the second string to the result of that first concatenation. So our composition could be noted down like this: </div> <syntaxhighlight lang="prolog"> join_strings( join_strings( Z30000K1, " " ), Z30000K2 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> There are multiple ways to write a composition: notice that the same thing could be accomplished with: </div> <syntaxhighlight lang="prolog"> join_strings( Z30000K1, join_strings( " ", Z30000K2 ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> An alternative implementation could also use the existing Function {{Z|Z15175}}, so your composition could be: </div> <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> As you can see, there are multiple ways to accomplish this, so take your time and explore the existing functions available in the {{ll|Wikifunctions:Catalogue}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's try to create the second example, <code>join_strings(Z30000K1, join_strings(" ", Z30000K2))</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In order to create this: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›" icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search for the name of the outermost function you want to use, which in this example is "join two strings". Then, select the wanted function from the dropdown list.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">You will see two new fields, one for each of the arguments needed for the selected function.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">For the first argument, we want to select the first input to our function:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and select "Argument reference".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id" you can now select the first string of your function from the dropdown, which contains all available inputs.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">For the second argument, we want to use the result of another call to "join two strings":</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and select "Function call".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function you want to call, which is again "join two strings".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For this inner function call, configure the "first string" by simply typing a white space in the text field, and configure the "second string" as you did for step 6: change it using the "…" button to "Argument reference", and then select the second argument in the dropdown.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Your composition is now complete! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You can expand and collapse the details using the chevron buttons to see how it looks. If you already have Tests as recommended in the [[#Practice Test-Driven Development|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes the tests. Once your composition passes the tests, go ahead and publish it. </div> [[File:Composition implementation expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its expanded view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its expanded view</span>]] [[File:Composition implementation collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its collapsed view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its collapsed view</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions error handling == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As a Wikifunctions function creator, you might want to warn the user calling your function when something goes wrong in the code, or when their inputs do not fit a certain criteria. For example, if your Function expects a string input to contain a name, you might want to check that the name is not empty and, if it is, show an error message that the person using your Function can understand. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For this purpose, you can use <code>Wikifunctions.Error()</code> from your code implementations or the function {{Z|Z851}} from your compositions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section you will learn: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">How to throw errors from both code and composition implementations,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to write tests for error cases, and</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to catch and handle errors thrown by functions that you are using in your compositions.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Throwing errors from code implementations === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> When writing code, both from JavaScript and Python, you can use <code>Wikifunctions.Error()</code> to end the execution with a wanted error. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> <code>Wikifunctions.Error()</code> has two parameters: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Error type: a string containing the ZID of the error type you want to return.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Error arguments: a list of string arguments to build the error.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's go one by one: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Error type ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> An error type is an object that describes a kind of error that could happen in the system. There are a number of built-in error types but you can also build other error types that are more suited to your use case. When using errors, the best idea is to browse through the available error types, which can be explored in [[Special:ListObjectsByType/Z50|this list]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If there are no errors that fit your case, create a new one by going to the create page, and selecting "Error type" in the type selector. Then, set the necessary fields: </div> [[File:Error type.png|thumb|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Error type creation in Wikifunctions</span>|<span lang="en" dir="ltr" class="mw-content-ltr">To create new Error type (Z50), edit the label and add the necessary keys.</span>]] * <span lang="en" dir="ltr" class="mw-content-ltr">'''Label''' – This is the main title of the error, which should contain a short but descriptive message. Set the error label on the right-side box titled "About".</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Keys''' – Keys contain additional information about what caused the error. For example, if an input had the wrong format, you might want to inform the user of what was the input content when raising the error. To use them in your implementations, keys should be strings. To create a key, click on the "[+]" icon below "keys", select "String" under "value type", and add a label that describes it appropriately, for example "current input". Once you have all the necessary keys, you can Publish your error type and keep the ID of the newly created object.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error message''' – Error types can contain a multilingual array of HTML parametrized error messages. The parameter notation is $1, $2, etc., where the digit corresponds to the error type key. For example, when creating an error type with one string key "current input", the error message can use the positional parameter "$1", which will be replaced with the value of the "current input" key at the time of rendering the error. To add HTML messages, click on the "[+]" icon below "html fragments", select a language and input the HTML string.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Error arguments ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Error arguments correspond to the keys of the Error type, and they should provide additional information to understand the error. Error arguments should always be Strings. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Wikifunctions.Error() ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say that you want an error to be thrown when either your first or your second input are empty. You have already created the error type, and the assigned ZID was <code>Z30005</code>. Your error type has two string keys: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Input key: contains the key of the failing input</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Input value: contains the current value of the failing input</span> <div lang="en" dir="ltr" class="mw-content-ltr"> To raise an error in your JavaScript implementation you should do something like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { // If the first input is empty, raise error Z30005 // with two string args: [ first input key, first input value ] Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { // If the second input is empty, raise error Z30005 // with two string args: [ second input key, second input value ] Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> To raise an error in your Python implementation you should do something like this: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": # If the first input is empty, raise error Z30005 # with two string args: [ first input key, first input value ] Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": # If the second input is empty, raise error Z30005 # with two string args: [ first input key, first input value ] Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Remember that calling <code>Wikifunctions.Error()</code> ends the execution! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Throwing errors from compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If you are creating a composition implementation, you can throw an error by calling the special function {{Z|Z851}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Throw Error function (Z851) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z851}} function is similar to the <code>Wikifunctions.Error()</code> method and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – A reference to the Error type you want to raise</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error parameters''' – A list with the arguments to create your Error, which should also be Strings.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Throw Error ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say you want to modify your composition so that it first checks that the arguments are not empty, and raises an error when it finds an empty one. Then, if none of them are empty, it runs the original composition, which is: </div> <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> To do this, you need to create conditional paths, for which you can use the {{Z|Z802}} function. Think of it like this: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the first argument is empty, throw an error for the first argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Else, proceed to check the second argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the second argument is empty, throw an error for the second argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Else, proceed with the success path and return the joint strings with the space separator</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Or in functional pseudo code: </div> <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), throw_error( Z30005, [ "Z30000K1", Z30000K1 ] ), if( is_empty_string( Z30000K2 ), throw_error( Z30005, [ "Z30000K2", Z30000K2 ] ), join_with_separator( Z30000K1, Z30000K2, " " ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's create this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+” button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›” icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the outermost function you want to use, which in this case is "if".</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Check the validity of the first argument:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "condition", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "is empty string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "input", click on the "…" button and select "argument reference"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id", select the first input (e.g. "first string")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse the "condition" function call if you want, by clicking on the down-chevron next to "condition". You should see something like "f(x) is empty string( → first string )"</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Throw error if the condition is true:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "then", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Throw Error"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error type", search and select your error type (you can directly input the error ID if you know it, e.g. Z30005)</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error parameters", add two items by clicking on the "+" button</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For "Item 1" (offending argument key), set its type to "String" and write the argument identifier (e.g. "first input", or "Z30000K1")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For "Item 2" (offending argument value), click on the "…" next to "Item 2" and select "argument reference"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id", select the first input (e.g. "first string")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse the "then" function call if you want, by clicking on the down-chevron next to "then". You should see something like "f(x) Throw Error( Input was the wrong format, Typed list( Object, "first input", → first string ) )"</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Continue to check the second argument if the first was good:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "else", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "if"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Set up "condition" to check the validity of the second argument by following the same process as described in step 5.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Set up "then" to throw an error for the second argument by following the same process as described in step 6.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Finally, set up the success path:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to the nested "else", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the successful function, which in this case can be "join strings with separator"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and set it to "argument reference", then select "first string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and set it to "argument reference", then select "second string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "separator" add a space into the text field</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The resulting function call should look like this: </div> [[File:Throw error expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function</span>]] [[File:Throw error collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function, in its collapsed view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function, in its collapsed view</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Handling errors in compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> While it is useful to allow functions to raise expected errors, it is crucial to be able to handle errors in your compositions in order to safely use these functions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say you want to create a new function "full name of a person" – we will refer to it with the ZID <code>Z30010</code>. This function should return the full name of a person given a first and last names, but if any of the two fields are empty, it should return the text "Unknown" instead. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You could create a composition using our example function "Join two strings with a space" or <code>Z30000</code> to generate the name. If any of the inputs are empty, you know that <code>Z30000</code> will throw an error of type <code>Z30005</code>. Using the function {{Z|Z850}} as a wrapper, you can attempt the join operation and intercept a possible error to simply return "Unknown" whenever it occurs. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Try-Catch function (Z850) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z850}} function is built-in with ZID <code>Z850</code> and takes three arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – The initial function call to run. If nothing goes wrong, the response will be the result of this function call.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – An error type to catch in case it is thrown during the execution of the first function call.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error handler''' – A function call that will be run in case the error specified above is caught during the execution of the initial function call. If that happens, the result of the error handler will be the value returned.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Try-Catch ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Once we have all the functions for our composition, we can craft it like this: </div> <syntaxhighlight lang="prolog"> try_catch( join_with_space( Z30010K1, Z30010K2 ), Z30005, echo( "Unknown" ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This means that: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">The "Join two strings with a space" function will be tried with the two inputs and, if everything goes well, the output of this function will be returned</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If any of the inputs are blank, "Join two strings with a space" with raise an error of type <code>Z30005</code></span> * <span lang="en" dir="ltr" class="mw-content-ltr">Our {{Z|Z850}} will then detect this error and run the {{Z|Z801}} function to return "Unknown"</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's create this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›” icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the outermost function you want to use, which in this case is "Try-Catch".</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Set the main function call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under the field where the "Try-Catch" function is selected, next to the "function call" key, click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the function "join two strings with space"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and select "argument reference", then select the "first name" argument from the dropdown.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and select "argument reference", then select the "second name" argument from the dropdown.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Select the error to catch:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error type", search and select "bad string input" – you can search directly by its ZID <code>Z30005</code></span> # <span lang="en" dir="ltr" class="mw-content-ltr">Set the error handler function call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "error handler", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "echo"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "input" and "type", search and select the type "String"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now, under "input", type "Unknown" in the text field</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The resulting function should look like this: </div> [[File:Try catch expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in expanded mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in expanded mode</span>]] [[File:Try catch collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in collapsed mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in collapsed mode</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Testing your failure use cases === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As we introduced in the above section about [[#Practice Test-Driven Development|practicing TDD]], it's important to test not only the most common paths, but also the possible edge cases. It is equally important to test failure behavior. In this section we will give you the tools necessary to test that your function fails with a given set of inputs, and that the error thrown is the expected one. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> To do that, you will need other two system functions: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Is error type (Z852) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z852}} function is built-in with ZID <code>Z852</code> and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error''' – An {{Z|Z5}} object, which can be thrown by a failing call. An error instance has a type and a value.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – A reference to an {{Z|Z50}} which will be compared to the type of the Error passed as a first argument. If that's the case, the function will return true.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Get error thrown by function call (Z853) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z853}} function is built-in with ZID <code>Z853</code> and takes one argument: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – A function call which can either return a successful value of any type, or throw an error.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> This function returns a {{Z|Z882}} with a {{Z|Z40}} in first place and an {{Z|Z1}} in the second: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the Function call runs successfully and hence does not throw any error, the returned pair will contain False in the first place, and void in the second.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the Function call throws an error, the returned pair will contain True in the first place, and the caught error in the second.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> To use this function in your compositions, you might need to use the additional functions: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">{{Z|Z821}}, and</span> * {{Z|Z822}} <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Testing errors ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say our target function, "Join two strings with a space" or <code>Z30000</code>, throws an error of type <code>Z30005</code> and we want to test this behavior. To do that we need to: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Throw a failing function call</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Get the error using the function {{Z|Z853}}</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Check that the error is the right type with {{Z|Z852}}</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Tests have two fields: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Call''' – A function call that will produce an output with the inputs you want to test. This call will return a value.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Result validation''' – A function call that will validate that the value returned by the call above is the expected one. The first argument of this function call will be automatically assigned to take the return value of the first call.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> For step-by-step instructions on how to create tests, see {{ll|Wikifunctions:Introduction#Create_tests}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In our example, we can structure it like this — but this is not the only way! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The call, which will return an {{Z|Z5}} object: </div> <syntaxhighlight lang="prolog"> error = get_second_element_of_typed_list( get_error_thrown_by( join_strings_by_whitespace( "", "not empty" ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> And the result validation, which will take the {{Z|Z5}} object as its first argument: </div> <syntaxhighlight lang="prolog"> is_error_type( error, Z30005 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's do this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding a test by clicking on the "+" button in the "Tests" table from your Function page. The "call" and "result validation" fields already have some functions pre-set, but to test the errors we will need to change them.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">First, let's set the call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "call", click the "›" chevron button to expand the function call.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", edit the field and search and select the function "Get second element of a typed pair"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Once selected, next to "Typed pair", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Get error thrown by function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "function call", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Join two strings with a space" (or by ZID <code>Z30000</code>)</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now set the inputs so that they cause a failure: at least one of them should be empty.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse your "call" by clicking again on the down-chevron button if you want!</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Next, let's set the result validation:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "result validation", click the "›" chevron button to expand the function call.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", edit the field and search and select the function "Is error type"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now you will only be asked to configure the second argument. Under "error type", search and select your <code>Z30005</code> error type.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">And you are done! You can now click the circular arrow in the "Implementations" box and you should see green checks.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> If everything went right, you can now save your test. It should look like this: </div> [[File:Get error expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in expanded mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in expanded mode</span>]] [[File:Get error collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in collapsed mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in collapsed mode</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Creating actionable error messages === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As described above, Error Types have an optional key <code>Z50K3</code> which contains a multilingual list of HTML strings. When rendering information about an error, the messages stored in the error type can help create a clear, precise, informative, translatable and actionable error message. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For that purpose, error messages can contain parameters like <code>$1</code>, <code>$2</code>, etc., where the digit corresponds to the error type argument and its value in the error instance. These error messages are rendered in Wikifunctions inside the "Details" dialog window after executing a function call. Additionally, these error messages are surfaced in other client interfaces, like Abstract Wikipedia, to provide better guidance to Abstract Content editors. </div> [[File:Wikifunctions actionable error message example in the Details dialog.png|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">The error message is rendered using the HTML message of the error type and the error argument values.</span>]] [[File:Wikifunctions actionable error message example in Abstract Wikipedia.png|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">When available, the HTML error message is rendered in the Abstract Wikipedia preview section.</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> Let's use a real example to understand the benefits of HTML error messages: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The function {{Z|Z37847}} returns the first Lexeme reference given a Wikidata Item reference and a language. When there is no Lexeme for this Item-Language combination, it throws an error of type {{Z|Z28248}}, which has three keys: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K1''' is the input Wikidata item QID</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K2''' is the connecting property, in this case <code>P5137/item for this sense</code></span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K3''' is the language code</span> <div lang="en" dir="ltr" class="mw-content-ltr"> When calling this function for a Wikidata lexeme that doesn't exist, the call will throw an error instance like this: </div> <syntaxhighlight lang="json" highlight="10,12"> { "Z1K1": "Z5", "Z5K1": "Z28248", "Z5K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z885", "Z885K1": "Z28248" }, "Z28248K1": "Q319", "Z28248K2": "P5137", "Z28248K3": "ast" } } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> While the error type label indicates: <code>No matching lexeme for item in language</code>, a better error message should indicate: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">which is the failing item,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">which is the language missing, and</span> * <span lang="en" dir="ltr" class="mw-content-ltr">what are the possible ways to fix it.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The error message <code>Z50K3</code> field can provide this functionality. Whenever an Error Type has an error message for the user language (or any of its fallbacks), the error message shown will be rendered by: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">First, replacing the message parameters with the values of the keys. In our example, any <code>$1</code> will be replaced with the value of <code>Z28248K1</code> ("Q319"), <code>$2</code> with "P5137", and <code>$3</code> with "ast",</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Last, sanitizing and rendering the HTML message.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> So a HTML message like: </div> <syntaxhighlight lang="html"> There is no matching lexeme for the item $1 in "$3".<br> <a href="http://wikidata.org/wiki/$1">Edit in Wikidata</a> </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Will become: </div> : There is no matching lexeme for the item Q319 in "ast" : [[d:Q319|Edit in Wikidata]] <div lang="en" dir="ltr" class="mw-content-ltr"> == Debugging your implementations == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Sometimes things can go wrong. A function might behave differently than expected or a value might not look quite right. Sometimes implementations are really complex and, because they are run in a sandboxed environment, it can seem really difficult to debug. To help understand what's going on inside a function call, Wikifunctions includes a small set of debugging tools. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> These tools don't change the result of a function, but will add extra information to the returned metadata, which you can observe after running the function. You can use <code>Wikifunctions.Debug()</code> from your code implementations or the function {{Z|Z854}} from your compositions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section you will learn: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">How to add debug messages from both code and composition implementations,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to inspect the metadata manually or via the UI to inspect these logs.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Debugging your code implementations === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> When writing code, both from JavaScript and Python3, you can use <code>Wikifunctions.Debug()</code> to add a message to your debugging log and continue the execution. </div> {{phab|T441028}} <div lang="en" dir="ltr" class="mw-content-ltr"> <code>Wikifunctions.Debug()</code> has one parameter, which is generally expected to be a string. However, any other object passed as parameter will get directly converted into a string. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If we want to add debug logs to our code implementations for our "Join two strings with a space" example function, we can do, in JavaScript: </div> <syntaxhighlight lang="JavaScript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { Wikifunctions.Debug( `first input is empty "${ Z30000K1 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { Wikifunctions.Debug( `second input is empty "${ Z30000K2 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } Wikifunctions.Debug( "both inputs are fine" ); return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> And the same in your Python3 implementation will be: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": Wikifunctions.Debug( 'first input is empty "'+Z30000K1+'"' ) Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": Wikifunctions.Debug( 'second input is empty "'+Z30000K2+'"' ) Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) Wikifunctions.Debug( 'both inputs are fine' ) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This way, no matter what happens, we will be adding one message to your debugging logs: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the function call fails when checking on the first or second input, the result of the execution will be a failure, but it will contain one informative log about what branch caused the failure.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the function call succeeds—because both inputs are valid—the function call will return the joined string, but the returned metadata will also contain a debug log.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Debugging your compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> To support debugging compositions, Wikifunctions provides the built-in function {{Z|Z854}}. This function allows you to attach debug messages to the execution of any function call that generates the final output. The debug logs collected during the evaluation are returned as part of the execution metadata, under the <code>executorDebugLogs</code> key. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Add debug log to function call (Z854) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z854}} function is built-in with ZID <code>Z854</code> and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – Any composition you want to execute.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Debug log''' – A string message that will be recorded if the given function call is evaluated.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> When the wrapped function call runs, the provided message is added to the execution logs. If that function call is not executed, or its execution is not part of the final output, its debug log will not appear in the final result metadata. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You will benefit from this built-in if you want to observe: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Which branch of a conditional was executed, or</span> * <span lang="en" dir="ltr" class="mw-content-ltr">the order of evaluation in a composition.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Add debug log to function call ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say that you want to add debug logs to our example function "Join two strings with a space" or <code>Z30000</code>, so that different messages are added to the different possible outcomes. You could use our debugging builtin like this: </div> <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), add_debug_log( throw_error( Z30005, ... ), 'failed on first input' ) if( is_empty_string( Z30000K2 ), add_debug_log( throw_error( Z30005, ... ), 'failed on second input' ), add_debug_log( join_with_separator( Z30000K1, Z30000K2, " " ), 'both inputs are ok!' ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This way, </div> * <span lang="en" dir="ltr" class="mw-content-ltr">when called with an empty first input, the function will return a failed response, and the metadata will contain an <code>executorDebugLogs</code> entry with the "failed on first input" log.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">When called with an empty second input, the call will also fail, but the logged message will be "failed on second input"</span> * <span lang="en" dir="ltr" class="mw-content-ltr">When called with valid inputs, the function will return a successful response, and additionally the metadata will contain "both inputs are ok" in its <code>executorDebugLogs</code> key.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> This is the way this composition would look: </div> [[File:Add debug log expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Composition implementation using Add debug logs to log all possible execution paths</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Composition implementation using Add debug logs to log all possible execution paths</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Accessing execution debug logs === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Whether your execution logs are added via <code>Wikifunctions.Debug()</code> or via the {{Z|Z854}} built-in function, they are returned as part of the response metadata. To see the logs, once you run your function, click on the "Details" button that appears at the bottom of the "Result" section. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The error and debug information will appear at the top of the "Details" dialog. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> This is what you would see when running the composition from our previous example with valid and invalid inputs: </div> {| class="wikitable" | [[File:Execution logs success.png|frameless|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a successful execution with debug logs</span>]] | [[File:Execution logs failure.png|frameless|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a failed execution with debug logs</span>]] |- | <span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a successful execution: shows no errors, but displays the successful execution log: ''"both inputs are ok!"''</span> | <span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a failed execution: shows the error information, and the additional execution log for the first failure branch: ''"failed on first input"''</span> |} [[Category:How to create implementations| {{#translation:}}]] dlmwu3u2p5okpwp642pllbzvcgl8mvp Wikifunctions:Naming conventions/he 4 46798 331146 325776 2026-10-23T08:29:49Z FuzzyBot 207 Updating to match new version of source page 331146 wikitext text/x-wiki <languages/> {{shortcut|[[WF:NC]]}} {{Draft}} הדף הזה נועד לסכם כמה דרכים מקובלות לכינוי עצמים בוויקיפונקציות. מכיוון שזה עדיין מיזם צעיר, עדיין לא הוגדרו הרבה קווים מנחים. <span id="Capitalization"></span> == אותיות רישיות וקטנות == חלק מהשפות משתמשות באותיות רישיות וקטנות. תוויות של עצמים צריכות להיות כתובות בשפות כאלו כאילו היו ביטוי רגיל. השימוש ב־[[:w:en:Title case|Title case]], כפי שנהוג באנגלית, אינו מומלץ. למשל, במקום לכתוב באנגלית ''Calculate A Distance Between Earth And Sun On a Given Date'' יש לכתוב משהו כמו ''calculate a distance between Earth and Sun on a given date''. <div class="mw-translate-fuzzy"> יש להשתמש באותיות רישיות רק בשמות פרטיים ובמילים אחרות בהתאם לכללי השפה שלך. משל, זה חל על שמות עצם בגרמנית, ועל כמה מחלקות של מילים באנגלית, כגון ימי השבוע ושמות של שפות. אין צורך לכתוב את הדברים האלה באותיות גדולות אם כללי השפה שלך לא דורשים את זה. קיצורים צריכים להשתמש בצורתם המקובלת; למשל, באנגלית, יש להשתמש ב־"[[:en:RSA (cryptosystem)|RSA]]" ולא ב־"rsa" עבור שם אלגוריתם ההצפנה. </div> מקובל ששמות של עצמים שמתארים סוגי נתונים יהיו כתובים באות ראשונה גדולה (למשל [[Z1]] ו־[[Z8]]). <span id="Search_characters"></span> == תווי חיפוש == מנוע החיפוש משתמש בכמה תווים שמשנים את משמעות השאילתה, אז יש להימנע מכתוב אותם בתחילת מילה. התווים האלה הם: <code>~ * \? - " !</code>. נא לשים לב לכך שהתו "?" בפני עצמו (ולא "\?") אינו משנה את השאילתה. עם זאת, מדובר בתו מסוג "greyspace". תווי "greyspace" אחרים הם <code>~ ! @ # $ % ^ & ( ) _ + - = { } | [ ] \ : " ; ' < > ? , . /</code>. מנוע החיפוש מתייחס אליהם (לחוד או בשילוב) כחלק מגבול המילה. בדרך־כלל זאת לא בעיה, אבל אם הם צפויים להיות משמעותיים בחיפושים, כדאי להימנע מהם בתחילת המילה או בסופה (או בין מילים), אלא אם יש צורך (למשל: [[Z11729]]). ר' [[:mw:Special:MyLanguage/Help:CirrusSearch|עזרה:CirrusSearch]] לפרטים על חיפוש טקסט שמכיל כל אחד מהתווים האלה. <span id="Implementation_names"></span> == שמות המימושים == בעת יצירת מימוש, יש לציין את השפה שהשתמשת בה בשמה (פייתון / JavaScript / הרכבה). אם יש יותר ממימוש אחד באותה שפה, מומלץ לפרט מעט בכותרת מה הופך את המימוש הזה לשונה. למשל, להזכיר את שם האלגוריתם (אם קיים). <span id="Test_cases"></span> == מקרי בדיקה == תוויות של מקרי בדיקה צריכות לספק רמז כלשהו לגבי מה שהן בודקות. זה לא חייב לכלול ערכים עבור כל קלט ופלט, אבל כן צריך לציין לפחות תחום שנבדק. למשל, אולי תרצה לומר שהבדיקה הזאת בודקת את ההתנהגות של פונקציית מחרוזת כאשר ניתנות לה אותיות מהאלפבית הקירילי, או של פונקציה מתמטית כאשר מעבירים אליה שבר או מספר מרוכב. אם מקרה הבדיקה קשור לפונקציית מחרוזת, וכללת ארגומנט מחרוזת בשם מקרה הבדיקה, נא להקיף את הארגומנט במירכאות או לסמן אותו בדרך אחרת כדי שיהיה ברור מה הערך. זה מועיל במיוחד אם לערך יש רווח לבן משמעותי בהתחלה או בסוף (למשל, בעת בדיקת פונקציית חיתוך טקסט). <div lang="en" dir="ltr" class="mw-content-ltr"> == Configuration of functions for given languages == </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Should start with "config for."</span> ** <span lang="en" dir="ltr" class="mw-content-ltr">If the configuration is a display function, it should be "config for displaying", followed by the exact name of the type.</span> ** <span lang="en" dir="ltr" class="mw-content-ltr">If the configuration is a read function, it should be "config for reading", following by the exact name of the type.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> == Types == </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Should be in sentence case (e.g. Rational number)</span> ** <span lang="en" dir="ltr" class="mw-content-ltr">This rule should not be followed if the type name is used outside of Wikifunctions and more often than not is in a snake-case form (e.g. {{Z|Z20838}})</span> <span id="Multi-lingual_labels"></span> == תוויות רב־לשוניות == {{Phab|T359663}} <div class="mw-translate-fuzzy"> ניתן להשתמש בתוויות ב''שפות מרובות'' (באמצעות קוד השפה <code>mul</code>) כדי לציין את התווית באופן שאינו כולל מילים, למשל כביטוי מתמטי. ר' {{Z|10512}} למשל. עם זאת, ברגע כתיבת השורות האלו, התוכנה אינה משתמשת בתוויות האלו בתור שפת גיבוי. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == language-specific local naming conventions == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Some languages may have their own language-specific naming conventions (these should probably be decided through discussions within the community that speaks the language, though many are likely drafts). </div> * [[Wikifunctions:Naming conventions/日本語]] (Japanese) [[Category:Policy{{#translation:}}]] 3mt3pdt5to8cstpjz1w9ac3f6pnruot Wikifunctions:What Wikifunctions is not/it 4 52778 331062 190627 2026-10-23T08:06:06Z FuzzyBot 207 Updating to match new version of source page 331062 wikitext text/x-wiki <languages/> {{shortcut|[[WF:NOT]]}} {{Draft}} <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions is a new kind of website, aiming for a new community. We very much hope to work together with many tools, sites, communities, and kinds of systems that are out there: we want to play together with IDEs, with cloud computing platforms, with app development sites, and many more. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> But we also aim to be a novel thing and we hope to shape a new unique space out for us: a Wikimedia project for everyone to collaboratively create and maintain a library of code functions to support the Wikimedia projects and beyond, for everyone to call and re-use in the world's natural and programming languages. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The scope of the project is within bounds, though. So, let us also explore '''what Wikifunctions is not'''. </div> <span id="Wikifunctions_is_not_an_encyclopædia_of_algorithms"></span> == Wikifunctions non è una enciclopedia di algoritmi == <div lang="en" dir="ltr" class="mw-content-ltr"> This means that we will '''not''' concentrate on having pages for famous and not-so famous algorithms such as [[w:Euclidean algorithm|Euclid's]], [[w:Newton's method|Newton's]], or [[w:Dijkstra's algorithm|Dijkstra's algorithm]], aiming to represent all existing algorithms faithfully and in their historical context. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Yes, we expect to have a function for the [[w:Greatest common divisor|greatest common divisor]] (GCD) of two integers. And there might be one or more implementations which are based on Euclid's algorithm to calculate the GCD. But Wikifunctions' main goal is not to gather algorithms, and it would not be incomplete if it didn't include some, and used alternatives instead to compute the GCD. If you are looking for that, many Wikipedias are actually [[w:List of algorithms|great resources]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Unlike an encyclopedic overview of existing algorithms, Wikifunctions will also invite original work. We will not be restricted to functions that have been published elsewhere first, and we do not require for every function and implementation to be based on previously published work. Wikifunctions, much like Wikibooks and very unlike Wikipedia, will be open to novel contributions. The main criteria for implementations will be: under which conditions can we run a given implementation, and what resources is it expected to take? </div> <span id="Wikifunctions_is_not_an_app_development_site"></span> == Wikifunctions non è un sito di sviluppo delle app == <div lang="en" dir="ltr" class="mw-content-ltr"> We do not expect to make it possible to create full-fledged, stand-alone apps within Wikifunctions — there will be no place to store state, we don't aim to allow calling external APIs or directly cause changes to other sites, and we don't aim to package up apps with icons and UX, etc. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We absolutely expect Wikifunctions to be a very useful resource for app developers, and can very much imagine apps that are basically wrappers around one or more functions from Wikifunctions, but these would still need code and other assets which wouldn't be part of Wikifunctions. We are not competing in the area of no-code or low-code development sites. </div> <span id="Wikifunctions_is_not_a_code_hosting_service"></span> == Wikifunctions non è un servizio di hosting del codice == <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions will host code — but not for whole projects, merely for individual functions. There won't be libraries, apps, or services developed on Wikifunctions with bug-trackers, forums, etc. There won't be a Web-based version control system such as ''Mercurial'' or ''Git'' running against Wikifunctions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Again, we hope that there will be libraries, apps, and services that will rely on functions available in Wikifunctions, but they would be developed on a different site, such as ''Gerrit'', ''GitHub'', or ''GitLab''. </div> <span id="Wikifunctions_is_not_a_programming_language,_nor_is_trying_to_evangelise_a_particular_language"></span> == Wikifunctions non è un linguaggio di programmazione, e non sta provando a evangelizzare a favore di un linguaggio particolare == <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions will allow for functions to be implemented in a multitude of programming languages. The possibility to compose functions together to create higher level functions may look a little bit like a new programming language, but it will be extremely limited compared to most other programming languages, since we only allow for nested function calls and that's it. </div> <span id="Wikifunctions_is_not_an_Integrated_Development_Environment_(IDE)"></span> == Wikifunctions non è un Ambiente di Sviluppo Integrato (IDE) == Non ti forniamo un'interfaccia per la creazione o sviluppo di progetti, interfacciante con i sistemi di sviluppo, test e controllo del sorgente. <span id="Wikifunctions_is_not_a_question-and-answer_website"></span> == Wikifunctions non è un sito di domande e risposte == <div lang="en" dir="ltr" class="mw-content-ltr"> We are not competing with ''Stack Overflow'' and similar websites, where a developer would ask how to achieve a certain task and have community members discuss and answer the question. We won't contain code snippets to help answer the question, but we will organize code within our website to enable the evaluation of functions within a library of functions. </div> <span id="Wikifunctions_is_not_a_cloud_computing_platform"></span> == Wikifunctions non è una piattaforma di computazione sul cloud == <div lang="en" dir="ltr" class="mw-content-ltr"> We do not provide computing resources and access to services and APIs so that you can run your computational needs on our platform, either for money or for free. Use of Wikifunctions's evaluation platform is to improve access to knowledge for everyone. </div> <span id="Wikifunctions_is_not_a_code_snippet_website"></span> == Wikifunctions non è un sito di frammenti di codice == <div lang="en" dir="ltr" class="mw-content-ltr"> We are not competing with code snippet sites such as GitHub Gists, [[w:Rosetta_Code|Rosetta Code]], [https://esolangs.org/ esolangs.org], or [http://helloworldcollection.de/ helloworldcollection.de]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions differs in that it allows running code and composing existing functions together to create new ones. As well, Wikifunctions is for useful and meaningful code, not temporary, arbitrary snippets that other platforms may accept. </div> <span id="Wikifunctions_is_not_a_code_education_platform"></span> == Wikifunctions non è una piattaforma di insegnamento per la programmazione == <div lang="en" dir="ltr" class="mw-content-ltr"> We are not focused on teaching people how to code, the material in Wikifunctions will not be laid out in a pedagogical order, and we also won't make sure to comprehensively cover all topics important for coding. In fact, we aim for Wikifunctions to be usable for people who don't know how to code and who don't need to learn how to code to use most of Wikifunctions effectively. Though the Wikifunctions community may well help each other in sharing best practices, style guides, and tips on how to use the site in different languages, these will be aimed at the purpose of serving the world's knowledge. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not (only) the boiler room for Abstract Wikipedia == </div> [[File:Mechanical_room_in_basement._Wayne_N._Aspinall_Federal_Building_and_U.S._Courthouse,_Grand_Junction,_Colorado_LCCN2014650034.tif|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">A '[[d:Q6804549|boiler room]]', where unsightly-but-vital machinery is hidden</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> Natural language generation (NLG) is the focus of {{SITENAME}} as of 2026, and the site began as part of the wider [[meta:Special:MyLanguage/Abstract_Wikipedia|Abstract Wikipedia project]], but NLG is far from the only field in which functions are being developed. That is to say, WF is necessary for AW, but AW is not necessary for WF. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> On top of the computer science staples of Boolean logic, arithmetic, and list manipulation, we have useful functions relating to disciplines such as [[Z16718|chemistry]], [[Z35550|dimensional analysis]], [[Z20074|electrical engineering]], [[Z22162|genomics]], [[Z10393|information theory]], [[Z26830|meteorology]], [[Z13955|number theory]], [[Z27919|physiology]], [[Z20094|probability]], [[Z24497|quantum mechanics]], [[Z14226|railroad engineering]], [[Z28600|timekeeping/chronometry]], and [[Z26841|trigonometry]]. </div> [[Category:Project concept{{#translation:}}]] o8vrzfsleziwzjzbtow09xnfvguq3jt Wikifunctions:How to create implementations/pa 4 53431 331119 296942 2026-10-23T08:23:25Z FuzzyBot 207 Updating to match new version of source page 331119 wikitext text/x-wiki <languages/> ਇਹ ਵਰਕਾ {{ll|Wikifunctions:Introduction}} 'ਤੇ ਸੰਖੇਪ ਜਾਣਕਾਰੀ ਤੋਂ ਪਰੇ, '''ਅਮਲ-ਲਿਆਉਣਾ ਬਣਾਉਣ''' ਲਈ ਵਧੇਰੇ ਵੇਰਵੇ ਨਾਲ ਦਸਤੀ ਦੇਂਦਾ ਏ। <div lang="en" dir="ltr" class="mw-content-ltr"> == Types of Implementations == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In Wikifunctions, an '''implementation''' can take one of two main forms: '''code''' or '''composition'''. A code implementation directly expresses the function’s logic in any of the available programming languages (currently, Python3 or JavaScript). It’s most useful when the function’s behavior can’t easily be built from existing Wikifunctions, or when precise control over data processing is needed. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> A composition implementation, on the other hand, defines the function entirely by combining other existing functions, without writing code. Compositions are easier to understand, reuse, and translate into other languages automatically, but they depend on suitable building blocks already being available and often are less performant. In general, start by checking whether your goal can be achieved through composition; if it can’t, or if performance or fine-grained logic matters, choose a code implementation instead. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> There's a third type of implementation: '''built-ins'''. These are run by system-built code, and are not editable. Most likely all pre-defined functions will have a built-in implementation. In such cases, when opening the implementation page, you will see a message stating ''"{{int|wikilambda-implementation-selector-none}}"'' </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Practice Test-Driven Development == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> '''Test-Driven Development''', or '''TDD''', is a way of creating software where you write tests before you write the actual code. Tests are just a way of understanding what your function is supposed to do by listing examples and how they should work. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In Wikifunctions, writing tests first offers significant benefits. If you are working on an implementation, you can run your code against the existing tests to check that it behaves as expected. This makes it easier to catch errors early before even publishing your implementation. Tests are also a powerful way to describe the function you need. By writing tests, '''you clearly communicate the expected behavior''', and the community can step in and help with the implementation, or create alternative implementations. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Imagine you want to implement a Function that combines two strings with a space in between. A basic test for this might look like: </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello", "world" ) => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Once you have defined the basic behavior, it's important to '''think about edge cases'''—situations where the inputs are such that you might need some special behavior. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, what if your first string ends in a space, or your second string starts with a space? Should the function keep all existing spaces and add another one, or should it return a neatly spaced result with just a single space between the words? Depending on your requirements, you should build a test for such a case. For example, a test for this edge case could be either one of these — but not both!: </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> or ... </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Make sure that all possible special cases are covered by your tests, and once you have them, make sure that they are all connected to the Function by selecting them and clicking "Connect". </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Code implementations == </div> [[File:Code implementation.png|thumb|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions code editor initialized with a function template</span>|<span lang="en" dir="ltr" class="mw-content-ltr">When adding a new code implementation, the function template is initialized with the function and argument names</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> When creating an implementation using code, the Wikifunctions UI will set up a code editor with the selected language activated for syntax highlighting and validation. When the function to implement and the programming language are selected, this editor will be set with the correct function template: '''do not remove or edit this'''! Keep your code inside this function signature: if you need auxiliary functions, you can simply declare them inside your top-level function declaration. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Using input types in your code === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions types {{Z|Z6}} and {{Z|Z40}} can be used as if they were native types in both JavaScript and Python3. For example, a String input can be concatenated or a Boolean be directly used in a logical expression. To use other types in your code implementations, you will have to look deeper into the type, figure out if it has a conversion to a native equivalent, and treat it accordingly. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, let's say we want to write some Python code that handles an input of type {{Z|Z20420}}. In the page for this type, let's look at its "type converters to code" and search for a Python one. The converter {{Z|Z20424}} will be applied to our date input before our code, so looking at "native type" we know that our input will be a Python ''dict'' and looking at the implementation we can see the keys we can expect: </div> <syntaxhighlight lang="python3"> return { 'K1': year, 'K2': month, 'K3': day } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> When a type doesn't have a converter, you'll have to access its parts directly using its keys. For example, let's assume that your function <code>Z30000</code> has one input <code>Z30000K1</code> of type {{Z|Z11}}. This type has two keys: <code>Z11K1</code> for the language (itself an object of type {{Z|Z60}}), and <code>Z11K2</code> for the string value. Similarly, the language object has a key <code>Z60K1</code> for the language code. So, to get a string with the language code and the text, you can write: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1 ) { // e.g. "en: some text" return Z30000K1.Z11K1.Z60K1 + ": " + Z30000K1.Z11K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> For a quick reference of the available type conversions visit [[Special:MyLanguage/Wikifunctions:Execution targets#Default type conversion|the default type conversion table]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Returning the right outputs === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Similarly to the way you treat inputs, outputs need to match the type specified in the function definition. Some can be treated as simply as native types, so any string output will be converted into a Wikifunctions {{Z|Z6}} object and any native boolean returned by your implementation will be converted into a Wikifunctions {{Z|Z40}} object. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Those types that have "type converters from code" will apply the appropriate function to the output, in order to build the required type. Following the example of {{Z|Z20420}}, the {{Z|Z20443}} will transform the output from your implementation–a dict with K1, K2 and K3 keys–into its correct ZObject representation. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For types that don't have converters from code, you can carefully build and return the output objects. For example, imagine that our function <code>Z30000</code> takes two string inputs: language code and text, and should return a {{Z|Z11}} object. You can do this in Python by using the <code>ZObject</code> constructor: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): lang_object = ZObject( {"Z1K1": "Z9", "Z9K1": "Z60"}, Z60K1 = Z30000K1 ) return ZObject( {"Z1K1": "Z9", "Z9K1": "Z11"}, Z11K1 = lang_object, Z11K2 = Z30000K2 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Or in JavaScript: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { const langObject = new ZObject( new Map( [ [ "Z60K1", Z30000K1 ] ] ), { "Z1K1": "Z9", "Z9K1": "Z60" } ); const monolingualKeys = new Map( [ [ "Z11K1", langObject ], [ "Z11K2", Z30000K2 ] ] ); return new ZObject( monolingualKeys, { "Z1K1": "Z9", "Z9K1": "Z11" } ); } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> You can learn more about the <code>ZObject</code> class and other useful constructors in {{ll|Wikifunctions:Execution_targets#Custom_and_non-built-in_type_conversion}} </div> {{phab|T392750}}<div lang="en" dir="ltr" class="mw-content-ltr"> As of 2026-05, trying to return a list of lists may fail, so you're not able to implement such functions in code. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Code in Python === </div> <div class="mw-translate-fuzzy"> ਇਸ ਭਾਗ ਵਿੱਚ, ਅਸੀਂ ਪਾਈਥਨ ਵਿੱਚ ਕੋਡ ਦੇ ਰੂਪ ਵਿੱਚ ਇੱਕ ਅਮਲ-ਲਿਆਉਣਾ ਕਿਵੇਂ ਬਣਾਇਆ ਜਾਵੇ ਇਸ ਬਾਰੇ ਇੱਕ ਠੋਸ ਉਦਾਹਰਣ ਦਿੰਦੇ ਹਾਂ। ਮੰਨ ਲਓ ਕਿ ਅਸੀਂ ਇੱਕ ਕਾਰਜ਼ ਲਈ ਇੱਕ ਅਮਲ-ਲਿਆਉਣਾ ਬਣਾਉਣਾ ਚਾਹੁੰਦੇ ਹਾਂ ਜੋ ਦੋ input ਸਤਰ ਨੂੰ ਉਹਨਾਂ ਵਿਚਕਾਰ ਖਾਲੀ ਥਾਂ ਦੇ ਨਾਲ ਜੋੜਦਾ ਹੈ ਅਤੇ ਉਹਨਾਂ ਦਾ ਨਤੀਜਾ ਵਾਪਸ ਕਰਦਾ ਹੈ। ਮੰਨ ਲਓ ਕਿ Z11057 ਉਸ ਕਾਰਜ਼ ਦਾ ZID ਏ। </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The implementation is defined using the ZID of the function. So are the arguments of the function. So in the case of the function Z30000 with its two arguments, the function template should look like this: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> As we described before, we know that the arguments (<code>Z30000K1</code> and <code>Z30000K2</code>) are Strings, so we can treat them as simply as we use native strings in Python. Also, the function should return a String. For our example, we simply return the two arguments concatenated with a space in between: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Since this is Python, do not forget to indent this line. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If you have followed our advice to [[#Practice Test-Driven Development|practice TDD]], you will already have a set of tests that you know should work. If that's the case, while building your implementation you can click on the circular arrow in the Tests panel, and see if your implementation passes all of them. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Remember that the runtime has no state. Don’t assume values for global or static variables. If you have further questions about what you can and cannot do in Python, ask on [[Wikifunctions:Python implementations]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Code in JavaScript === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section, we give a concrete example on how to create an implementation in the form of Code in JavaScript. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is <code>Z30000</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The implementation is defined using the ZID of the function. So are the arguments of the function. So in the case of the function <code>Z30000</code> with its two arguments, the function template should look like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> We know that the arguments (<code>Z30000K1</code> and <code>Z30000K2</code>) are Strings, so we can treat them as native strings in JavaScript. Also, the function should return a String. To complete our function, you can then add a line concatenating the input strings, like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> If you have tests as recommended in the [[#Practice Test-Driven Development|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes all of them. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Remember that the runtime has no state. Don’t assume values for global or static variables. If you have further questions about what you can and cannot do in JavaScript, ask on [[Wikifunctions:JavaScript implementations]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Calling another Wikifunctions function === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> A code implementation can call certain other Wikifunctions functions, receive the output of the call, and use that output in further processing. We refer to such calls as callbacks. At present, due to security and performance concerns, only the following built-in Wikidata fetch and search functions can be called in this way: {{Z|Z6820}}, {{Z|Z6821}}, {{Z|Z6822}}, {{Z|Z6824}}, {{Z|Z6825}}, {{Z|Z6826}}, {{Z|Z6830}}, and {{Z|Z6831}}. This capability is in an initial stage of deployment; we hope to allow calls to a broader range of functions in the future. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Let’s look at a JavaScript implementation containing a callback. This implementation fetches an item from Wikidata, extracts the label of that item in a given language, and returns the label string. The item to fetch is given by argument <code>Z400K1</code>, and the language is given by <code>Z400K2</code>. </div> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const item = Wikifunctions.Call('Z6821', Z400K1); for (const label of item.Z6001K2.Z12K1) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> A callback is made by calling <code>Wikifunctions.Call</code>, as shown in the example. The first argument to <code>Wikifunctions.Call</code> is always the ZID of the function to be called – in this case, {{Z|Z6821}}, which takes a single argument. Following that, the arguments to be passed to that function are listed, separated by commas. Here, that argument, <code>Z400K1</code>, is the same value that was passed to the function <code>Z400</code>. This is a common pattern of argument passing to callbacks, but their arguments can also be built using the <code>ZObject</code> constructor (as explained above), or obtained in other ways. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The value of <code>Z400K1</code> would be an instance of {{Z|Z6091}}, containing the QID of the item to be fetched. Line 2 of the example calls <code>Z6821</code> to fetch that item from Wikidata and assigns the resulting ZObject to the const <code>item</code>. The remaining code iterates over the item’s labels until it finds the one matching the language given by <code>Z400K2</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For the first example above, we have used <code>Z6821</code> for simplicity. However - unless an entire entity is needed by the implementation, it is strongly recommended to use <code>Z6820</code> to retrieve Wikidata items, which can be quite large. Although a call to <code>Z6820</code> is a bit more complex, its parameters allow for fetching selected portions of a Wikidata item, which can greatly improve performance and avoid some errors, by reducing the network bandwidth and processing time that are needed. (<code>Z6820</code> can also be used in place of <code>Z6822</code>, <code>Z6824</code>, <code>Z6825</code>, and <code>Z6826</code>, to get similar bandwidth-reduction benefits.) </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Just below we show how <code>Z6820</code> can be used, in <code>Wikifunctions.Call</code>, to implement the same behavior as above. Note that we use the second argument passed to <code>Z6820</code>, <code>[labelsPart]</code>, to say “Just return the item’s labels”, and we use the third argument, <code>[Z400K2]</code>, to say “Just return labels in the given language”. (This argument would also apply to aliases and descriptions, if they were included in the result.) </div> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const labelsPart = new ZObject( new Map( [ ['Z6030K1', new ZReference('Z6033')] ] ), {Z1K1: 'Z9', Z9K1: 'Z6030'} ); const entities = Wikifunctions.Call( 'Z6820', [Z400K1], [labelsPart], [Z400K2], []); const item = entities.get(Z400K1.Z6091K1); const labels = item.Z6001K2.Z12K1; for (const label of labels) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Other things to note: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Even though code implementations are now able to fetch Wikidata entities, it is recommended that they not be written to return ''entire'' entities. This is because of current limitations on the size of the value returned from a code implementation. To fetch and return an entire large entity, it’s better to call the fetch function from a composition.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Only one callback can execute at a time. For security reasons, it is not possible to use the concurrency features of JavaScript or Python to execute multiple callbacks in parallel.</span> ** <span lang="en" dir="ltr" class="mw-content-ltr">Keep in mind, however, that you can fetch multiple entities at once using Z6820.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">There is currently a 3 MiB limit on the size of Wikidata content that can be returned to a code implementation, by a single callback. The same limit applies to the size of the result returned from a code implementation.</span> <span id="Compositions"></span> <div class="mw-translate-fuzzy"> == ਬਣਤਰ == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section, we give a concrete example on how to create an implementation in the form of a composition. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is <code>Z30000</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> It is usually a good idea to first think about how to combine existing functions in order to create the desired output. Sometimes this might be trivial, and you can just go ahead with composing functions, but in many cases it is worthwhile to note the desired composition down. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, for the given Function, we could use the existing Function {{Z|Z10000}}. That Function takes two strings and makes one string out of them. But we need to add a space in between. So we first concatenate a space to the end of the first string, and then concatenate the second string to the result of that first concatenation. So our composition could be noted down like this: </div> <syntaxhighlight lang="prolog"> join_strings( join_strings( Z30000K1, " " ), Z30000K2 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> There are multiple ways to write a composition: notice that the same thing could be accomplished with: </div> <syntaxhighlight lang="prolog"> join_strings( Z30000K1, join_strings( " ", Z30000K2 ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> An alternative implementation could also use the existing Function {{Z|Z15175}}, so your composition could be: </div> <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> As you can see, there are multiple ways to accomplish this, so take your time and explore the existing functions available in the {{ll|Wikifunctions:Catalogue}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's try to create the second example, <code>join_strings(Z30000K1, join_strings(" ", Z30000K2))</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In order to create this: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›" icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search for the name of the outermost function you want to use, which in this example is "join two strings". Then, select the wanted function from the dropdown list.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">You will see two new fields, one for each of the arguments needed for the selected function.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">For the first argument, we want to select the first input to our function:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and select "Argument reference".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id" you can now select the first string of your function from the dropdown, which contains all available inputs.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">For the second argument, we want to use the result of another call to "join two strings":</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and select "Function call".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function you want to call, which is again "join two strings".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For this inner function call, configure the "first string" by simply typing a white space in the text field, and configure the "second string" as you did for step 6: change it using the "…" button to "Argument reference", and then select the second argument in the dropdown.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Your composition is now complete! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You can expand and collapse the details using the chevron buttons to see how it looks. If you already have Tests as recommended in the [[#Practice Test-Driven Development|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes the tests. Once your composition passes the tests, go ahead and publish it. </div> [[File:Composition implementation expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its expanded view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its expanded view</span>]] [[File:Composition implementation collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its collapsed view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its collapsed view</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions error handling == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As a Wikifunctions function creator, you might want to warn the user calling your function when something goes wrong in the code, or when their inputs do not fit a certain criteria. For example, if your Function expects a string input to contain a name, you might want to check that the name is not empty and, if it is, show an error message that the person using your Function can understand. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For this purpose, you can use <code>Wikifunctions.Error()</code> from your code implementations or the function {{Z|Z851}} from your compositions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section you will learn: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">How to throw errors from both code and composition implementations,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to write tests for error cases, and</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to catch and handle errors thrown by functions that you are using in your compositions.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Throwing errors from code implementations === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> When writing code, both from JavaScript and Python, you can use <code>Wikifunctions.Error()</code> to end the execution with a wanted error. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> <code>Wikifunctions.Error()</code> has two parameters: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Error type: a string containing the ZID of the error type you want to return.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Error arguments: a list of string arguments to build the error.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's go one by one: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Error type ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> An error type is an object that describes a kind of error that could happen in the system. There are a number of built-in error types but you can also build other error types that are more suited to your use case. When using errors, the best idea is to browse through the available error types, which can be explored in [[Special:ListObjectsByType/Z50|this list]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If there are no errors that fit your case, create a new one by going to the create page, and selecting "Error type" in the type selector. Then, set the necessary fields: </div> [[File:Error type.png|thumb|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Error type creation in Wikifunctions</span>|<span lang="en" dir="ltr" class="mw-content-ltr">To create new Error type (Z50), edit the label and add the necessary keys.</span>]] * <span lang="en" dir="ltr" class="mw-content-ltr">'''Label''' – This is the main title of the error, which should contain a short but descriptive message. Set the error label on the right-side box titled "About".</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Keys''' – Keys contain additional information about what caused the error. For example, if an input had the wrong format, you might want to inform the user of what was the input content when raising the error. To use them in your implementations, keys should be strings. To create a key, click on the "[+]" icon below "keys", select "String" under "value type", and add a label that describes it appropriately, for example "current input". Once you have all the necessary keys, you can Publish your error type and keep the ID of the newly created object.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error message''' – Error types can contain a multilingual array of HTML parametrized error messages. The parameter notation is $1, $2, etc., where the digit corresponds to the error type key. For example, when creating an error type with one string key "current input", the error message can use the positional parameter "$1", which will be replaced with the value of the "current input" key at the time of rendering the error. To add HTML messages, click on the "[+]" icon below "html fragments", select a language and input the HTML string.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Error arguments ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Error arguments correspond to the keys of the Error type, and they should provide additional information to understand the error. Error arguments should always be Strings. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Wikifunctions.Error() ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say that you want an error to be thrown when either your first or your second input are empty. You have already created the error type, and the assigned ZID was <code>Z30005</code>. Your error type has two string keys: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Input key: contains the key of the failing input</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Input value: contains the current value of the failing input</span> <div lang="en" dir="ltr" class="mw-content-ltr"> To raise an error in your JavaScript implementation you should do something like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { // If the first input is empty, raise error Z30005 // with two string args: [ first input key, first input value ] Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { // If the second input is empty, raise error Z30005 // with two string args: [ second input key, second input value ] Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> To raise an error in your Python implementation you should do something like this: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": # If the first input is empty, raise error Z30005 # with two string args: [ first input key, first input value ] Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": # If the second input is empty, raise error Z30005 # with two string args: [ first input key, first input value ] Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Remember that calling <code>Wikifunctions.Error()</code> ends the execution! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Throwing errors from compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If you are creating a composition implementation, you can throw an error by calling the special function {{Z|Z851}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Throw Error function (Z851) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z851}} function is similar to the <code>Wikifunctions.Error()</code> method and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – A reference to the Error type you want to raise</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error parameters''' – A list with the arguments to create your Error, which should also be Strings.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Throw Error ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say you want to modify your composition so that it first checks that the arguments are not empty, and raises an error when it finds an empty one. Then, if none of them are empty, it runs the original composition, which is: </div> <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> To do this, you need to create conditional paths, for which you can use the {{Z|Z802}} function. Think of it like this: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the first argument is empty, throw an error for the first argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Else, proceed to check the second argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the second argument is empty, throw an error for the second argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Else, proceed with the success path and return the joint strings with the space separator</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Or in functional pseudo code: </div> <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), throw_error( Z30005, [ "Z30000K1", Z30000K1 ] ), if( is_empty_string( Z30000K2 ), throw_error( Z30005, [ "Z30000K2", Z30000K2 ] ), join_with_separator( Z30000K1, Z30000K2, " " ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's create this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+” button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›” icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the outermost function you want to use, which in this case is "if".</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Check the validity of the first argument:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "condition", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "is empty string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "input", click on the "…" button and select "argument reference"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id", select the first input (e.g. "first string")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse the "condition" function call if you want, by clicking on the down-chevron next to "condition". You should see something like "f(x) is empty string( → first string )"</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Throw error if the condition is true:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "then", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Throw Error"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error type", search and select your error type (you can directly input the error ID if you know it, e.g. Z30005)</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error parameters", add two items by clicking on the "+" button</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For "Item 1" (offending argument key), set its type to "String" and write the argument identifier (e.g. "first input", or "Z30000K1")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For "Item 2" (offending argument value), click on the "…" next to "Item 2" and select "argument reference"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id", select the first input (e.g. "first string")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse the "then" function call if you want, by clicking on the down-chevron next to "then". You should see something like "f(x) Throw Error( Input was the wrong format, Typed list( Object, "first input", → first string ) )"</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Continue to check the second argument if the first was good:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "else", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "if"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Set up "condition" to check the validity of the second argument by following the same process as described in step 5.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Set up "then" to throw an error for the second argument by following the same process as described in step 6.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Finally, set up the success path:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to the nested "else", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the successful function, which in this case can be "join strings with separator"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and set it to "argument reference", then select "first string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and set it to "argument reference", then select "second string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "separator" add a space into the text field</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The resulting function call should look like this: </div> [[File:Throw error expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function</span>]] [[File:Throw error collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function, in its collapsed view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function, in its collapsed view</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Handling errors in compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> While it is useful to allow functions to raise expected errors, it is crucial to be able to handle errors in your compositions in order to safely use these functions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say you want to create a new function "full name of a person" – we will refer to it with the ZID <code>Z30010</code>. This function should return the full name of a person given a first and last names, but if any of the two fields are empty, it should return the text "Unknown" instead. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You could create a composition using our example function "Join two strings with a space" or <code>Z30000</code> to generate the name. If any of the inputs are empty, you know that <code>Z30000</code> will throw an error of type <code>Z30005</code>. Using the function {{Z|Z850}} as a wrapper, you can attempt the join operation and intercept a possible error to simply return "Unknown" whenever it occurs. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Try-Catch function (Z850) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z850}} function is built-in with ZID <code>Z850</code> and takes three arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – The initial function call to run. If nothing goes wrong, the response will be the result of this function call.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – An error type to catch in case it is thrown during the execution of the first function call.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error handler''' – A function call that will be run in case the error specified above is caught during the execution of the initial function call. If that happens, the result of the error handler will be the value returned.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Try-Catch ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Once we have all the functions for our composition, we can craft it like this: </div> <syntaxhighlight lang="prolog"> try_catch( join_with_space( Z30010K1, Z30010K2 ), Z30005, echo( "Unknown" ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This means that: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">The "Join two strings with a space" function will be tried with the two inputs and, if everything goes well, the output of this function will be returned</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If any of the inputs are blank, "Join two strings with a space" with raise an error of type <code>Z30005</code></span> * <span lang="en" dir="ltr" class="mw-content-ltr">Our {{Z|Z850}} will then detect this error and run the {{Z|Z801}} function to return "Unknown"</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's create this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›” icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the outermost function you want to use, which in this case is "Try-Catch".</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Set the main function call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under the field where the "Try-Catch" function is selected, next to the "function call" key, click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the function "join two strings with space"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and select "argument reference", then select the "first name" argument from the dropdown.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and select "argument reference", then select the "second name" argument from the dropdown.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Select the error to catch:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error type", search and select "bad string input" – you can search directly by its ZID <code>Z30005</code></span> # <span lang="en" dir="ltr" class="mw-content-ltr">Set the error handler function call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "error handler", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "echo"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "input" and "type", search and select the type "String"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now, under "input", type "Unknown" in the text field</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The resulting function should look like this: </div> [[File:Try catch expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in expanded mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in expanded mode</span>]] [[File:Try catch collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in collapsed mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in collapsed mode</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Testing your failure use cases === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As we introduced in the above section about [[#Practice Test-Driven Development|practicing TDD]], it's important to test not only the most common paths, but also the possible edge cases. It is equally important to test failure behavior. In this section we will give you the tools necessary to test that your function fails with a given set of inputs, and that the error thrown is the expected one. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> To do that, you will need other two system functions: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Is error type (Z852) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z852}} function is built-in with ZID <code>Z852</code> and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error''' – An {{Z|Z5}} object, which can be thrown by a failing call. An error instance has a type and a value.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – A reference to an {{Z|Z50}} which will be compared to the type of the Error passed as a first argument. If that's the case, the function will return true.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Get error thrown by function call (Z853) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z853}} function is built-in with ZID <code>Z853</code> and takes one argument: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – A function call which can either return a successful value of any type, or throw an error.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> This function returns a {{Z|Z882}} with a {{Z|Z40}} in first place and an {{Z|Z1}} in the second: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the Function call runs successfully and hence does not throw any error, the returned pair will contain False in the first place, and void in the second.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the Function call throws an error, the returned pair will contain True in the first place, and the caught error in the second.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> To use this function in your compositions, you might need to use the additional functions: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">{{Z|Z821}}, and</span> * {{Z|Z822}} <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Testing errors ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say our target function, "Join two strings with a space" or <code>Z30000</code>, throws an error of type <code>Z30005</code> and we want to test this behavior. To do that we need to: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Throw a failing function call</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Get the error using the function {{Z|Z853}}</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Check that the error is the right type with {{Z|Z852}}</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Tests have two fields: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Call''' – A function call that will produce an output with the inputs you want to test. This call will return a value.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Result validation''' – A function call that will validate that the value returned by the call above is the expected one. The first argument of this function call will be automatically assigned to take the return value of the first call.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> For step-by-step instructions on how to create tests, see {{ll|Wikifunctions:Introduction#Create_tests}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In our example, we can structure it like this — but this is not the only way! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The call, which will return an {{Z|Z5}} object: </div> <syntaxhighlight lang="prolog"> error = get_second_element_of_typed_list( get_error_thrown_by( join_strings_by_whitespace( "", "not empty" ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> And the result validation, which will take the {{Z|Z5}} object as its first argument: </div> <syntaxhighlight lang="prolog"> is_error_type( error, Z30005 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's do this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding a test by clicking on the "+" button in the "Tests" table from your Function page. The "call" and "result validation" fields already have some functions pre-set, but to test the errors we will need to change them.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">First, let's set the call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "call", click the "›" chevron button to expand the function call.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", edit the field and search and select the function "Get second element of a typed pair"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Once selected, next to "Typed pair", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Get error thrown by function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "function call", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Join two strings with a space" (or by ZID <code>Z30000</code>)</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now set the inputs so that they cause a failure: at least one of them should be empty.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse your "call" by clicking again on the down-chevron button if you want!</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Next, let's set the result validation:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "result validation", click the "›" chevron button to expand the function call.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", edit the field and search and select the function "Is error type"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now you will only be asked to configure the second argument. Under "error type", search and select your <code>Z30005</code> error type.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">And you are done! You can now click the circular arrow in the "Implementations" box and you should see green checks.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> If everything went right, you can now save your test. It should look like this: </div> [[File:Get error expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in expanded mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in expanded mode</span>]] [[File:Get error collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in collapsed mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in collapsed mode</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Creating actionable error messages === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As described above, Error Types have an optional key <code>Z50K3</code> which contains a multilingual list of HTML strings. When rendering information about an error, the messages stored in the error type can help create a clear, precise, informative, translatable and actionable error message. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For that purpose, error messages can contain parameters like <code>$1</code>, <code>$2</code>, etc., where the digit corresponds to the error type argument and its value in the error instance. These error messages are rendered in Wikifunctions inside the "Details" dialog window after executing a function call. Additionally, these error messages are surfaced in other client interfaces, like Abstract Wikipedia, to provide better guidance to Abstract Content editors. </div> [[File:Wikifunctions actionable error message example in the Details dialog.png|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">The error message is rendered using the HTML message of the error type and the error argument values.</span>]] [[File:Wikifunctions actionable error message example in Abstract Wikipedia.png|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">When available, the HTML error message is rendered in the Abstract Wikipedia preview section.</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> Let's use a real example to understand the benefits of HTML error messages: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The function {{Z|Z37847}} returns the first Lexeme reference given a Wikidata Item reference and a language. When there is no Lexeme for this Item-Language combination, it throws an error of type {{Z|Z28248}}, which has three keys: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K1''' is the input Wikidata item QID</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K2''' is the connecting property, in this case <code>P5137/item for this sense</code></span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K3''' is the language code</span> <div lang="en" dir="ltr" class="mw-content-ltr"> When calling this function for a Wikidata lexeme that doesn't exist, the call will throw an error instance like this: </div> <syntaxhighlight lang="json" highlight="10,12"> { "Z1K1": "Z5", "Z5K1": "Z28248", "Z5K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z885", "Z885K1": "Z28248" }, "Z28248K1": "Q319", "Z28248K2": "P5137", "Z28248K3": "ast" } } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> While the error type label indicates: <code>No matching lexeme for item in language</code>, a better error message should indicate: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">which is the failing item,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">which is the language missing, and</span> * <span lang="en" dir="ltr" class="mw-content-ltr">what are the possible ways to fix it.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The error message <code>Z50K3</code> field can provide this functionality. Whenever an Error Type has an error message for the user language (or any of its fallbacks), the error message shown will be rendered by: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">First, replacing the message parameters with the values of the keys. In our example, any <code>$1</code> will be replaced with the value of <code>Z28248K1</code> ("Q319"), <code>$2</code> with "P5137", and <code>$3</code> with "ast",</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Last, sanitizing and rendering the HTML message.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> So a HTML message like: </div> <syntaxhighlight lang="html"> There is no matching lexeme for the item $1 in "$3".<br> <a href="http://wikidata.org/wiki/$1">Edit in Wikidata</a> </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Will become: </div> : There is no matching lexeme for the item Q319 in "ast" : [[d:Q319|Edit in Wikidata]] <div lang="en" dir="ltr" class="mw-content-ltr"> == Debugging your implementations == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Sometimes things can go wrong. A function might behave differently than expected or a value might not look quite right. Sometimes implementations are really complex and, because they are run in a sandboxed environment, it can seem really difficult to debug. To help understand what's going on inside a function call, Wikifunctions includes a small set of debugging tools. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> These tools don't change the result of a function, but will add extra information to the returned metadata, which you can observe after running the function. You can use <code>Wikifunctions.Debug()</code> from your code implementations or the function {{Z|Z854}} from your compositions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section you will learn: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">How to add debug messages from both code and composition implementations,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to inspect the metadata manually or via the UI to inspect these logs.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Debugging your code implementations === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> When writing code, both from JavaScript and Python3, you can use <code>Wikifunctions.Debug()</code> to add a message to your debugging log and continue the execution. </div> {{phab|T441028}} <div lang="en" dir="ltr" class="mw-content-ltr"> <code>Wikifunctions.Debug()</code> has one parameter, which is generally expected to be a string. However, any other object passed as parameter will get directly converted into a string. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If we want to add debug logs to our code implementations for our "Join two strings with a space" example function, we can do, in JavaScript: </div> <syntaxhighlight lang="JavaScript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { Wikifunctions.Debug( `first input is empty "${ Z30000K1 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { Wikifunctions.Debug( `second input is empty "${ Z30000K2 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } Wikifunctions.Debug( "both inputs are fine" ); return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> And the same in your Python3 implementation will be: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": Wikifunctions.Debug( 'first input is empty "'+Z30000K1+'"' ) Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": Wikifunctions.Debug( 'second input is empty "'+Z30000K2+'"' ) Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) Wikifunctions.Debug( 'both inputs are fine' ) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This way, no matter what happens, we will be adding one message to your debugging logs: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the function call fails when checking on the first or second input, the result of the execution will be a failure, but it will contain one informative log about what branch caused the failure.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the function call succeeds—because both inputs are valid—the function call will return the joined string, but the returned metadata will also contain a debug log.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Debugging your compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> To support debugging compositions, Wikifunctions provides the built-in function {{Z|Z854}}. This function allows you to attach debug messages to the execution of any function call that generates the final output. The debug logs collected during the evaluation are returned as part of the execution metadata, under the <code>executorDebugLogs</code> key. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Add debug log to function call (Z854) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z854}} function is built-in with ZID <code>Z854</code> and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – Any composition you want to execute.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Debug log''' – A string message that will be recorded if the given function call is evaluated.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> When the wrapped function call runs, the provided message is added to the execution logs. If that function call is not executed, or its execution is not part of the final output, its debug log will not appear in the final result metadata. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You will benefit from this built-in if you want to observe: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Which branch of a conditional was executed, or</span> * <span lang="en" dir="ltr" class="mw-content-ltr">the order of evaluation in a composition.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Add debug log to function call ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say that you want to add debug logs to our example function "Join two strings with a space" or <code>Z30000</code>, so that different messages are added to the different possible outcomes. You could use our debugging builtin like this: </div> <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), add_debug_log( throw_error( Z30005, ... ), 'failed on first input' ) if( is_empty_string( Z30000K2 ), add_debug_log( throw_error( Z30005, ... ), 'failed on second input' ), add_debug_log( join_with_separator( Z30000K1, Z30000K2, " " ), 'both inputs are ok!' ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This way, </div> * <span lang="en" dir="ltr" class="mw-content-ltr">when called with an empty first input, the function will return a failed response, and the metadata will contain an <code>executorDebugLogs</code> entry with the "failed on first input" log.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">When called with an empty second input, the call will also fail, but the logged message will be "failed on second input"</span> * <span lang="en" dir="ltr" class="mw-content-ltr">When called with valid inputs, the function will return a successful response, and additionally the metadata will contain "both inputs are ok" in its <code>executorDebugLogs</code> key.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> This is the way this composition would look: </div> [[File:Add debug log expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Composition implementation using Add debug logs to log all possible execution paths</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Composition implementation using Add debug logs to log all possible execution paths</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Accessing execution debug logs === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Whether your execution logs are added via <code>Wikifunctions.Debug()</code> or via the {{Z|Z854}} built-in function, they are returned as part of the response metadata. To see the logs, once you run your function, click on the "Details" button that appears at the bottom of the "Result" section. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The error and debug information will appear at the top of the "Details" dialog. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> This is what you would see when running the composition from our previous example with valid and invalid inputs: </div> {| class="wikitable" | [[File:Execution logs success.png|frameless|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a successful execution with debug logs</span>]] | [[File:Execution logs failure.png|frameless|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a failed execution with debug logs</span>]] |- | <span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a successful execution: shows no errors, but displays the successful execution log: ''"both inputs are ok!"''</span> | <span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a failed execution: shows the error information, and the additional execution log for the first failure branch: ''"failed on first input"''</span> |} [[Category:How to create implementations| {{#translation:}}]] bt7k2i68dp05b3ek1envakvdx6tpj21 Wikifunctions:What Wikifunctions is not/pa 4 53541 331066 190630 2026-10-23T08:06:08Z FuzzyBot 207 Updating to match new version of source page 331066 wikitext text/x-wiki <languages/> {{shortcut|[[WF:NOT]]}} {{Draft}} <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions is a new kind of website, aiming for a new community. We very much hope to work together with many tools, sites, communities, and kinds of systems that are out there: we want to play together with IDEs, with cloud computing platforms, with app development sites, and many more. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> But we also aim to be a novel thing and we hope to shape a new unique space out for us: a Wikimedia project for everyone to collaboratively create and maintain a library of code functions to support the Wikimedia projects and beyond, for everyone to call and re-use in the world's natural and programming languages. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The scope of the project is within bounds, though. So, let us also explore '''what Wikifunctions is not'''. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not an encyclopædia of algorithms == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> This means that we will '''not''' concentrate on having pages for famous and not-so famous algorithms such as [[w:Euclidean algorithm|Euclid's]], [[w:Newton's method|Newton's]], or [[w:Dijkstra's algorithm|Dijkstra's algorithm]], aiming to represent all existing algorithms faithfully and in their historical context. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Yes, we expect to have a function for the [[w:Greatest common divisor|greatest common divisor]] (GCD) of two integers. And there might be one or more implementations which are based on Euclid's algorithm to calculate the GCD. But Wikifunctions' main goal is not to gather algorithms, and it would not be incomplete if it didn't include some, and used alternatives instead to compute the GCD. If you are looking for that, many Wikipedias are actually [[w:List of algorithms|great resources]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Unlike an encyclopedic overview of existing algorithms, Wikifunctions will also invite original work. We will not be restricted to functions that have been published elsewhere first, and we do not require for every function and implementation to be based on previously published work. Wikifunctions, much like Wikibooks and very unlike Wikipedia, will be open to novel contributions. The main criteria for implementations will be: under which conditions can we run a given implementation, and what resources is it expected to take? </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not an app development site == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We do not expect to make it possible to create full-fledged, stand-alone apps within Wikifunctions — there will be no place to store state, we don't aim to allow calling external APIs or directly cause changes to other sites, and we don't aim to package up apps with icons and UX, etc. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We absolutely expect Wikifunctions to be a very useful resource for app developers, and can very much imagine apps that are basically wrappers around one or more functions from Wikifunctions, but these would still need code and other assets which wouldn't be part of Wikifunctions. We are not competing in the area of no-code or low-code development sites. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a code hosting service == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions will host code — but not for whole projects, merely for individual functions. There won't be libraries, apps, or services developed on Wikifunctions with bug-trackers, forums, etc. There won't be a Web-based version control system such as ''Mercurial'' or ''Git'' running against Wikifunctions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Again, we hope that there will be libraries, apps, and services that will rely on functions available in Wikifunctions, but they would be developed on a different site, such as ''Gerrit'', ''GitHub'', or ''GitLab''. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a programming language, nor is trying to evangelise a particular language == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions will allow for functions to be implemented in a multitude of programming languages. The possibility to compose functions together to create higher level functions may look a little bit like a new programming language, but it will be extremely limited compared to most other programming languages, since we only allow for nested function calls and that's it. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not an Integrated Development Environment (IDE) == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We won't provide you with an interface for creating and developing software projects, interfacing with build, testing, and source control systems. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a question-and-answer website == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We are not competing with ''Stack Overflow'' and similar websites, where a developer would ask how to achieve a certain task and have community members discuss and answer the question. We won't contain code snippets to help answer the question, but we will organize code within our website to enable the evaluation of functions within a library of functions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a cloud computing platform == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We do not provide computing resources and access to services and APIs so that you can run your computational needs on our platform, either for money or for free. Use of Wikifunctions's evaluation platform is to improve access to knowledge for everyone. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a code snippet website == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We are not competing with code snippet sites such as GitHub Gists, [[w:Rosetta_Code|Rosetta Code]], [https://esolangs.org/ esolangs.org], or [http://helloworldcollection.de/ helloworldcollection.de]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions differs in that it allows running code and composing existing functions together to create new ones. As well, Wikifunctions is for useful and meaningful code, not temporary, arbitrary snippets that other platforms may accept. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a code education platform == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We are not focused on teaching people how to code, the material in Wikifunctions will not be laid out in a pedagogical order, and we also won't make sure to comprehensively cover all topics important for coding. In fact, we aim for Wikifunctions to be usable for people who don't know how to code and who don't need to learn how to code to use most of Wikifunctions effectively. Though the Wikifunctions community may well help each other in sharing best practices, style guides, and tips on how to use the site in different languages, these will be aimed at the purpose of serving the world's knowledge. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not (only) the boiler room for Abstract Wikipedia == </div> [[File:Mechanical_room_in_basement._Wayne_N._Aspinall_Federal_Building_and_U.S._Courthouse,_Grand_Junction,_Colorado_LCCN2014650034.tif|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">A '[[d:Q6804549|boiler room]]', where unsightly-but-vital machinery is hidden</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> Natural language generation (NLG) is the focus of {{SITENAME}} as of 2026, and the site began as part of the wider [[meta:Special:MyLanguage/Abstract_Wikipedia|Abstract Wikipedia project]], but NLG is far from the only field in which functions are being developed. That is to say, WF is necessary for AW, but AW is not necessary for WF. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> On top of the computer science staples of Boolean logic, arithmetic, and list manipulation, we have useful functions relating to disciplines such as [[Z16718|chemistry]], [[Z35550|dimensional analysis]], [[Z20074|electrical engineering]], [[Z22162|genomics]], [[Z10393|information theory]], [[Z26830|meteorology]], [[Z13955|number theory]], [[Z27919|physiology]], [[Z20094|probability]], [[Z24497|quantum mechanics]], [[Z14226|railroad engineering]], [[Z28600|timekeeping/chronometry]], and [[Z26841|trigonometry]]. </div> [[Category:Project concept{{#translation:}}]] 2smnim7o7mo0nxlwhsyst4ch1dm8174 Wikifunctions:What Wikifunctions is not/zh-hans 4 58787 331073 193812 2026-10-23T08:06:10Z FuzzyBot 207 Updating to match new version of source page 331073 wikitext text/x-wiki <languages/> {{shortcut|[[WF:NOT]]}} {{Draft}} Wikifunctions是一种新的网站,旨在建立一个新的社群。我们非常希望与现有的许多工具、网站、社群、和各种系统合作:我们希望与IDE、云计算平台、应用开发网站等等合作。 但我们也致力于成为一个新事物,我们希望为我们塑造一个新的独特空间:一个维基媒体项目,让每个人协作创建和维护一个代码函数库来支持维基媒体项目及其他项目,供每个人以世界上的自然语言和编程语言调用和重覆使用。 不过,這個計畫的範圍還是有邊界的。所以,我們也就來探索一下'''Wikifunctions不是什麼'''。 <span id="Wikifunctions_is_not_an_encyclopædia_of_algorithms"></span> == Wikifunctions不是算法百科全书 == 这意味着我们将'''不会'''花精力为著名和不太著名的算法创建页面,例如[[w:zh:欧几里得算法|欧几里得算法]]、[[w:zg:牛顿法|牛顿法]]或[[w:zh:戴克斯特拉算法|戴克斯特拉算法]],也不会以忠實地呈現所有現有演算法及其歷史背景为目标。 是的,我们期望有个函数用来计算两个整数的[[w:zh:最大公约数|最大公约数]],并且可能有几种基于欧几里得算法来计算最大公约数的实现。但是维基函数的主要目標不是收集演算法,就算它不收录某些演算法,而使用其他方法來計算,也不会使之不完整。若您想要收集演算法,許多維基百科都是[[w:List of algorithms|很棒的资源]]。 Wikifunctions也將欢迎原創作品,而不是仅以百科全书的方式描述已有算法。我們不會局限於先前在别处發表過的函數,我們也不要求每個函數和实现都基於先前發表的作品。Wikifunctions與維基教科書非常相似,但與維基百科非常不同,它將对新穎的貢獻持开放态度。实现的主要標準是:在什麼情況下我們可以運行一個特定的实现、以及它預計需要多少資源? <span id="Wikifunctions_is_not_an_app_development_site"></span> == Wikifunctions不是应用開發網站 == 我們不期望能在Wikifunctions中建立完整、獨立的应用——這裡不会有用来儲存狀態的空间,我們既不打算允許调用外部API或直接对其他網站造成變更,也不打算將應用程式包裝成圖示和使用者体验等。 我們絕對期望Wikifunctions能成為对應用程式開發者非常有用的資源,而且我們可以想像将Wikifunctions中几个函数包裝而成的应用,但這些应用仍需要程式碼和其他資產,而這些都不会是Wikifunctions的一部份。我們无意在無程式碼或低程式碼開發網站的領域競爭。 <span id="Wikifunctions_is_not_a_code_hosting_service"></span> == Wikifunctions不是代碼託管服務 == <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions will host code — but not for whole projects, merely for individual functions. There won't be libraries, apps, or services developed on Wikifunctions with bug-trackers, forums, etc. There won't be a Web-based version control system such as ''Mercurial'' or ''Git'' running against Wikifunctions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Again, we hope that there will be libraries, apps, and services that will rely on functions available in Wikifunctions, but they would be developed on a different site, such as ''Gerrit'', ''GitHub'', or ''GitLab''. </div> <span id="Wikifunctions_is_not_a_programming_language,_nor_is_trying_to_evangelise_a_particular_language"></span> == Wikifunctions不是程式語言,也不致力于宣揚某種特定的語言 == <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions will allow for functions to be implemented in a multitude of programming languages. The possibility to compose functions together to create higher level functions may look a little bit like a new programming language, but it will be extremely limited compared to most other programming languages, since we only allow for nested function calls and that's it. </div> <span id="Wikifunctions_is_not_an_Integrated_Development_Environment_(IDE)"></span> == Wikifunctions不是IDE == <div lang="en" dir="ltr" class="mw-content-ltr"> We won't provide you with an interface for creating and developing software projects, interfacing with build, testing, and source control systems. </div> <span id="Wikifunctions_is_not_a_question-and-answer_website"></span> == Wikifunctions不是問答網站 == <div lang="en" dir="ltr" class="mw-content-ltr"> We are not competing with ''Stack Overflow'' and similar websites, where a developer would ask how to achieve a certain task and have community members discuss and answer the question. We won't contain code snippets to help answer the question, but we will organize code within our website to enable the evaluation of functions within a library of functions. </div> <span id="Wikifunctions_is_not_a_cloud_computing_platform"></span> == Wikifunctions不是云计算平台 == <div lang="en" dir="ltr" class="mw-content-ltr"> We do not provide computing resources and access to services and APIs so that you can run your computational needs on our platform, either for money or for free. Use of Wikifunctions's evaluation platform is to improve access to knowledge for everyone. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a code snippet website == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We are not competing with code snippet sites such as GitHub Gists, [[w:Rosetta_Code|Rosetta Code]], [https://esolangs.org/ esolangs.org], or [http://helloworldcollection.de/ helloworldcollection.de]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions differs in that it allows running code and composing existing functions together to create new ones. As well, Wikifunctions is for useful and meaningful code, not temporary, arbitrary snippets that other platforms may accept. </div> <span id="Wikifunctions_is_not_a_code_education_platform"></span> == Wikifunctions不是编程教学平台 == <div lang="en" dir="ltr" class="mw-content-ltr"> We are not focused on teaching people how to code, the material in Wikifunctions will not be laid out in a pedagogical order, and we also won't make sure to comprehensively cover all topics important for coding. In fact, we aim for Wikifunctions to be usable for people who don't know how to code and who don't need to learn how to code to use most of Wikifunctions effectively. Though the Wikifunctions community may well help each other in sharing best practices, style guides, and tips on how to use the site in different languages, these will be aimed at the purpose of serving the world's knowledge. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not (only) the boiler room for Abstract Wikipedia == </div> [[File:Mechanical_room_in_basement._Wayne_N._Aspinall_Federal_Building_and_U.S._Courthouse,_Grand_Junction,_Colorado_LCCN2014650034.tif|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">A '[[d:Q6804549|boiler room]]', where unsightly-but-vital machinery is hidden</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> Natural language generation (NLG) is the focus of {{SITENAME}} as of 2026, and the site began as part of the wider [[meta:Special:MyLanguage/Abstract_Wikipedia|Abstract Wikipedia project]], but NLG is far from the only field in which functions are being developed. That is to say, WF is necessary for AW, but AW is not necessary for WF. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> On top of the computer science staples of Boolean logic, arithmetic, and list manipulation, we have useful functions relating to disciplines such as [[Z16718|chemistry]], [[Z35550|dimensional analysis]], [[Z20074|electrical engineering]], [[Z22162|genomics]], [[Z10393|information theory]], [[Z26830|meteorology]], [[Z13955|number theory]], [[Z27919|physiology]], [[Z20094|probability]], [[Z24497|quantum mechanics]], [[Z14226|railroad engineering]], [[Z28600|timekeeping/chronometry]], and [[Z26841|trigonometry]]. </div> [[Category:Project concept{{#translation:}}]] mlobyzmubht674co78jykk8d0fj2eon Wikifunctions:What Wikifunctions is not/zh-hant 4 59559 331072 196468 2026-10-23T08:06:10Z FuzzyBot 207 Updating to match new version of source page 331072 wikitext text/x-wiki <languages/> {{shortcut|[[WF:NOT]]}} {{Draft}} <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions is a new kind of website, aiming for a new community. We very much hope to work together with many tools, sites, communities, and kinds of systems that are out there: we want to play together with IDEs, with cloud computing platforms, with app development sites, and many more. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> But we also aim to be a novel thing and we hope to shape a new unique space out for us: a Wikimedia project for everyone to collaboratively create and maintain a library of code functions to support the Wikimedia projects and beyond, for everyone to call and re-use in the world's natural and programming languages. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The scope of the project is within bounds, though. So, let us also explore '''what Wikifunctions is not'''. </div> <span id="Wikifunctions_is_not_an_encyclopædia_of_algorithms"></span> == 維基函式庫不是演算法百科全書 == <div lang="en" dir="ltr" class="mw-content-ltr"> This means that we will '''not''' concentrate on having pages for famous and not-so famous algorithms such as [[w:Euclidean algorithm|Euclid's]], [[w:Newton's method|Newton's]], or [[w:Dijkstra's algorithm|Dijkstra's algorithm]], aiming to represent all existing algorithms faithfully and in their historical context. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Yes, we expect to have a function for the [[w:Greatest common divisor|greatest common divisor]] (GCD) of two integers. And there might be one or more implementations which are based on Euclid's algorithm to calculate the GCD. But Wikifunctions' main goal is not to gather algorithms, and it would not be incomplete if it didn't include some, and used alternatives instead to compute the GCD. If you are looking for that, many Wikipedias are actually [[w:List of algorithms|great resources]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Unlike an encyclopedic overview of existing algorithms, Wikifunctions will also invite original work. We will not be restricted to functions that have been published elsewhere first, and we do not require for every function and implementation to be based on previously published work. Wikifunctions, much like Wikibooks and very unlike Wikipedia, will be open to novel contributions. The main criteria for implementations will be: under which conditions can we run a given implementation, and what resources is it expected to take? </div> <span id="Wikifunctions_is_not_an_app_development_site"></span> == 維基函式庫不是應用程式開發網站 == <div lang="en" dir="ltr" class="mw-content-ltr"> We do not expect to make it possible to create full-fledged, stand-alone apps within Wikifunctions — there will be no place to store state, we don't aim to allow calling external APIs or directly cause changes to other sites, and we don't aim to package up apps with icons and UX, etc. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We absolutely expect Wikifunctions to be a very useful resource for app developers, and can very much imagine apps that are basically wrappers around one or more functions from Wikifunctions, but these would still need code and other assets which wouldn't be part of Wikifunctions. We are not competing in the area of no-code or low-code development sites. </div> <span id="Wikifunctions_is_not_a_code_hosting_service"></span> == 維基函式庫不是程式碼託管服務 == <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions will host code — but not for whole projects, merely for individual functions. There won't be libraries, apps, or services developed on Wikifunctions with bug-trackers, forums, etc. There won't be a Web-based version control system such as ''Mercurial'' or ''Git'' running against Wikifunctions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Again, we hope that there will be libraries, apps, and services that will rely on functions available in Wikifunctions, but they would be developed on a different site, such as ''Gerrit'', ''GitHub'', or ''GitLab''. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a programming language, nor is trying to evangelise a particular language == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions will allow for functions to be implemented in a multitude of programming languages. The possibility to compose functions together to create higher level functions may look a little bit like a new programming language, but it will be extremely limited compared to most other programming languages, since we only allow for nested function calls and that's it. </div> <span id="Wikifunctions_is_not_an_Integrated_Development_Environment_(IDE)"></span> == 維基函式庫不是整合開發環境(IDE) == <div lang="en" dir="ltr" class="mw-content-ltr"> We won't provide you with an interface for creating and developing software projects, interfacing with build, testing, and source control systems. </div> <span id="Wikifunctions_is_not_a_question-and-answer_website"></span> == 維基函式庫不是問答網站 == <div lang="en" dir="ltr" class="mw-content-ltr"> We are not competing with ''Stack Overflow'' and similar websites, where a developer would ask how to achieve a certain task and have community members discuss and answer the question. We won't contain code snippets to help answer the question, but we will organize code within our website to enable the evaluation of functions within a library of functions. </div> <span id="Wikifunctions_is_not_a_cloud_computing_platform"></span> == 維基函式庫不是雲端運算平臺 == <div lang="en" dir="ltr" class="mw-content-ltr"> We do not provide computing resources and access to services and APIs so that you can run your computational needs on our platform, either for money or for free. Use of Wikifunctions's evaluation platform is to improve access to knowledge for everyone. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a code snippet website == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We are not competing with code snippet sites such as GitHub Gists, [[w:Rosetta_Code|Rosetta Code]], [https://esolangs.org/ esolangs.org], or [http://helloworldcollection.de/ helloworldcollection.de]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions differs in that it allows running code and composing existing functions together to create new ones. As well, Wikifunctions is for useful and meaningful code, not temporary, arbitrary snippets that other platforms may accept. </div> <span id="Wikifunctions_is_not_a_code_education_platform"></span> == 維基函式庫不是程式碼教育平臺 == <div lang="en" dir="ltr" class="mw-content-ltr"> We are not focused on teaching people how to code, the material in Wikifunctions will not be laid out in a pedagogical order, and we also won't make sure to comprehensively cover all topics important for coding. In fact, we aim for Wikifunctions to be usable for people who don't know how to code and who don't need to learn how to code to use most of Wikifunctions effectively. Though the Wikifunctions community may well help each other in sharing best practices, style guides, and tips on how to use the site in different languages, these will be aimed at the purpose of serving the world's knowledge. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not (only) the boiler room for Abstract Wikipedia == </div> [[File:Mechanical_room_in_basement._Wayne_N._Aspinall_Federal_Building_and_U.S._Courthouse,_Grand_Junction,_Colorado_LCCN2014650034.tif|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">A '[[d:Q6804549|boiler room]]', where unsightly-but-vital machinery is hidden</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> Natural language generation (NLG) is the focus of {{SITENAME}} as of 2026, and the site began as part of the wider [[meta:Special:MyLanguage/Abstract_Wikipedia|Abstract Wikipedia project]], but NLG is far from the only field in which functions are being developed. That is to say, WF is necessary for AW, but AW is not necessary for WF. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> On top of the computer science staples of Boolean logic, arithmetic, and list manipulation, we have useful functions relating to disciplines such as [[Z16718|chemistry]], [[Z35550|dimensional analysis]], [[Z20074|electrical engineering]], [[Z22162|genomics]], [[Z10393|information theory]], [[Z26830|meteorology]], [[Z13955|number theory]], [[Z27919|physiology]], [[Z20094|probability]], [[Z24497|quantum mechanics]], [[Z14226|railroad engineering]], [[Z28600|timekeeping/chronometry]], and [[Z26841|trigonometry]]. </div> [[Category:Project concept{{#translation:}}]] 0vsyk0wlat4vty1owmgmh9kcp7nwswz Wikifunctions:How to create implementations/zh-hans 4 60327 331127 296950 2026-10-23T08:23:32Z FuzzyBot 207 Updating to match new version of source page 331127 wikitext text/x-wiki <languages/> 本页面,超越了在{{ll|Wikifunctions:Introduction}}中的概述,提供了更加细节性的指导去创建函式的实现。 <div lang="en" dir="ltr" class="mw-content-ltr"> == Types of Implementations == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In Wikifunctions, an '''implementation''' can take one of two main forms: '''code''' or '''composition'''. A code implementation directly expresses the function’s logic in any of the available programming languages (currently, Python3 or JavaScript). It’s most useful when the function’s behavior can’t easily be built from existing Wikifunctions, or when precise control over data processing is needed. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> A composition implementation, on the other hand, defines the function entirely by combining other existing functions, without writing code. Compositions are easier to understand, reuse, and translate into other languages automatically, but they depend on suitable building blocks already being available and often are less performant. In general, start by checking whether your goal can be achieved through composition; if it can’t, or if performance or fine-grained logic matters, choose a code implementation instead. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> There's a third type of implementation: '''built-ins'''. These are run by system-built code, and are not editable. Most likely all pre-defined functions will have a built-in implementation. In such cases, when opening the implementation page, you will see a message stating ''"{{int|wikilambda-implementation-selector-none}}"'' </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Practice Test-Driven Development == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> '''Test-Driven Development''', or '''TDD''', is a way of creating software where you write tests before you write the actual code. Tests are just a way of understanding what your function is supposed to do by listing examples and how they should work. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In Wikifunctions, writing tests first offers significant benefits. If you are working on an implementation, you can run your code against the existing tests to check that it behaves as expected. This makes it easier to catch errors early before even publishing your implementation. Tests are also a powerful way to describe the function you need. By writing tests, '''you clearly communicate the expected behavior''', and the community can step in and help with the implementation, or create alternative implementations. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Imagine you want to implement a Function that combines two strings with a space in between. A basic test for this might look like: </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello", "world" ) => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Once you have defined the basic behavior, it's important to '''think about edge cases'''—situations where the inputs are such that you might need some special behavior. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, what if your first string ends in a space, or your second string starts with a space? Should the function keep all existing spaces and add another one, or should it return a neatly spaced result with just a single space between the words? Depending on your requirements, you should build a test for such a case. For example, a test for this edge case could be either one of these — but not both!: </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> or ... </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Make sure that all possible special cases are covered by your tests, and once you have them, make sure that they are all connected to the Function by selecting them and clicking "Connect". </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Code implementations == </div> [[File:Code implementation.png|thumb|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions code editor initialized with a function template</span>|<span lang="en" dir="ltr" class="mw-content-ltr">When adding a new code implementation, the function template is initialized with the function and argument names</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> When creating an implementation using code, the Wikifunctions UI will set up a code editor with the selected language activated for syntax highlighting and validation. When the function to implement and the programming language are selected, this editor will be set with the correct function template: '''do not remove or edit this'''! Keep your code inside this function signature: if you need auxiliary functions, you can simply declare them inside your top-level function declaration. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Using input types in your code === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions types {{Z|Z6}} and {{Z|Z40}} can be used as if they were native types in both JavaScript and Python3. For example, a String input can be concatenated or a Boolean be directly used in a logical expression. To use other types in your code implementations, you will have to look deeper into the type, figure out if it has a conversion to a native equivalent, and treat it accordingly. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, let's say we want to write some Python code that handles an input of type {{Z|Z20420}}. In the page for this type, let's look at its "type converters to code" and search for a Python one. The converter {{Z|Z20424}} will be applied to our date input before our code, so looking at "native type" we know that our input will be a Python ''dict'' and looking at the implementation we can see the keys we can expect: </div> <syntaxhighlight lang="python3"> return { 'K1': year, 'K2': month, 'K3': day } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> When a type doesn't have a converter, you'll have to access its parts directly using its keys. For example, let's assume that your function <code>Z30000</code> has one input <code>Z30000K1</code> of type {{Z|Z11}}. This type has two keys: <code>Z11K1</code> for the language (itself an object of type {{Z|Z60}}), and <code>Z11K2</code> for the string value. Similarly, the language object has a key <code>Z60K1</code> for the language code. So, to get a string with the language code and the text, you can write: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1 ) { // e.g. "en: some text" return Z30000K1.Z11K1.Z60K1 + ": " + Z30000K1.Z11K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> For a quick reference of the available type conversions visit [[Special:MyLanguage/Wikifunctions:Execution targets#Default type conversion|the default type conversion table]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Returning the right outputs === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Similarly to the way you treat inputs, outputs need to match the type specified in the function definition. Some can be treated as simply as native types, so any string output will be converted into a Wikifunctions {{Z|Z6}} object and any native boolean returned by your implementation will be converted into a Wikifunctions {{Z|Z40}} object. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Those types that have "type converters from code" will apply the appropriate function to the output, in order to build the required type. Following the example of {{Z|Z20420}}, the {{Z|Z20443}} will transform the output from your implementation–a dict with K1, K2 and K3 keys–into its correct ZObject representation. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For types that don't have converters from code, you can carefully build and return the output objects. For example, imagine that our function <code>Z30000</code> takes two string inputs: language code and text, and should return a {{Z|Z11}} object. You can do this in Python by using the <code>ZObject</code> constructor: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): lang_object = ZObject( {"Z1K1": "Z9", "Z9K1": "Z60"}, Z60K1 = Z30000K1 ) return ZObject( {"Z1K1": "Z9", "Z9K1": "Z11"}, Z11K1 = lang_object, Z11K2 = Z30000K2 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Or in JavaScript: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { const langObject = new ZObject( new Map( [ [ "Z60K1", Z30000K1 ] ] ), { "Z1K1": "Z9", "Z9K1": "Z60" } ); const monolingualKeys = new Map( [ [ "Z11K1", langObject ], [ "Z11K2", Z30000K2 ] ] ); return new ZObject( monolingualKeys, { "Z1K1": "Z9", "Z9K1": "Z11" } ); } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> You can learn more about the <code>ZObject</code> class and other useful constructors in {{ll|Wikifunctions:Execution_targets#Custom_and_non-built-in_type_conversion}} </div> {{phab|T392750}}<div lang="en" dir="ltr" class="mw-content-ltr"> As of 2026-05, trying to return a list of lists may fail, so you're not able to implement such functions in code. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Code in Python === </div> <div class="mw-translate-fuzzy"> 在本小節中,我们会有一个例子去说明如何用Python代码创建实现。我们要创建的函数的实现,它的输入数据包含两个字符串,返回的结果是将两个字符串中间加入一个空格。我們假設該函式的ZID是Z11057。 </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The implementation is defined using the ZID of the function. So are the arguments of the function. So in the case of the function Z30000 with its two arguments, the function template should look like this: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> As we described before, we know that the arguments (<code>Z30000K1</code> and <code>Z30000K2</code>) are Strings, so we can treat them as simply as we use native strings in Python. Also, the function should return a String. For our example, we simply return the two arguments concatenated with a space in between: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Since this is Python, do not forget to indent this line. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If you have followed our advice to [[#Practice Test-Driven Development|practice TDD]], you will already have a set of tests that you know should work. If that's the case, while building your implementation you can click on the circular arrow in the Tests panel, and see if your implementation passes all of them. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Remember that the runtime has no state. Don’t assume values for global or static variables. If you have further questions about what you can and cannot do in Python, ask on [[Wikifunctions:Python implementations]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Code in JavaScript === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section, we give a concrete example on how to create an implementation in the form of Code in JavaScript. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is <code>Z30000</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The implementation is defined using the ZID of the function. So are the arguments of the function. So in the case of the function <code>Z30000</code> with its two arguments, the function template should look like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> We know that the arguments (<code>Z30000K1</code> and <code>Z30000K2</code>) are Strings, so we can treat them as native strings in JavaScript. Also, the function should return a String. To complete our function, you can then add a line concatenating the input strings, like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> If you have tests as recommended in the [[#Practice Test-Driven Development|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes all of them. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Remember that the runtime has no state. Don’t assume values for global or static variables. If you have further questions about what you can and cannot do in JavaScript, ask on [[Wikifunctions:JavaScript implementations]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Calling another Wikifunctions function === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> A code implementation can call certain other Wikifunctions functions, receive the output of the call, and use that output in further processing. We refer to such calls as callbacks. At present, due to security and performance concerns, only the following built-in Wikidata fetch and search functions can be called in this way: {{Z|Z6820}}, {{Z|Z6821}}, {{Z|Z6822}}, {{Z|Z6824}}, {{Z|Z6825}}, {{Z|Z6826}}, {{Z|Z6830}}, and {{Z|Z6831}}. This capability is in an initial stage of deployment; we hope to allow calls to a broader range of functions in the future. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Let’s look at a JavaScript implementation containing a callback. This implementation fetches an item from Wikidata, extracts the label of that item in a given language, and returns the label string. The item to fetch is given by argument <code>Z400K1</code>, and the language is given by <code>Z400K2</code>. </div> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const item = Wikifunctions.Call('Z6821', Z400K1); for (const label of item.Z6001K2.Z12K1) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> A callback is made by calling <code>Wikifunctions.Call</code>, as shown in the example. The first argument to <code>Wikifunctions.Call</code> is always the ZID of the function to be called – in this case, {{Z|Z6821}}, which takes a single argument. Following that, the arguments to be passed to that function are listed, separated by commas. Here, that argument, <code>Z400K1</code>, is the same value that was passed to the function <code>Z400</code>. This is a common pattern of argument passing to callbacks, but their arguments can also be built using the <code>ZObject</code> constructor (as explained above), or obtained in other ways. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The value of <code>Z400K1</code> would be an instance of {{Z|Z6091}}, containing the QID of the item to be fetched. Line 2 of the example calls <code>Z6821</code> to fetch that item from Wikidata and assigns the resulting ZObject to the const <code>item</code>. The remaining code iterates over the item’s labels until it finds the one matching the language given by <code>Z400K2</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For the first example above, we have used <code>Z6821</code> for simplicity. However - unless an entire entity is needed by the implementation, it is strongly recommended to use <code>Z6820</code> to retrieve Wikidata items, which can be quite large. Although a call to <code>Z6820</code> is a bit more complex, its parameters allow for fetching selected portions of a Wikidata item, which can greatly improve performance and avoid some errors, by reducing the network bandwidth and processing time that are needed. (<code>Z6820</code> can also be used in place of <code>Z6822</code>, <code>Z6824</code>, <code>Z6825</code>, and <code>Z6826</code>, to get similar bandwidth-reduction benefits.) </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Just below we show how <code>Z6820</code> can be used, in <code>Wikifunctions.Call</code>, to implement the same behavior as above. Note that we use the second argument passed to <code>Z6820</code>, <code>[labelsPart]</code>, to say “Just return the item’s labels”, and we use the third argument, <code>[Z400K2]</code>, to say “Just return labels in the given language”. (This argument would also apply to aliases and descriptions, if they were included in the result.) </div> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const labelsPart = new ZObject( new Map( [ ['Z6030K1', new ZReference('Z6033')] ] ), {Z1K1: 'Z9', Z9K1: 'Z6030'} ); const entities = Wikifunctions.Call( 'Z6820', [Z400K1], [labelsPart], [Z400K2], []); const item = entities.get(Z400K1.Z6091K1); const labels = item.Z6001K2.Z12K1; for (const label of labels) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Other things to note: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Even though code implementations are now able to fetch Wikidata entities, it is recommended that they not be written to return ''entire'' entities. This is because of current limitations on the size of the value returned from a code implementation. To fetch and return an entire large entity, it’s better to call the fetch function from a composition.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Only one callback can execute at a time. For security reasons, it is not possible to use the concurrency features of JavaScript or Python to execute multiple callbacks in parallel.</span> ** <span lang="en" dir="ltr" class="mw-content-ltr">Keep in mind, however, that you can fetch multiple entities at once using Z6820.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">There is currently a 3 MiB limit on the size of Wikidata content that can be returned to a code implementation, by a single callback. The same limit applies to the size of the result returned from a code implementation.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> == Compositions == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section, we give a concrete example on how to create an implementation in the form of a composition. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is <code>Z30000</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> It is usually a good idea to first think about how to combine existing functions in order to create the desired output. Sometimes this might be trivial, and you can just go ahead with composing functions, but in many cases it is worthwhile to note the desired composition down. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, for the given Function, we could use the existing Function {{Z|Z10000}}. That Function takes two strings and makes one string out of them. But we need to add a space in between. So we first concatenate a space to the end of the first string, and then concatenate the second string to the result of that first concatenation. So our composition could be noted down like this: </div> <syntaxhighlight lang="prolog"> join_strings( join_strings( Z30000K1, " " ), Z30000K2 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> There are multiple ways to write a composition: notice that the same thing could be accomplished with: </div> <syntaxhighlight lang="prolog"> join_strings( Z30000K1, join_strings( " ", Z30000K2 ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> An alternative implementation could also use the existing Function {{Z|Z15175}}, so your composition could be: </div> <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> As you can see, there are multiple ways to accomplish this, so take your time and explore the existing functions available in the {{ll|Wikifunctions:Catalogue}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's try to create the second example, <code>join_strings(Z30000K1, join_strings(" ", Z30000K2))</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In order to create this: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›" icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search for the name of the outermost function you want to use, which in this example is "join two strings". Then, select the wanted function from the dropdown list.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">You will see two new fields, one for each of the arguments needed for the selected function.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">For the first argument, we want to select the first input to our function:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and select "Argument reference".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id" you can now select the first string of your function from the dropdown, which contains all available inputs.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">For the second argument, we want to use the result of another call to "join two strings":</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and select "Function call".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function you want to call, which is again "join two strings".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For this inner function call, configure the "first string" by simply typing a white space in the text field, and configure the "second string" as you did for step 6: change it using the "…" button to "Argument reference", and then select the second argument in the dropdown.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Your composition is now complete! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You can expand and collapse the details using the chevron buttons to see how it looks. If you already have Tests as recommended in the [[#Practice Test-Driven Development|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes the tests. Once your composition passes the tests, go ahead and publish it. </div> [[File:Composition implementation expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its expanded view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its expanded view</span>]] [[File:Composition implementation collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its collapsed view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its collapsed view</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions error handling == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As a Wikifunctions function creator, you might want to warn the user calling your function when something goes wrong in the code, or when their inputs do not fit a certain criteria. For example, if your Function expects a string input to contain a name, you might want to check that the name is not empty and, if it is, show an error message that the person using your Function can understand. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For this purpose, you can use <code>Wikifunctions.Error()</code> from your code implementations or the function {{Z|Z851}} from your compositions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section you will learn: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">How to throw errors from both code and composition implementations,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to write tests for error cases, and</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to catch and handle errors thrown by functions that you are using in your compositions.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Throwing errors from code implementations === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> When writing code, both from JavaScript and Python, you can use <code>Wikifunctions.Error()</code> to end the execution with a wanted error. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> <code>Wikifunctions.Error()</code> has two parameters: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Error type: a string containing the ZID of the error type you want to return.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Error arguments: a list of string arguments to build the error.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's go one by one: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Error type ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> An error type is an object that describes a kind of error that could happen in the system. There are a number of built-in error types but you can also build other error types that are more suited to your use case. When using errors, the best idea is to browse through the available error types, which can be explored in [[Special:ListObjectsByType/Z50|this list]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If there are no errors that fit your case, create a new one by going to the create page, and selecting "Error type" in the type selector. Then, set the necessary fields: </div> [[File:Error type.png|thumb|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Error type creation in Wikifunctions</span>|<span lang="en" dir="ltr" class="mw-content-ltr">To create new Error type (Z50), edit the label and add the necessary keys.</span>]] * <span lang="en" dir="ltr" class="mw-content-ltr">'''Label''' – This is the main title of the error, which should contain a short but descriptive message. Set the error label on the right-side box titled "About".</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Keys''' – Keys contain additional information about what caused the error. For example, if an input had the wrong format, you might want to inform the user of what was the input content when raising the error. To use them in your implementations, keys should be strings. To create a key, click on the "[+]" icon below "keys", select "String" under "value type", and add a label that describes it appropriately, for example "current input". Once you have all the necessary keys, you can Publish your error type and keep the ID of the newly created object.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error message''' – Error types can contain a multilingual array of HTML parametrized error messages. The parameter notation is $1, $2, etc., where the digit corresponds to the error type key. For example, when creating an error type with one string key "current input", the error message can use the positional parameter "$1", which will be replaced with the value of the "current input" key at the time of rendering the error. To add HTML messages, click on the "[+]" icon below "html fragments", select a language and input the HTML string.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Error arguments ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Error arguments correspond to the keys of the Error type, and they should provide additional information to understand the error. Error arguments should always be Strings. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Wikifunctions.Error() ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say that you want an error to be thrown when either your first or your second input are empty. You have already created the error type, and the assigned ZID was <code>Z30005</code>. Your error type has two string keys: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Input key: contains the key of the failing input</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Input value: contains the current value of the failing input</span> <div lang="en" dir="ltr" class="mw-content-ltr"> To raise an error in your JavaScript implementation you should do something like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { // If the first input is empty, raise error Z30005 // with two string args: [ first input key, first input value ] Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { // If the second input is empty, raise error Z30005 // with two string args: [ second input key, second input value ] Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> To raise an error in your Python implementation you should do something like this: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": # If the first input is empty, raise error Z30005 # with two string args: [ first input key, first input value ] Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": # If the second input is empty, raise error Z30005 # with two string args: [ first input key, first input value ] Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Remember that calling <code>Wikifunctions.Error()</code> ends the execution! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Throwing errors from compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If you are creating a composition implementation, you can throw an error by calling the special function {{Z|Z851}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Throw Error function (Z851) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z851}} function is similar to the <code>Wikifunctions.Error()</code> method and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – A reference to the Error type you want to raise</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error parameters''' – A list with the arguments to create your Error, which should also be Strings.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Throw Error ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say you want to modify your composition so that it first checks that the arguments are not empty, and raises an error when it finds an empty one. Then, if none of them are empty, it runs the original composition, which is: </div> <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> To do this, you need to create conditional paths, for which you can use the {{Z|Z802}} function. Think of it like this: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the first argument is empty, throw an error for the first argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Else, proceed to check the second argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the second argument is empty, throw an error for the second argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Else, proceed with the success path and return the joint strings with the space separator</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Or in functional pseudo code: </div> <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), throw_error( Z30005, [ "Z30000K1", Z30000K1 ] ), if( is_empty_string( Z30000K2 ), throw_error( Z30005, [ "Z30000K2", Z30000K2 ] ), join_with_separator( Z30000K1, Z30000K2, " " ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's create this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+” button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›” icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the outermost function you want to use, which in this case is "if".</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Check the validity of the first argument:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "condition", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "is empty string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "input", click on the "…" button and select "argument reference"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id", select the first input (e.g. "first string")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse the "condition" function call if you want, by clicking on the down-chevron next to "condition". You should see something like "f(x) is empty string( → first string )"</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Throw error if the condition is true:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "then", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Throw Error"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error type", search and select your error type (you can directly input the error ID if you know it, e.g. Z30005)</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error parameters", add two items by clicking on the "+" button</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For "Item 1" (offending argument key), set its type to "String" and write the argument identifier (e.g. "first input", or "Z30000K1")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For "Item 2" (offending argument value), click on the "…" next to "Item 2" and select "argument reference"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id", select the first input (e.g. "first string")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse the "then" function call if you want, by clicking on the down-chevron next to "then". You should see something like "f(x) Throw Error( Input was the wrong format, Typed list( Object, "first input", → first string ) )"</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Continue to check the second argument if the first was good:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "else", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "if"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Set up "condition" to check the validity of the second argument by following the same process as described in step 5.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Set up "then" to throw an error for the second argument by following the same process as described in step 6.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Finally, set up the success path:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to the nested "else", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the successful function, which in this case can be "join strings with separator"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and set it to "argument reference", then select "first string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and set it to "argument reference", then select "second string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "separator" add a space into the text field</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The resulting function call should look like this: </div> [[File:Throw error expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function</span>]] [[File:Throw error collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function, in its collapsed view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function, in its collapsed view</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Handling errors in compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> While it is useful to allow functions to raise expected errors, it is crucial to be able to handle errors in your compositions in order to safely use these functions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say you want to create a new function "full name of a person" – we will refer to it with the ZID <code>Z30010</code>. This function should return the full name of a person given a first and last names, but if any of the two fields are empty, it should return the text "Unknown" instead. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You could create a composition using our example function "Join two strings with a space" or <code>Z30000</code> to generate the name. If any of the inputs are empty, you know that <code>Z30000</code> will throw an error of type <code>Z30005</code>. Using the function {{Z|Z850}} as a wrapper, you can attempt the join operation and intercept a possible error to simply return "Unknown" whenever it occurs. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Try-Catch function (Z850) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z850}} function is built-in with ZID <code>Z850</code> and takes three arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – The initial function call to run. If nothing goes wrong, the response will be the result of this function call.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – An error type to catch in case it is thrown during the execution of the first function call.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error handler''' – A function call that will be run in case the error specified above is caught during the execution of the initial function call. If that happens, the result of the error handler will be the value returned.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Try-Catch ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Once we have all the functions for our composition, we can craft it like this: </div> <syntaxhighlight lang="prolog"> try_catch( join_with_space( Z30010K1, Z30010K2 ), Z30005, echo( "Unknown" ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This means that: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">The "Join two strings with a space" function will be tried with the two inputs and, if everything goes well, the output of this function will be returned</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If any of the inputs are blank, "Join two strings with a space" with raise an error of type <code>Z30005</code></span> * <span lang="en" dir="ltr" class="mw-content-ltr">Our {{Z|Z850}} will then detect this error and run the {{Z|Z801}} function to return "Unknown"</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's create this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›” icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the outermost function you want to use, which in this case is "Try-Catch".</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Set the main function call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under the field where the "Try-Catch" function is selected, next to the "function call" key, click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the function "join two strings with space"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and select "argument reference", then select the "first name" argument from the dropdown.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and select "argument reference", then select the "second name" argument from the dropdown.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Select the error to catch:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error type", search and select "bad string input" – you can search directly by its ZID <code>Z30005</code></span> # <span lang="en" dir="ltr" class="mw-content-ltr">Set the error handler function call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "error handler", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "echo"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "input" and "type", search and select the type "String"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now, under "input", type "Unknown" in the text field</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The resulting function should look like this: </div> [[File:Try catch expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in expanded mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in expanded mode</span>]] [[File:Try catch collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in collapsed mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in collapsed mode</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Testing your failure use cases === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As we introduced in the above section about [[#Practice Test-Driven Development|practicing TDD]], it's important to test not only the most common paths, but also the possible edge cases. It is equally important to test failure behavior. In this section we will give you the tools necessary to test that your function fails with a given set of inputs, and that the error thrown is the expected one. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> To do that, you will need other two system functions: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Is error type (Z852) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z852}} function is built-in with ZID <code>Z852</code> and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error''' – An {{Z|Z5}} object, which can be thrown by a failing call. An error instance has a type and a value.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – A reference to an {{Z|Z50}} which will be compared to the type of the Error passed as a first argument. If that's the case, the function will return true.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Get error thrown by function call (Z853) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z853}} function is built-in with ZID <code>Z853</code> and takes one argument: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – A function call which can either return a successful value of any type, or throw an error.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> This function returns a {{Z|Z882}} with a {{Z|Z40}} in first place and an {{Z|Z1}} in the second: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the Function call runs successfully and hence does not throw any error, the returned pair will contain False in the first place, and void in the second.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the Function call throws an error, the returned pair will contain True in the first place, and the caught error in the second.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> To use this function in your compositions, you might need to use the additional functions: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">{{Z|Z821}}, and</span> * {{Z|Z822}} <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Testing errors ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say our target function, "Join two strings with a space" or <code>Z30000</code>, throws an error of type <code>Z30005</code> and we want to test this behavior. To do that we need to: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Throw a failing function call</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Get the error using the function {{Z|Z853}}</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Check that the error is the right type with {{Z|Z852}}</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Tests have two fields: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Call''' – A function call that will produce an output with the inputs you want to test. This call will return a value.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Result validation''' – A function call that will validate that the value returned by the call above is the expected one. The first argument of this function call will be automatically assigned to take the return value of the first call.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> For step-by-step instructions on how to create tests, see {{ll|Wikifunctions:Introduction#Create_tests}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In our example, we can structure it like this — but this is not the only way! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The call, which will return an {{Z|Z5}} object: </div> <syntaxhighlight lang="prolog"> error = get_second_element_of_typed_list( get_error_thrown_by( join_strings_by_whitespace( "", "not empty" ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> And the result validation, which will take the {{Z|Z5}} object as its first argument: </div> <syntaxhighlight lang="prolog"> is_error_type( error, Z30005 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's do this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding a test by clicking on the "+" button in the "Tests" table from your Function page. The "call" and "result validation" fields already have some functions pre-set, but to test the errors we will need to change them.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">First, let's set the call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "call", click the "›" chevron button to expand the function call.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", edit the field and search and select the function "Get second element of a typed pair"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Once selected, next to "Typed pair", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Get error thrown by function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "function call", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Join two strings with a space" (or by ZID <code>Z30000</code>)</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now set the inputs so that they cause a failure: at least one of them should be empty.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse your "call" by clicking again on the down-chevron button if you want!</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Next, let's set the result validation:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "result validation", click the "›" chevron button to expand the function call.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", edit the field and search and select the function "Is error type"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now you will only be asked to configure the second argument. Under "error type", search and select your <code>Z30005</code> error type.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">And you are done! You can now click the circular arrow in the "Implementations" box and you should see green checks.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> If everything went right, you can now save your test. It should look like this: </div> [[File:Get error expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in expanded mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in expanded mode</span>]] [[File:Get error collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in collapsed mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in collapsed mode</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Creating actionable error messages === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As described above, Error Types have an optional key <code>Z50K3</code> which contains a multilingual list of HTML strings. When rendering information about an error, the messages stored in the error type can help create a clear, precise, informative, translatable and actionable error message. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For that purpose, error messages can contain parameters like <code>$1</code>, <code>$2</code>, etc., where the digit corresponds to the error type argument and its value in the error instance. These error messages are rendered in Wikifunctions inside the "Details" dialog window after executing a function call. Additionally, these error messages are surfaced in other client interfaces, like Abstract Wikipedia, to provide better guidance to Abstract Content editors. </div> [[File:Wikifunctions actionable error message example in the Details dialog.png|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">The error message is rendered using the HTML message of the error type and the error argument values.</span>]] [[File:Wikifunctions actionable error message example in Abstract Wikipedia.png|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">When available, the HTML error message is rendered in the Abstract Wikipedia preview section.</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> Let's use a real example to understand the benefits of HTML error messages: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The function {{Z|Z37847}} returns the first Lexeme reference given a Wikidata Item reference and a language. When there is no Lexeme for this Item-Language combination, it throws an error of type {{Z|Z28248}}, which has three keys: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K1''' is the input Wikidata item QID</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K2''' is the connecting property, in this case <code>P5137/item for this sense</code></span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K3''' is the language code</span> <div lang="en" dir="ltr" class="mw-content-ltr"> When calling this function for a Wikidata lexeme that doesn't exist, the call will throw an error instance like this: </div> <syntaxhighlight lang="json" highlight="10,12"> { "Z1K1": "Z5", "Z5K1": "Z28248", "Z5K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z885", "Z885K1": "Z28248" }, "Z28248K1": "Q319", "Z28248K2": "P5137", "Z28248K3": "ast" } } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> While the error type label indicates: <code>No matching lexeme for item in language</code>, a better error message should indicate: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">which is the failing item,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">which is the language missing, and</span> * <span lang="en" dir="ltr" class="mw-content-ltr">what are the possible ways to fix it.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The error message <code>Z50K3</code> field can provide this functionality. Whenever an Error Type has an error message for the user language (or any of its fallbacks), the error message shown will be rendered by: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">First, replacing the message parameters with the values of the keys. In our example, any <code>$1</code> will be replaced with the value of <code>Z28248K1</code> ("Q319"), <code>$2</code> with "P5137", and <code>$3</code> with "ast",</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Last, sanitizing and rendering the HTML message.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> So a HTML message like: </div> <syntaxhighlight lang="html"> There is no matching lexeme for the item $1 in "$3".<br> <a href="http://wikidata.org/wiki/$1">Edit in Wikidata</a> </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Will become: </div> : There is no matching lexeme for the item Q319 in "ast" : [[d:Q319|Edit in Wikidata]] <div lang="en" dir="ltr" class="mw-content-ltr"> == Debugging your implementations == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Sometimes things can go wrong. A function might behave differently than expected or a value might not look quite right. Sometimes implementations are really complex and, because they are run in a sandboxed environment, it can seem really difficult to debug. To help understand what's going on inside a function call, Wikifunctions includes a small set of debugging tools. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> These tools don't change the result of a function, but will add extra information to the returned metadata, which you can observe after running the function. You can use <code>Wikifunctions.Debug()</code> from your code implementations or the function {{Z|Z854}} from your compositions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section you will learn: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">How to add debug messages from both code and composition implementations,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to inspect the metadata manually or via the UI to inspect these logs.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Debugging your code implementations === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> When writing code, both from JavaScript and Python3, you can use <code>Wikifunctions.Debug()</code> to add a message to your debugging log and continue the execution. </div> {{phab|T441028}} <div lang="en" dir="ltr" class="mw-content-ltr"> <code>Wikifunctions.Debug()</code> has one parameter, which is generally expected to be a string. However, any other object passed as parameter will get directly converted into a string. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If we want to add debug logs to our code implementations for our "Join two strings with a space" example function, we can do, in JavaScript: </div> <syntaxhighlight lang="JavaScript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { Wikifunctions.Debug( `first input is empty "${ Z30000K1 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { Wikifunctions.Debug( `second input is empty "${ Z30000K2 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } Wikifunctions.Debug( "both inputs are fine" ); return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> And the same in your Python3 implementation will be: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": Wikifunctions.Debug( 'first input is empty "'+Z30000K1+'"' ) Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": Wikifunctions.Debug( 'second input is empty "'+Z30000K2+'"' ) Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) Wikifunctions.Debug( 'both inputs are fine' ) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This way, no matter what happens, we will be adding one message to your debugging logs: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the function call fails when checking on the first or second input, the result of the execution will be a failure, but it will contain one informative log about what branch caused the failure.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the function call succeeds—because both inputs are valid—the function call will return the joined string, but the returned metadata will also contain a debug log.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Debugging your compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> To support debugging compositions, Wikifunctions provides the built-in function {{Z|Z854}}. This function allows you to attach debug messages to the execution of any function call that generates the final output. The debug logs collected during the evaluation are returned as part of the execution metadata, under the <code>executorDebugLogs</code> key. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Add debug log to function call (Z854) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z854}} function is built-in with ZID <code>Z854</code> and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – Any composition you want to execute.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Debug log''' – A string message that will be recorded if the given function call is evaluated.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> When the wrapped function call runs, the provided message is added to the execution logs. If that function call is not executed, or its execution is not part of the final output, its debug log will not appear in the final result metadata. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You will benefit from this built-in if you want to observe: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Which branch of a conditional was executed, or</span> * <span lang="en" dir="ltr" class="mw-content-ltr">the order of evaluation in a composition.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Add debug log to function call ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say that you want to add debug logs to our example function "Join two strings with a space" or <code>Z30000</code>, so that different messages are added to the different possible outcomes. You could use our debugging builtin like this: </div> <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), add_debug_log( throw_error( Z30005, ... ), 'failed on first input' ) if( is_empty_string( Z30000K2 ), add_debug_log( throw_error( Z30005, ... ), 'failed on second input' ), add_debug_log( join_with_separator( Z30000K1, Z30000K2, " " ), 'both inputs are ok!' ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This way, </div> * <span lang="en" dir="ltr" class="mw-content-ltr">when called with an empty first input, the function will return a failed response, and the metadata will contain an <code>executorDebugLogs</code> entry with the "failed on first input" log.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">When called with an empty second input, the call will also fail, but the logged message will be "failed on second input"</span> * <span lang="en" dir="ltr" class="mw-content-ltr">When called with valid inputs, the function will return a successful response, and additionally the metadata will contain "both inputs are ok" in its <code>executorDebugLogs</code> key.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> This is the way this composition would look: </div> [[File:Add debug log expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Composition implementation using Add debug logs to log all possible execution paths</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Composition implementation using Add debug logs to log all possible execution paths</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Accessing execution debug logs === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Whether your execution logs are added via <code>Wikifunctions.Debug()</code> or via the {{Z|Z854}} built-in function, they are returned as part of the response metadata. To see the logs, once you run your function, click on the "Details" button that appears at the bottom of the "Result" section. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The error and debug information will appear at the top of the "Details" dialog. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> This is what you would see when running the composition from our previous example with valid and invalid inputs: </div> {| class="wikitable" | [[File:Execution logs success.png|frameless|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a successful execution with debug logs</span>]] | [[File:Execution logs failure.png|frameless|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a failed execution with debug logs</span>]] |- | <span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a successful execution: shows no errors, but displays the successful execution log: ''"both inputs are ok!"''</span> | <span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a failed execution: shows the error information, and the additional execution log for the first failure branch: ''"failed on first input"''</span> |} [[Category:How to create implementations| {{#translation:}}]] qe3ys8p7rfj498t140b5miv3ysxw265 Wikifunctions:How to create implementations/zh-hant 4 60330 331128 296949 2026-10-23T08:23:32Z FuzzyBot 207 Updating to match new version of source page 331128 wikitext text/x-wiki <languages/> <div lang="en" dir="ltr" class="mw-content-ltr"> This page provides a more detailed guide to '''creating implementations''', beyond the overview at {{ll|Wikifunctions:Introduction}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Types of Implementations == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In Wikifunctions, an '''implementation''' can take one of two main forms: '''code''' or '''composition'''. A code implementation directly expresses the function’s logic in any of the available programming languages (currently, Python3 or JavaScript). It’s most useful when the function’s behavior can’t easily be built from existing Wikifunctions, or when precise control over data processing is needed. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> A composition implementation, on the other hand, defines the function entirely by combining other existing functions, without writing code. Compositions are easier to understand, reuse, and translate into other languages automatically, but they depend on suitable building blocks already being available and often are less performant. In general, start by checking whether your goal can be achieved through composition; if it can’t, or if performance or fine-grained logic matters, choose a code implementation instead. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> There's a third type of implementation: '''built-ins'''. These are run by system-built code, and are not editable. Most likely all pre-defined functions will have a built-in implementation. In such cases, when opening the implementation page, you will see a message stating ''"{{int|wikilambda-implementation-selector-none}}"'' </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Practice Test-Driven Development == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> '''Test-Driven Development''', or '''TDD''', is a way of creating software where you write tests before you write the actual code. Tests are just a way of understanding what your function is supposed to do by listing examples and how they should work. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In Wikifunctions, writing tests first offers significant benefits. If you are working on an implementation, you can run your code against the existing tests to check that it behaves as expected. This makes it easier to catch errors early before even publishing your implementation. Tests are also a powerful way to describe the function you need. By writing tests, '''you clearly communicate the expected behavior''', and the community can step in and help with the implementation, or create alternative implementations. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Imagine you want to implement a Function that combines two strings with a space in between. A basic test for this might look like: </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello", "world" ) => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Once you have defined the basic behavior, it's important to '''think about edge cases'''—situations where the inputs are such that you might need some special behavior. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, what if your first string ends in a space, or your second string starts with a space? Should the function keep all existing spaces and add another one, or should it return a neatly spaced result with just a single space between the words? Depending on your requirements, you should build a test for such a case. For example, a test for this edge case could be either one of these — but not both!: </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> or ... </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Make sure that all possible special cases are covered by your tests, and once you have them, make sure that they are all connected to the Function by selecting them and clicking "Connect". </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Code implementations == </div> [[File:Code implementation.png|thumb|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions code editor initialized with a function template</span>|<span lang="en" dir="ltr" class="mw-content-ltr">When adding a new code implementation, the function template is initialized with the function and argument names</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> When creating an implementation using code, the Wikifunctions UI will set up a code editor with the selected language activated for syntax highlighting and validation. When the function to implement and the programming language are selected, this editor will be set with the correct function template: '''do not remove or edit this'''! Keep your code inside this function signature: if you need auxiliary functions, you can simply declare them inside your top-level function declaration. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Using input types in your code === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions types {{Z|Z6}} and {{Z|Z40}} can be used as if they were native types in both JavaScript and Python3. For example, a String input can be concatenated or a Boolean be directly used in a logical expression. To use other types in your code implementations, you will have to look deeper into the type, figure out if it has a conversion to a native equivalent, and treat it accordingly. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, let's say we want to write some Python code that handles an input of type {{Z|Z20420}}. In the page for this type, let's look at its "type converters to code" and search for a Python one. The converter {{Z|Z20424}} will be applied to our date input before our code, so looking at "native type" we know that our input will be a Python ''dict'' and looking at the implementation we can see the keys we can expect: </div> <syntaxhighlight lang="python3"> return { 'K1': year, 'K2': month, 'K3': day } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> When a type doesn't have a converter, you'll have to access its parts directly using its keys. For example, let's assume that your function <code>Z30000</code> has one input <code>Z30000K1</code> of type {{Z|Z11}}. This type has two keys: <code>Z11K1</code> for the language (itself an object of type {{Z|Z60}}), and <code>Z11K2</code> for the string value. Similarly, the language object has a key <code>Z60K1</code> for the language code. So, to get a string with the language code and the text, you can write: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1 ) { // e.g. "en: some text" return Z30000K1.Z11K1.Z60K1 + ": " + Z30000K1.Z11K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> For a quick reference of the available type conversions visit [[Special:MyLanguage/Wikifunctions:Execution targets#Default type conversion|the default type conversion table]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Returning the right outputs === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Similarly to the way you treat inputs, outputs need to match the type specified in the function definition. Some can be treated as simply as native types, so any string output will be converted into a Wikifunctions {{Z|Z6}} object and any native boolean returned by your implementation will be converted into a Wikifunctions {{Z|Z40}} object. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Those types that have "type converters from code" will apply the appropriate function to the output, in order to build the required type. Following the example of {{Z|Z20420}}, the {{Z|Z20443}} will transform the output from your implementation–a dict with K1, K2 and K3 keys–into its correct ZObject representation. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For types that don't have converters from code, you can carefully build and return the output objects. For example, imagine that our function <code>Z30000</code> takes two string inputs: language code and text, and should return a {{Z|Z11}} object. You can do this in Python by using the <code>ZObject</code> constructor: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): lang_object = ZObject( {"Z1K1": "Z9", "Z9K1": "Z60"}, Z60K1 = Z30000K1 ) return ZObject( {"Z1K1": "Z9", "Z9K1": "Z11"}, Z11K1 = lang_object, Z11K2 = Z30000K2 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Or in JavaScript: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { const langObject = new ZObject( new Map( [ [ "Z60K1", Z30000K1 ] ] ), { "Z1K1": "Z9", "Z9K1": "Z60" } ); const monolingualKeys = new Map( [ [ "Z11K1", langObject ], [ "Z11K2", Z30000K2 ] ] ); return new ZObject( monolingualKeys, { "Z1K1": "Z9", "Z9K1": "Z11" } ); } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> You can learn more about the <code>ZObject</code> class and other useful constructors in {{ll|Wikifunctions:Execution_targets#Custom_and_non-built-in_type_conversion}} </div> {{phab|T392750}}<div lang="en" dir="ltr" class="mw-content-ltr"> As of 2026-05, trying to return a list of lists may fail, so you're not able to implement such functions in code. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Code in Python === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section, we give a concrete example on how to create an implementation in the form of Code in Python. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is Z30000. </div> <div class="mw-translate-fuzzy"> 實作是使用函式的ZID來定義的,函式的參數也是如此。因此,下列以包含兩個參數的函數Z11057為例,第一行應該是這樣的: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> As we described before, we know that the arguments (<code>Z30000K1</code> and <code>Z30000K2</code>) are Strings, so we can treat them as simply as we use native strings in Python. Also, the function should return a String. For our example, we simply return the two arguments concatenated with a space in between: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Since this is Python, do not forget to indent this line. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If you have followed our advice to [[#Practice Test-Driven Development|practice TDD]], you will already have a set of tests that you know should work. If that's the case, while building your implementation you can click on the circular arrow in the Tests panel, and see if your implementation passes all of them. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Remember that the runtime has no state. Don’t assume values for global or static variables. If you have further questions about what you can and cannot do in Python, ask on [[Wikifunctions:Python implementations]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Code in JavaScript === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section, we give a concrete example on how to create an implementation in the form of Code in JavaScript. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is <code>Z30000</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The implementation is defined using the ZID of the function. So are the arguments of the function. So in the case of the function <code>Z30000</code> with its two arguments, the function template should look like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> We know that the arguments (<code>Z30000K1</code> and <code>Z30000K2</code>) are Strings, so we can treat them as native strings in JavaScript. Also, the function should return a String. To complete our function, you can then add a line concatenating the input strings, like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> If you have tests as recommended in the [[#Practice Test-Driven Development|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes all of them. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Remember that the runtime has no state. Don’t assume values for global or static variables. If you have further questions about what you can and cannot do in JavaScript, ask on [[Wikifunctions:JavaScript implementations]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Calling another Wikifunctions function === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> A code implementation can call certain other Wikifunctions functions, receive the output of the call, and use that output in further processing. We refer to such calls as callbacks. At present, due to security and performance concerns, only the following built-in Wikidata fetch and search functions can be called in this way: {{Z|Z6820}}, {{Z|Z6821}}, {{Z|Z6822}}, {{Z|Z6824}}, {{Z|Z6825}}, {{Z|Z6826}}, {{Z|Z6830}}, and {{Z|Z6831}}. This capability is in an initial stage of deployment; we hope to allow calls to a broader range of functions in the future. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Let’s look at a JavaScript implementation containing a callback. This implementation fetches an item from Wikidata, extracts the label of that item in a given language, and returns the label string. The item to fetch is given by argument <code>Z400K1</code>, and the language is given by <code>Z400K2</code>. </div> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const item = Wikifunctions.Call('Z6821', Z400K1); for (const label of item.Z6001K2.Z12K1) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> A callback is made by calling <code>Wikifunctions.Call</code>, as shown in the example. The first argument to <code>Wikifunctions.Call</code> is always the ZID of the function to be called – in this case, {{Z|Z6821}}, which takes a single argument. Following that, the arguments to be passed to that function are listed, separated by commas. Here, that argument, <code>Z400K1</code>, is the same value that was passed to the function <code>Z400</code>. This is a common pattern of argument passing to callbacks, but their arguments can also be built using the <code>ZObject</code> constructor (as explained above), or obtained in other ways. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The value of <code>Z400K1</code> would be an instance of {{Z|Z6091}}, containing the QID of the item to be fetched. Line 2 of the example calls <code>Z6821</code> to fetch that item from Wikidata and assigns the resulting ZObject to the const <code>item</code>. The remaining code iterates over the item’s labels until it finds the one matching the language given by <code>Z400K2</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For the first example above, we have used <code>Z6821</code> for simplicity. However - unless an entire entity is needed by the implementation, it is strongly recommended to use <code>Z6820</code> to retrieve Wikidata items, which can be quite large. Although a call to <code>Z6820</code> is a bit more complex, its parameters allow for fetching selected portions of a Wikidata item, which can greatly improve performance and avoid some errors, by reducing the network bandwidth and processing time that are needed. (<code>Z6820</code> can also be used in place of <code>Z6822</code>, <code>Z6824</code>, <code>Z6825</code>, and <code>Z6826</code>, to get similar bandwidth-reduction benefits.) </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Just below we show how <code>Z6820</code> can be used, in <code>Wikifunctions.Call</code>, to implement the same behavior as above. Note that we use the second argument passed to <code>Z6820</code>, <code>[labelsPart]</code>, to say “Just return the item’s labels”, and we use the third argument, <code>[Z400K2]</code>, to say “Just return labels in the given language”. (This argument would also apply to aliases and descriptions, if they were included in the result.) </div> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const labelsPart = new ZObject( new Map( [ ['Z6030K1', new ZReference('Z6033')] ] ), {Z1K1: 'Z9', Z9K1: 'Z6030'} ); const entities = Wikifunctions.Call( 'Z6820', [Z400K1], [labelsPart], [Z400K2], []); const item = entities.get(Z400K1.Z6091K1); const labels = item.Z6001K2.Z12K1; for (const label of labels) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Other things to note: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Even though code implementations are now able to fetch Wikidata entities, it is recommended that they not be written to return ''entire'' entities. This is because of current limitations on the size of the value returned from a code implementation. To fetch and return an entire large entity, it’s better to call the fetch function from a composition.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Only one callback can execute at a time. For security reasons, it is not possible to use the concurrency features of JavaScript or Python to execute multiple callbacks in parallel.</span> ** <span lang="en" dir="ltr" class="mw-content-ltr">Keep in mind, however, that you can fetch multiple entities at once using Z6820.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">There is currently a 3 MiB limit on the size of Wikidata content that can be returned to a code implementation, by a single callback. The same limit applies to the size of the result returned from a code implementation.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> == Compositions == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section, we give a concrete example on how to create an implementation in the form of a composition. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is <code>Z30000</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> It is usually a good idea to first think about how to combine existing functions in order to create the desired output. Sometimes this might be trivial, and you can just go ahead with composing functions, but in many cases it is worthwhile to note the desired composition down. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, for the given Function, we could use the existing Function {{Z|Z10000}}. That Function takes two strings and makes one string out of them. But we need to add a space in between. So we first concatenate a space to the end of the first string, and then concatenate the second string to the result of that first concatenation. So our composition could be noted down like this: </div> <syntaxhighlight lang="prolog"> join_strings( join_strings( Z30000K1, " " ), Z30000K2 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> There are multiple ways to write a composition: notice that the same thing could be accomplished with: </div> <syntaxhighlight lang="prolog"> join_strings( Z30000K1, join_strings( " ", Z30000K2 ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> An alternative implementation could also use the existing Function {{Z|Z15175}}, so your composition could be: </div> <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> As you can see, there are multiple ways to accomplish this, so take your time and explore the existing functions available in the {{ll|Wikifunctions:Catalogue}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's try to create the second example, <code>join_strings(Z30000K1, join_strings(" ", Z30000K2))</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In order to create this: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›" icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search for the name of the outermost function you want to use, which in this example is "join two strings". Then, select the wanted function from the dropdown list.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">You will see two new fields, one for each of the arguments needed for the selected function.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">For the first argument, we want to select the first input to our function:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and select "Argument reference".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id" you can now select the first string of your function from the dropdown, which contains all available inputs.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">For the second argument, we want to use the result of another call to "join two strings":</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and select "Function call".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function you want to call, which is again "join two strings".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For this inner function call, configure the "first string" by simply typing a white space in the text field, and configure the "second string" as you did for step 6: change it using the "…" button to "Argument reference", and then select the second argument in the dropdown.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Your composition is now complete! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You can expand and collapse the details using the chevron buttons to see how it looks. If you already have Tests as recommended in the [[#Practice Test-Driven Development|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes the tests. Once your composition passes the tests, go ahead and publish it. </div> [[File:Composition implementation expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its expanded view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its expanded view</span>]] [[File:Composition implementation collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its collapsed view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its collapsed view</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions error handling == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As a Wikifunctions function creator, you might want to warn the user calling your function when something goes wrong in the code, or when their inputs do not fit a certain criteria. For example, if your Function expects a string input to contain a name, you might want to check that the name is not empty and, if it is, show an error message that the person using your Function can understand. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For this purpose, you can use <code>Wikifunctions.Error()</code> from your code implementations or the function {{Z|Z851}} from your compositions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section you will learn: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">How to throw errors from both code and composition implementations,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to write tests for error cases, and</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to catch and handle errors thrown by functions that you are using in your compositions.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Throwing errors from code implementations === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> When writing code, both from JavaScript and Python, you can use <code>Wikifunctions.Error()</code> to end the execution with a wanted error. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> <code>Wikifunctions.Error()</code> has two parameters: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Error type: a string containing the ZID of the error type you want to return.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Error arguments: a list of string arguments to build the error.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's go one by one: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Error type ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> An error type is an object that describes a kind of error that could happen in the system. There are a number of built-in error types but you can also build other error types that are more suited to your use case. When using errors, the best idea is to browse through the available error types, which can be explored in [[Special:ListObjectsByType/Z50|this list]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If there are no errors that fit your case, create a new one by going to the create page, and selecting "Error type" in the type selector. Then, set the necessary fields: </div> [[File:Error type.png|thumb|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Error type creation in Wikifunctions</span>|<span lang="en" dir="ltr" class="mw-content-ltr">To create new Error type (Z50), edit the label and add the necessary keys.</span>]] * <span lang="en" dir="ltr" class="mw-content-ltr">'''Label''' – This is the main title of the error, which should contain a short but descriptive message. Set the error label on the right-side box titled "About".</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Keys''' – Keys contain additional information about what caused the error. For example, if an input had the wrong format, you might want to inform the user of what was the input content when raising the error. To use them in your implementations, keys should be strings. To create a key, click on the "[+]" icon below "keys", select "String" under "value type", and add a label that describes it appropriately, for example "current input". Once you have all the necessary keys, you can Publish your error type and keep the ID of the newly created object.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error message''' – Error types can contain a multilingual array of HTML parametrized error messages. The parameter notation is $1, $2, etc., where the digit corresponds to the error type key. For example, when creating an error type with one string key "current input", the error message can use the positional parameter "$1", which will be replaced with the value of the "current input" key at the time of rendering the error. To add HTML messages, click on the "[+]" icon below "html fragments", select a language and input the HTML string.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Error arguments ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Error arguments correspond to the keys of the Error type, and they should provide additional information to understand the error. Error arguments should always be Strings. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Wikifunctions.Error() ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say that you want an error to be thrown when either your first or your second input are empty. You have already created the error type, and the assigned ZID was <code>Z30005</code>. Your error type has two string keys: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Input key: contains the key of the failing input</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Input value: contains the current value of the failing input</span> <div lang="en" dir="ltr" class="mw-content-ltr"> To raise an error in your JavaScript implementation you should do something like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { // If the first input is empty, raise error Z30005 // with two string args: [ first input key, first input value ] Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { // If the second input is empty, raise error Z30005 // with two string args: [ second input key, second input value ] Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> To raise an error in your Python implementation you should do something like this: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": # If the first input is empty, raise error Z30005 # with two string args: [ first input key, first input value ] Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": # If the second input is empty, raise error Z30005 # with two string args: [ first input key, first input value ] Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Remember that calling <code>Wikifunctions.Error()</code> ends the execution! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Throwing errors from compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If you are creating a composition implementation, you can throw an error by calling the special function {{Z|Z851}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Throw Error function (Z851) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z851}} function is similar to the <code>Wikifunctions.Error()</code> method and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – A reference to the Error type you want to raise</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error parameters''' – A list with the arguments to create your Error, which should also be Strings.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Throw Error ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say you want to modify your composition so that it first checks that the arguments are not empty, and raises an error when it finds an empty one. Then, if none of them are empty, it runs the original composition, which is: </div> <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> To do this, you need to create conditional paths, for which you can use the {{Z|Z802}} function. Think of it like this: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the first argument is empty, throw an error for the first argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Else, proceed to check the second argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the second argument is empty, throw an error for the second argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Else, proceed with the success path and return the joint strings with the space separator</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Or in functional pseudo code: </div> <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), throw_error( Z30005, [ "Z30000K1", Z30000K1 ] ), if( is_empty_string( Z30000K2 ), throw_error( Z30005, [ "Z30000K2", Z30000K2 ] ), join_with_separator( Z30000K1, Z30000K2, " " ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's create this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+” button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›” icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the outermost function you want to use, which in this case is "if".</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Check the validity of the first argument:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "condition", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "is empty string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "input", click on the "…" button and select "argument reference"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id", select the first input (e.g. "first string")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse the "condition" function call if you want, by clicking on the down-chevron next to "condition". You should see something like "f(x) is empty string( → first string )"</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Throw error if the condition is true:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "then", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Throw Error"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error type", search and select your error type (you can directly input the error ID if you know it, e.g. Z30005)</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error parameters", add two items by clicking on the "+" button</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For "Item 1" (offending argument key), set its type to "String" and write the argument identifier (e.g. "first input", or "Z30000K1")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For "Item 2" (offending argument value), click on the "…" next to "Item 2" and select "argument reference"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id", select the first input (e.g. "first string")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse the "then" function call if you want, by clicking on the down-chevron next to "then". You should see something like "f(x) Throw Error( Input was the wrong format, Typed list( Object, "first input", → first string ) )"</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Continue to check the second argument if the first was good:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "else", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "if"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Set up "condition" to check the validity of the second argument by following the same process as described in step 5.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Set up "then" to throw an error for the second argument by following the same process as described in step 6.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Finally, set up the success path:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to the nested "else", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the successful function, which in this case can be "join strings with separator"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and set it to "argument reference", then select "first string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and set it to "argument reference", then select "second string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "separator" add a space into the text field</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The resulting function call should look like this: </div> [[File:Throw error expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function</span>]] [[File:Throw error collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function, in its collapsed view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function, in its collapsed view</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Handling errors in compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> While it is useful to allow functions to raise expected errors, it is crucial to be able to handle errors in your compositions in order to safely use these functions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say you want to create a new function "full name of a person" – we will refer to it with the ZID <code>Z30010</code>. This function should return the full name of a person given a first and last names, but if any of the two fields are empty, it should return the text "Unknown" instead. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You could create a composition using our example function "Join two strings with a space" or <code>Z30000</code> to generate the name. If any of the inputs are empty, you know that <code>Z30000</code> will throw an error of type <code>Z30005</code>. Using the function {{Z|Z850}} as a wrapper, you can attempt the join operation and intercept a possible error to simply return "Unknown" whenever it occurs. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Try-Catch function (Z850) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z850}} function is built-in with ZID <code>Z850</code> and takes three arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – The initial function call to run. If nothing goes wrong, the response will be the result of this function call.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – An error type to catch in case it is thrown during the execution of the first function call.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error handler''' – A function call that will be run in case the error specified above is caught during the execution of the initial function call. If that happens, the result of the error handler will be the value returned.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Try-Catch ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Once we have all the functions for our composition, we can craft it like this: </div> <syntaxhighlight lang="prolog"> try_catch( join_with_space( Z30010K1, Z30010K2 ), Z30005, echo( "Unknown" ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This means that: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">The "Join two strings with a space" function will be tried with the two inputs and, if everything goes well, the output of this function will be returned</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If any of the inputs are blank, "Join two strings with a space" with raise an error of type <code>Z30005</code></span> * <span lang="en" dir="ltr" class="mw-content-ltr">Our {{Z|Z850}} will then detect this error and run the {{Z|Z801}} function to return "Unknown"</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's create this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›” icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the outermost function you want to use, which in this case is "Try-Catch".</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Set the main function call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under the field where the "Try-Catch" function is selected, next to the "function call" key, click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the function "join two strings with space"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and select "argument reference", then select the "first name" argument from the dropdown.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and select "argument reference", then select the "second name" argument from the dropdown.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Select the error to catch:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error type", search and select "bad string input" – you can search directly by its ZID <code>Z30005</code></span> # <span lang="en" dir="ltr" class="mw-content-ltr">Set the error handler function call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "error handler", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "echo"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "input" and "type", search and select the type "String"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now, under "input", type "Unknown" in the text field</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The resulting function should look like this: </div> [[File:Try catch expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in expanded mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in expanded mode</span>]] [[File:Try catch collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in collapsed mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in collapsed mode</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Testing your failure use cases === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As we introduced in the above section about [[#Practice Test-Driven Development|practicing TDD]], it's important to test not only the most common paths, but also the possible edge cases. It is equally important to test failure behavior. In this section we will give you the tools necessary to test that your function fails with a given set of inputs, and that the error thrown is the expected one. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> To do that, you will need other two system functions: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Is error type (Z852) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z852}} function is built-in with ZID <code>Z852</code> and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error''' – An {{Z|Z5}} object, which can be thrown by a failing call. An error instance has a type and a value.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – A reference to an {{Z|Z50}} which will be compared to the type of the Error passed as a first argument. If that's the case, the function will return true.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Get error thrown by function call (Z853) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z853}} function is built-in with ZID <code>Z853</code> and takes one argument: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – A function call which can either return a successful value of any type, or throw an error.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> This function returns a {{Z|Z882}} with a {{Z|Z40}} in first place and an {{Z|Z1}} in the second: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the Function call runs successfully and hence does not throw any error, the returned pair will contain False in the first place, and void in the second.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the Function call throws an error, the returned pair will contain True in the first place, and the caught error in the second.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> To use this function in your compositions, you might need to use the additional functions: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">{{Z|Z821}}, and</span> * {{Z|Z822}} <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Testing errors ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say our target function, "Join two strings with a space" or <code>Z30000</code>, throws an error of type <code>Z30005</code> and we want to test this behavior. To do that we need to: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Throw a failing function call</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Get the error using the function {{Z|Z853}}</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Check that the error is the right type with {{Z|Z852}}</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Tests have two fields: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Call''' – A function call that will produce an output with the inputs you want to test. This call will return a value.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Result validation''' – A function call that will validate that the value returned by the call above is the expected one. The first argument of this function call will be automatically assigned to take the return value of the first call.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> For step-by-step instructions on how to create tests, see {{ll|Wikifunctions:Introduction#Create_tests}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In our example, we can structure it like this — but this is not the only way! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The call, which will return an {{Z|Z5}} object: </div> <syntaxhighlight lang="prolog"> error = get_second_element_of_typed_list( get_error_thrown_by( join_strings_by_whitespace( "", "not empty" ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> And the result validation, which will take the {{Z|Z5}} object as its first argument: </div> <syntaxhighlight lang="prolog"> is_error_type( error, Z30005 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's do this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding a test by clicking on the "+" button in the "Tests" table from your Function page. The "call" and "result validation" fields already have some functions pre-set, but to test the errors we will need to change them.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">First, let's set the call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "call", click the "›" chevron button to expand the function call.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", edit the field and search and select the function "Get second element of a typed pair"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Once selected, next to "Typed pair", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Get error thrown by function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "function call", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Join two strings with a space" (or by ZID <code>Z30000</code>)</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now set the inputs so that they cause a failure: at least one of them should be empty.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse your "call" by clicking again on the down-chevron button if you want!</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Next, let's set the result validation:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "result validation", click the "›" chevron button to expand the function call.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", edit the field and search and select the function "Is error type"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now you will only be asked to configure the second argument. Under "error type", search and select your <code>Z30005</code> error type.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">And you are done! You can now click the circular arrow in the "Implementations" box and you should see green checks.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> If everything went right, you can now save your test. It should look like this: </div> [[File:Get error expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in expanded mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in expanded mode</span>]] [[File:Get error collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in collapsed mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in collapsed mode</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Creating actionable error messages === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As described above, Error Types have an optional key <code>Z50K3</code> which contains a multilingual list of HTML strings. When rendering information about an error, the messages stored in the error type can help create a clear, precise, informative, translatable and actionable error message. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For that purpose, error messages can contain parameters like <code>$1</code>, <code>$2</code>, etc., where the digit corresponds to the error type argument and its value in the error instance. These error messages are rendered in Wikifunctions inside the "Details" dialog window after executing a function call. Additionally, these error messages are surfaced in other client interfaces, like Abstract Wikipedia, to provide better guidance to Abstract Content editors. </div> [[File:Wikifunctions actionable error message example in the Details dialog.png|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">The error message is rendered using the HTML message of the error type and the error argument values.</span>]] [[File:Wikifunctions actionable error message example in Abstract Wikipedia.png|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">When available, the HTML error message is rendered in the Abstract Wikipedia preview section.</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> Let's use a real example to understand the benefits of HTML error messages: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The function {{Z|Z37847}} returns the first Lexeme reference given a Wikidata Item reference and a language. When there is no Lexeme for this Item-Language combination, it throws an error of type {{Z|Z28248}}, which has three keys: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K1''' is the input Wikidata item QID</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K2''' is the connecting property, in this case <code>P5137/item for this sense</code></span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K3''' is the language code</span> <div lang="en" dir="ltr" class="mw-content-ltr"> When calling this function for a Wikidata lexeme that doesn't exist, the call will throw an error instance like this: </div> <syntaxhighlight lang="json" highlight="10,12"> { "Z1K1": "Z5", "Z5K1": "Z28248", "Z5K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z885", "Z885K1": "Z28248" }, "Z28248K1": "Q319", "Z28248K2": "P5137", "Z28248K3": "ast" } } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> While the error type label indicates: <code>No matching lexeme for item in language</code>, a better error message should indicate: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">which is the failing item,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">which is the language missing, and</span> * <span lang="en" dir="ltr" class="mw-content-ltr">what are the possible ways to fix it.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The error message <code>Z50K3</code> field can provide this functionality. Whenever an Error Type has an error message for the user language (or any of its fallbacks), the error message shown will be rendered by: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">First, replacing the message parameters with the values of the keys. In our example, any <code>$1</code> will be replaced with the value of <code>Z28248K1</code> ("Q319"), <code>$2</code> with "P5137", and <code>$3</code> with "ast",</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Last, sanitizing and rendering the HTML message.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> So a HTML message like: </div> <syntaxhighlight lang="html"> There is no matching lexeme for the item $1 in "$3".<br> <a href="http://wikidata.org/wiki/$1">Edit in Wikidata</a> </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Will become: </div> : There is no matching lexeme for the item Q319 in "ast" : [[d:Q319|Edit in Wikidata]] <div lang="en" dir="ltr" class="mw-content-ltr"> == Debugging your implementations == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Sometimes things can go wrong. A function might behave differently than expected or a value might not look quite right. Sometimes implementations are really complex and, because they are run in a sandboxed environment, it can seem really difficult to debug. To help understand what's going on inside a function call, Wikifunctions includes a small set of debugging tools. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> These tools don't change the result of a function, but will add extra information to the returned metadata, which you can observe after running the function. You can use <code>Wikifunctions.Debug()</code> from your code implementations or the function {{Z|Z854}} from your compositions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section you will learn: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">How to add debug messages from both code and composition implementations,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to inspect the metadata manually or via the UI to inspect these logs.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Debugging your code implementations === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> When writing code, both from JavaScript and Python3, you can use <code>Wikifunctions.Debug()</code> to add a message to your debugging log and continue the execution. </div> {{phab|T441028}} <div lang="en" dir="ltr" class="mw-content-ltr"> <code>Wikifunctions.Debug()</code> has one parameter, which is generally expected to be a string. However, any other object passed as parameter will get directly converted into a string. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If we want to add debug logs to our code implementations for our "Join two strings with a space" example function, we can do, in JavaScript: </div> <syntaxhighlight lang="JavaScript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { Wikifunctions.Debug( `first input is empty "${ Z30000K1 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { Wikifunctions.Debug( `second input is empty "${ Z30000K2 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } Wikifunctions.Debug( "both inputs are fine" ); return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> And the same in your Python3 implementation will be: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": Wikifunctions.Debug( 'first input is empty "'+Z30000K1+'"' ) Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": Wikifunctions.Debug( 'second input is empty "'+Z30000K2+'"' ) Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) Wikifunctions.Debug( 'both inputs are fine' ) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This way, no matter what happens, we will be adding one message to your debugging logs: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the function call fails when checking on the first or second input, the result of the execution will be a failure, but it will contain one informative log about what branch caused the failure.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the function call succeeds—because both inputs are valid—the function call will return the joined string, but the returned metadata will also contain a debug log.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Debugging your compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> To support debugging compositions, Wikifunctions provides the built-in function {{Z|Z854}}. This function allows you to attach debug messages to the execution of any function call that generates the final output. The debug logs collected during the evaluation are returned as part of the execution metadata, under the <code>executorDebugLogs</code> key. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Add debug log to function call (Z854) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z854}} function is built-in with ZID <code>Z854</code> and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – Any composition you want to execute.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Debug log''' – A string message that will be recorded if the given function call is evaluated.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> When the wrapped function call runs, the provided message is added to the execution logs. If that function call is not executed, or its execution is not part of the final output, its debug log will not appear in the final result metadata. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You will benefit from this built-in if you want to observe: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Which branch of a conditional was executed, or</span> * <span lang="en" dir="ltr" class="mw-content-ltr">the order of evaluation in a composition.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Add debug log to function call ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say that you want to add debug logs to our example function "Join two strings with a space" or <code>Z30000</code>, so that different messages are added to the different possible outcomes. You could use our debugging builtin like this: </div> <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), add_debug_log( throw_error( Z30005, ... ), 'failed on first input' ) if( is_empty_string( Z30000K2 ), add_debug_log( throw_error( Z30005, ... ), 'failed on second input' ), add_debug_log( join_with_separator( Z30000K1, Z30000K2, " " ), 'both inputs are ok!' ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This way, </div> * <span lang="en" dir="ltr" class="mw-content-ltr">when called with an empty first input, the function will return a failed response, and the metadata will contain an <code>executorDebugLogs</code> entry with the "failed on first input" log.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">When called with an empty second input, the call will also fail, but the logged message will be "failed on second input"</span> * <span lang="en" dir="ltr" class="mw-content-ltr">When called with valid inputs, the function will return a successful response, and additionally the metadata will contain "both inputs are ok" in its <code>executorDebugLogs</code> key.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> This is the way this composition would look: </div> [[File:Add debug log expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Composition implementation using Add debug logs to log all possible execution paths</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Composition implementation using Add debug logs to log all possible execution paths</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Accessing execution debug logs === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Whether your execution logs are added via <code>Wikifunctions.Debug()</code> or via the {{Z|Z854}} built-in function, they are returned as part of the response metadata. To see the logs, once you run your function, click on the "Details" button that appears at the bottom of the "Result" section. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The error and debug information will appear at the top of the "Details" dialog. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> This is what you would see when running the composition from our previous example with valid and invalid inputs: </div> {| class="wikitable" | [[File:Execution logs success.png|frameless|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a successful execution with debug logs</span>]] | [[File:Execution logs failure.png|frameless|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a failed execution with debug logs</span>]] |- | <span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a successful execution: shows no errors, but displays the successful execution log: ''"both inputs are ok!"''</span> | <span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a failed execution: shows the error information, and the additional execution log for the first failure branch: ''"failed on first input"''</span> |} [[Category:How to create implementations| {{#translation:}}]] mmsh8wgohl5gazklci5mx1akwoa5wd3 Wikifunctions:What Wikifunctions is not/kcg 4 68018 331064 227272 2026-10-23T08:06:07Z FuzzyBot 207 Updating to match new version of source page 331064 wikitext text/x-wiki <languages/> {{shortcut|[[WF:NOT]]}} {{Draft}} <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions is a new kind of website, aiming for a new community. We very much hope to work together with many tools, sites, communities, and kinds of systems that are out there: we want to play together with IDEs, with cloud computing platforms, with app development sites, and many more. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> But we also aim to be a novel thing and we hope to shape a new unique space out for us: a Wikimedia project for everyone to collaboratively create and maintain a library of code functions to support the Wikimedia projects and beyond, for everyone to call and re-use in the world's natural and programming languages. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The scope of the project is within bounds, though. So, let us also explore '''what Wikifunctions is not'''. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not an encyclopædia of algorithms == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> This means that we will '''not''' concentrate on having pages for famous and not-so famous algorithms such as [[w:Euclidean algorithm|Euclid's]], [[w:Newton's method|Newton's]], or [[w:Dijkstra's algorithm|Dijkstra's algorithm]], aiming to represent all existing algorithms faithfully and in their historical context. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Yes, we expect to have a function for the [[w:Greatest common divisor|greatest common divisor]] (GCD) of two integers. And there might be one or more implementations which are based on Euclid's algorithm to calculate the GCD. But Wikifunctions' main goal is not to gather algorithms, and it would not be incomplete if it didn't include some, and used alternatives instead to compute the GCD. If you are looking for that, many Wikipedias are actually [[w:List of algorithms|great resources]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Unlike an encyclopedic overview of existing algorithms, Wikifunctions will also invite original work. We will not be restricted to functions that have been published elsewhere first, and we do not require for every function and implementation to be based on previously published work. Wikifunctions, much like Wikibooks and very unlike Wikipedia, will be open to novel contributions. The main criteria for implementations will be: under which conditions can we run a given implementation, and what resources is it expected to take? </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not an app development site == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We do not expect to make it possible to create full-fledged, stand-alone apps within Wikifunctions — there will be no place to store state, we don't aim to allow calling external APIs or directly cause changes to other sites, and we don't aim to package up apps with icons and UX, etc. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We absolutely expect Wikifunctions to be a very useful resource for app developers, and can very much imagine apps that are basically wrappers around one or more functions from Wikifunctions, but these would still need code and other assets which wouldn't be part of Wikifunctions. We are not competing in the area of no-code or low-code development sites. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a code hosting service == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions will host code — but not for whole projects, merely for individual functions. There won't be libraries, apps, or services developed on Wikifunctions with bug-trackers, forums, etc. There won't be a Web-based version control system such as ''Mercurial'' or ''Git'' running against Wikifunctions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Again, we hope that there will be libraries, apps, and services that will rely on functions available in Wikifunctions, but they would be developed on a different site, such as ''Gerrit'', ''GitHub'', or ''GitLab''. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a programming language, nor is trying to evangelise a particular language == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions will allow for functions to be implemented in a multitude of programming languages. The possibility to compose functions together to create higher level functions may look a little bit like a new programming language, but it will be extremely limited compared to most other programming languages, since we only allow for nested function calls and that's it. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not an Integrated Development Environment (IDE) == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We won't provide you with an interface for creating and developing software projects, interfacing with build, testing, and source control systems. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a question-and-answer website == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We are not competing with ''Stack Overflow'' and similar websites, where a developer would ask how to achieve a certain task and have community members discuss and answer the question. We won't contain code snippets to help answer the question, but we will organize code within our website to enable the evaluation of functions within a library of functions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a cloud computing platform == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We do not provide computing resources and access to services and APIs so that you can run your computational needs on our platform, either for money or for free. Use of Wikifunctions's evaluation platform is to improve access to knowledge for everyone. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a code snippet website == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We are not competing with code snippet sites such as GitHub Gists, [[w:Rosetta_Code|Rosetta Code]], [https://esolangs.org/ esolangs.org], or [http://helloworldcollection.de/ helloworldcollection.de]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions differs in that it allows running code and composing existing functions together to create new ones. As well, Wikifunctions is for useful and meaningful code, not temporary, arbitrary snippets that other platforms may accept. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not a code education platform == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> We are not focused on teaching people how to code, the material in Wikifunctions will not be laid out in a pedagogical order, and we also won't make sure to comprehensively cover all topics important for coding. In fact, we aim for Wikifunctions to be usable for people who don't know how to code and who don't need to learn how to code to use most of Wikifunctions effectively. Though the Wikifunctions community may well help each other in sharing best practices, style guides, and tips on how to use the site in different languages, these will be aimed at the purpose of serving the world's knowledge. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not (only) the boiler room for Abstract Wikipedia == </div> [[File:Mechanical_room_in_basement._Wayne_N._Aspinall_Federal_Building_and_U.S._Courthouse,_Grand_Junction,_Colorado_LCCN2014650034.tif|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">A '[[d:Q6804549|boiler room]]', where unsightly-but-vital machinery is hidden</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> Natural language generation (NLG) is the focus of {{SITENAME}} as of 2026, and the site began as part of the wider [[meta:Special:MyLanguage/Abstract_Wikipedia|Abstract Wikipedia project]], but NLG is far from the only field in which functions are being developed. That is to say, WF is necessary for AW, but AW is not necessary for WF. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> On top of the computer science staples of Boolean logic, arithmetic, and list manipulation, we have useful functions relating to disciplines such as [[Z16718|chemistry]], [[Z35550|dimensional analysis]], [[Z20074|electrical engineering]], [[Z22162|genomics]], [[Z10393|information theory]], [[Z26830|meteorology]], [[Z13955|number theory]], [[Z27919|physiology]], [[Z20094|probability]], [[Z24497|quantum mechanics]], [[Z14226|railroad engineering]], [[Z28600|timekeeping/chronometry]], and [[Z26841|trigonometry]]. </div> [[Category:Project concept{{#translation:}}]] 2smnim7o7mo0nxlwhsyst4ch1dm8174 Wikifunctions:How to create implementations/kcg 4 68128 331117 296940 2026-10-23T08:23:24Z FuzzyBot 207 Updating to match new version of source page 331117 wikitext text/x-wiki <languages/> <div lang="en" dir="ltr" class="mw-content-ltr"> This page provides a more detailed guide to '''creating implementations''', beyond the overview at {{ll|Wikifunctions:Introduction}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Types of Implementations == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In Wikifunctions, an '''implementation''' can take one of two main forms: '''code''' or '''composition'''. A code implementation directly expresses the function’s logic in any of the available programming languages (currently, Python3 or JavaScript). It’s most useful when the function’s behavior can’t easily be built from existing Wikifunctions, or when precise control over data processing is needed. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> A composition implementation, on the other hand, defines the function entirely by combining other existing functions, without writing code. Compositions are easier to understand, reuse, and translate into other languages automatically, but they depend on suitable building blocks already being available and often are less performant. In general, start by checking whether your goal can be achieved through composition; if it can’t, or if performance or fine-grained logic matters, choose a code implementation instead. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> There's a third type of implementation: '''built-ins'''. These are run by system-built code, and are not editable. Most likely all pre-defined functions will have a built-in implementation. In such cases, when opening the implementation page, you will see a message stating ''"{{int|wikilambda-implementation-selector-none}}"'' </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Practice Test-Driven Development == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> '''Test-Driven Development''', or '''TDD''', is a way of creating software where you write tests before you write the actual code. Tests are just a way of understanding what your function is supposed to do by listing examples and how they should work. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In Wikifunctions, writing tests first offers significant benefits. If you are working on an implementation, you can run your code against the existing tests to check that it behaves as expected. This makes it easier to catch errors early before even publishing your implementation. Tests are also a powerful way to describe the function you need. By writing tests, '''you clearly communicate the expected behavior''', and the community can step in and help with the implementation, or create alternative implementations. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Imagine you want to implement a Function that combines two strings with a space in between. A basic test for this might look like: </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello", "world" ) => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Once you have defined the basic behavior, it's important to '''think about edge cases'''—situations where the inputs are such that you might need some special behavior. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, what if your first string ends in a space, or your second string starts with a space? Should the function keep all existing spaces and add another one, or should it return a neatly spaced result with just a single space between the words? Depending on your requirements, you should build a test for such a case. For example, a test for this edge case could be either one of these — but not both!: </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> or ... </div> <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Make sure that all possible special cases are covered by your tests, and once you have them, make sure that they are all connected to the Function by selecting them and clicking "Connect". </div> <div lang="en" dir="ltr" class="mw-content-ltr"> == Code implementations == </div> [[File:Code implementation.png|thumb|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions code editor initialized with a function template</span>|<span lang="en" dir="ltr" class="mw-content-ltr">When adding a new code implementation, the function template is initialized with the function and argument names</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> When creating an implementation using code, the Wikifunctions UI will set up a code editor with the selected language activated for syntax highlighting and validation. When the function to implement and the programming language are selected, this editor will be set with the correct function template: '''do not remove or edit this'''! Keep your code inside this function signature: if you need auxiliary functions, you can simply declare them inside your top-level function declaration. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Using input types in your code === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions types {{Z|Z6}} and {{Z|Z40}} can be used as if they were native types in both JavaScript and Python3. For example, a String input can be concatenated or a Boolean be directly used in a logical expression. To use other types in your code implementations, you will have to look deeper into the type, figure out if it has a conversion to a native equivalent, and treat it accordingly. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, let's say we want to write some Python code that handles an input of type {{Z|Z20420}}. In the page for this type, let's look at its "type converters to code" and search for a Python one. The converter {{Z|Z20424}} will be applied to our date input before our code, so looking at "native type" we know that our input will be a Python ''dict'' and looking at the implementation we can see the keys we can expect: </div> <syntaxhighlight lang="python3"> return { 'K1': year, 'K2': month, 'K3': day } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> When a type doesn't have a converter, you'll have to access its parts directly using its keys. For example, let's assume that your function <code>Z30000</code> has one input <code>Z30000K1</code> of type {{Z|Z11}}. This type has two keys: <code>Z11K1</code> for the language (itself an object of type {{Z|Z60}}), and <code>Z11K2</code> for the string value. Similarly, the language object has a key <code>Z60K1</code> for the language code. So, to get a string with the language code and the text, you can write: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1 ) { // e.g. "en: some text" return Z30000K1.Z11K1.Z60K1 + ": " + Z30000K1.Z11K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> For a quick reference of the available type conversions visit [[Special:MyLanguage/Wikifunctions:Execution targets#Default type conversion|the default type conversion table]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Returning the right outputs === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Similarly to the way you treat inputs, outputs need to match the type specified in the function definition. Some can be treated as simply as native types, so any string output will be converted into a Wikifunctions {{Z|Z6}} object and any native boolean returned by your implementation will be converted into a Wikifunctions {{Z|Z40}} object. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Those types that have "type converters from code" will apply the appropriate function to the output, in order to build the required type. Following the example of {{Z|Z20420}}, the {{Z|Z20443}} will transform the output from your implementation–a dict with K1, K2 and K3 keys–into its correct ZObject representation. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For types that don't have converters from code, you can carefully build and return the output objects. For example, imagine that our function <code>Z30000</code> takes two string inputs: language code and text, and should return a {{Z|Z11}} object. You can do this in Python by using the <code>ZObject</code> constructor: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): lang_object = ZObject( {"Z1K1": "Z9", "Z9K1": "Z60"}, Z60K1 = Z30000K1 ) return ZObject( {"Z1K1": "Z9", "Z9K1": "Z11"}, Z11K1 = lang_object, Z11K2 = Z30000K2 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Or in JavaScript: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { const langObject = new ZObject( new Map( [ [ "Z60K1", Z30000K1 ] ] ), { "Z1K1": "Z9", "Z9K1": "Z60" } ); const monolingualKeys = new Map( [ [ "Z11K1", langObject ], [ "Z11K2", Z30000K2 ] ] ); return new ZObject( monolingualKeys, { "Z1K1": "Z9", "Z9K1": "Z11" } ); } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> You can learn more about the <code>ZObject</code> class and other useful constructors in {{ll|Wikifunctions:Execution_targets#Custom_and_non-built-in_type_conversion}} </div> {{phab|T392750}}<div lang="en" dir="ltr" class="mw-content-ltr"> As of 2026-05, trying to return a list of lists may fail, so you're not able to implement such functions in code. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Code in Python === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section, we give a concrete example on how to create an implementation in the form of Code in Python. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is Z30000. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The implementation is defined using the ZID of the function. So are the arguments of the function. So in the case of the function Z30000 with its two arguments, the function template should look like this: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> As we described before, we know that the arguments (<code>Z30000K1</code> and <code>Z30000K2</code>) are Strings, so we can treat them as simply as we use native strings in Python. Also, the function should return a String. For our example, we simply return the two arguments concatenated with a space in between: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Since this is Python, do not forget to indent this line. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If you have followed our advice to [[#Practice Test-Driven Development|practice TDD]], you will already have a set of tests that you know should work. If that's the case, while building your implementation you can click on the circular arrow in the Tests panel, and see if your implementation passes all of them. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Remember that the runtime has no state. Don’t assume values for global or static variables. If you have further questions about what you can and cannot do in Python, ask on [[Wikifunctions:Python implementations]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Code in JavaScript === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section, we give a concrete example on how to create an implementation in the form of Code in JavaScript. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is <code>Z30000</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The implementation is defined using the ZID of the function. So are the arguments of the function. So in the case of the function <code>Z30000</code> with its two arguments, the function template should look like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> We know that the arguments (<code>Z30000K1</code> and <code>Z30000K2</code>) are Strings, so we can treat them as native strings in JavaScript. Also, the function should return a String. To complete our function, you can then add a line concatenating the input strings, like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> If you have tests as recommended in the [[#Practice Test-Driven Development|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes all of them. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Remember that the runtime has no state. Don’t assume values for global or static variables. If you have further questions about what you can and cannot do in JavaScript, ask on [[Wikifunctions:JavaScript implementations]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Calling another Wikifunctions function === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> A code implementation can call certain other Wikifunctions functions, receive the output of the call, and use that output in further processing. We refer to such calls as callbacks. At present, due to security and performance concerns, only the following built-in Wikidata fetch and search functions can be called in this way: {{Z|Z6820}}, {{Z|Z6821}}, {{Z|Z6822}}, {{Z|Z6824}}, {{Z|Z6825}}, {{Z|Z6826}}, {{Z|Z6830}}, and {{Z|Z6831}}. This capability is in an initial stage of deployment; we hope to allow calls to a broader range of functions in the future. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Let’s look at a JavaScript implementation containing a callback. This implementation fetches an item from Wikidata, extracts the label of that item in a given language, and returns the label string. The item to fetch is given by argument <code>Z400K1</code>, and the language is given by <code>Z400K2</code>. </div> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const item = Wikifunctions.Call('Z6821', Z400K1); for (const label of item.Z6001K2.Z12K1) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> A callback is made by calling <code>Wikifunctions.Call</code>, as shown in the example. The first argument to <code>Wikifunctions.Call</code> is always the ZID of the function to be called – in this case, {{Z|Z6821}}, which takes a single argument. Following that, the arguments to be passed to that function are listed, separated by commas. Here, that argument, <code>Z400K1</code>, is the same value that was passed to the function <code>Z400</code>. This is a common pattern of argument passing to callbacks, but their arguments can also be built using the <code>ZObject</code> constructor (as explained above), or obtained in other ways. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The value of <code>Z400K1</code> would be an instance of {{Z|Z6091}}, containing the QID of the item to be fetched. Line 2 of the example calls <code>Z6821</code> to fetch that item from Wikidata and assigns the resulting ZObject to the const <code>item</code>. The remaining code iterates over the item’s labels until it finds the one matching the language given by <code>Z400K2</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For the first example above, we have used <code>Z6821</code> for simplicity. However - unless an entire entity is needed by the implementation, it is strongly recommended to use <code>Z6820</code> to retrieve Wikidata items, which can be quite large. Although a call to <code>Z6820</code> is a bit more complex, its parameters allow for fetching selected portions of a Wikidata item, which can greatly improve performance and avoid some errors, by reducing the network bandwidth and processing time that are needed. (<code>Z6820</code> can also be used in place of <code>Z6822</code>, <code>Z6824</code>, <code>Z6825</code>, and <code>Z6826</code>, to get similar bandwidth-reduction benefits.) </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Just below we show how <code>Z6820</code> can be used, in <code>Wikifunctions.Call</code>, to implement the same behavior as above. Note that we use the second argument passed to <code>Z6820</code>, <code>[labelsPart]</code>, to say “Just return the item’s labels”, and we use the third argument, <code>[Z400K2]</code>, to say “Just return labels in the given language”. (This argument would also apply to aliases and descriptions, if they were included in the result.) </div> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const labelsPart = new ZObject( new Map( [ ['Z6030K1', new ZReference('Z6033')] ] ), {Z1K1: 'Z9', Z9K1: 'Z6030'} ); const entities = Wikifunctions.Call( 'Z6820', [Z400K1], [labelsPart], [Z400K2], []); const item = entities.get(Z400K1.Z6091K1); const labels = item.Z6001K2.Z12K1; for (const label of labels) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Other things to note: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Even though code implementations are now able to fetch Wikidata entities, it is recommended that they not be written to return ''entire'' entities. This is because of current limitations on the size of the value returned from a code implementation. To fetch and return an entire large entity, it’s better to call the fetch function from a composition.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Only one callback can execute at a time. For security reasons, it is not possible to use the concurrency features of JavaScript or Python to execute multiple callbacks in parallel.</span> ** <span lang="en" dir="ltr" class="mw-content-ltr">Keep in mind, however, that you can fetch multiple entities at once using Z6820.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">There is currently a 3 MiB limit on the size of Wikidata content that can be returned to a code implementation, by a single callback. The same limit applies to the size of the result returned from a code implementation.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> == Compositions == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section, we give a concrete example on how to create an implementation in the form of a composition. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is <code>Z30000</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> It is usually a good idea to first think about how to combine existing functions in order to create the desired output. Sometimes this might be trivial, and you can just go ahead with composing functions, but in many cases it is worthwhile to note the desired composition down. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, for the given Function, we could use the existing Function {{Z|Z10000}}. That Function takes two strings and makes one string out of them. But we need to add a space in between. So we first concatenate a space to the end of the first string, and then concatenate the second string to the result of that first concatenation. So our composition could be noted down like this: </div> <syntaxhighlight lang="prolog"> join_strings( join_strings( Z30000K1, " " ), Z30000K2 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> There are multiple ways to write a composition: notice that the same thing could be accomplished with: </div> <syntaxhighlight lang="prolog"> join_strings( Z30000K1, join_strings( " ", Z30000K2 ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> An alternative implementation could also use the existing Function {{Z|Z15175}}, so your composition could be: </div> <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> As you can see, there are multiple ways to accomplish this, so take your time and explore the existing functions available in the {{ll|Wikifunctions:Catalogue}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's try to create the second example, <code>join_strings(Z30000K1, join_strings(" ", Z30000K2))</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In order to create this: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›" icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search for the name of the outermost function you want to use, which in this example is "join two strings". Then, select the wanted function from the dropdown list.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">You will see two new fields, one for each of the arguments needed for the selected function.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">For the first argument, we want to select the first input to our function:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and select "Argument reference".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id" you can now select the first string of your function from the dropdown, which contains all available inputs.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">For the second argument, we want to use the result of another call to "join two strings":</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and select "Function call".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function you want to call, which is again "join two strings".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For this inner function call, configure the "first string" by simply typing a white space in the text field, and configure the "second string" as you did for step 6: change it using the "…" button to "Argument reference", and then select the second argument in the dropdown.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Your composition is now complete! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You can expand and collapse the details using the chevron buttons to see how it looks. If you already have Tests as recommended in the [[#Practice Test-Driven Development|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes the tests. Once your composition passes the tests, go ahead and publish it. </div> [[File:Composition implementation expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its expanded view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its expanded view</span>]] [[File:Composition implementation collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its collapsed view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its collapsed view</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions error handling == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As a Wikifunctions function creator, you might want to warn the user calling your function when something goes wrong in the code, or when their inputs do not fit a certain criteria. For example, if your Function expects a string input to contain a name, you might want to check that the name is not empty and, if it is, show an error message that the person using your Function can understand. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For this purpose, you can use <code>Wikifunctions.Error()</code> from your code implementations or the function {{Z|Z851}} from your compositions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section you will learn: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">How to throw errors from both code and composition implementations,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to write tests for error cases, and</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to catch and handle errors thrown by functions that you are using in your compositions.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Throwing errors from code implementations === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> When writing code, both from JavaScript and Python, you can use <code>Wikifunctions.Error()</code> to end the execution with a wanted error. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> <code>Wikifunctions.Error()</code> has two parameters: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Error type: a string containing the ZID of the error type you want to return.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Error arguments: a list of string arguments to build the error.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's go one by one: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Error type ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> An error type is an object that describes a kind of error that could happen in the system. There are a number of built-in error types but you can also build other error types that are more suited to your use case. When using errors, the best idea is to browse through the available error types, which can be explored in [[Special:ListObjectsByType/Z50|this list]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If there are no errors that fit your case, create a new one by going to the create page, and selecting "Error type" in the type selector. Then, set the necessary fields: </div> [[File:Error type.png|thumb|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Error type creation in Wikifunctions</span>|<span lang="en" dir="ltr" class="mw-content-ltr">To create new Error type (Z50), edit the label and add the necessary keys.</span>]] * <span lang="en" dir="ltr" class="mw-content-ltr">'''Label''' – This is the main title of the error, which should contain a short but descriptive message. Set the error label on the right-side box titled "About".</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Keys''' – Keys contain additional information about what caused the error. For example, if an input had the wrong format, you might want to inform the user of what was the input content when raising the error. To use them in your implementations, keys should be strings. To create a key, click on the "[+]" icon below "keys", select "String" under "value type", and add a label that describes it appropriately, for example "current input". Once you have all the necessary keys, you can Publish your error type and keep the ID of the newly created object.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error message''' – Error types can contain a multilingual array of HTML parametrized error messages. The parameter notation is $1, $2, etc., where the digit corresponds to the error type key. For example, when creating an error type with one string key "current input", the error message can use the positional parameter "$1", which will be replaced with the value of the "current input" key at the time of rendering the error. To add HTML messages, click on the "[+]" icon below "html fragments", select a language and input the HTML string.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Error arguments ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Error arguments correspond to the keys of the Error type, and they should provide additional information to understand the error. Error arguments should always be Strings. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Wikifunctions.Error() ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say that you want an error to be thrown when either your first or your second input are empty. You have already created the error type, and the assigned ZID was <code>Z30005</code>. Your error type has two string keys: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Input key: contains the key of the failing input</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Input value: contains the current value of the failing input</span> <div lang="en" dir="ltr" class="mw-content-ltr"> To raise an error in your JavaScript implementation you should do something like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { // If the first input is empty, raise error Z30005 // with two string args: [ first input key, first input value ] Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { // If the second input is empty, raise error Z30005 // with two string args: [ second input key, second input value ] Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> To raise an error in your Python implementation you should do something like this: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": # If the first input is empty, raise error Z30005 # with two string args: [ first input key, first input value ] Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": # If the second input is empty, raise error Z30005 # with two string args: [ first input key, first input value ] Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Remember that calling <code>Wikifunctions.Error()</code> ends the execution! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Throwing errors from compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If you are creating a composition implementation, you can throw an error by calling the special function {{Z|Z851}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Throw Error function (Z851) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z851}} function is similar to the <code>Wikifunctions.Error()</code> method and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – A reference to the Error type you want to raise</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error parameters''' – A list with the arguments to create your Error, which should also be Strings.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Throw Error ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say you want to modify your composition so that it first checks that the arguments are not empty, and raises an error when it finds an empty one. Then, if none of them are empty, it runs the original composition, which is: </div> <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> To do this, you need to create conditional paths, for which you can use the {{Z|Z802}} function. Think of it like this: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the first argument is empty, throw an error for the first argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Else, proceed to check the second argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the second argument is empty, throw an error for the second argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Else, proceed with the success path and return the joint strings with the space separator</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Or in functional pseudo code: </div> <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), throw_error( Z30005, [ "Z30000K1", Z30000K1 ] ), if( is_empty_string( Z30000K2 ), throw_error( Z30005, [ "Z30000K2", Z30000K2 ] ), join_with_separator( Z30000K1, Z30000K2, " " ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's create this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+” button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›” icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the outermost function you want to use, which in this case is "if".</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Check the validity of the first argument:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "condition", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "is empty string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "input", click on the "…" button and select "argument reference"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id", select the first input (e.g. "first string")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse the "condition" function call if you want, by clicking on the down-chevron next to "condition". You should see something like "f(x) is empty string( → first string )"</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Throw error if the condition is true:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "then", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Throw Error"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error type", search and select your error type (you can directly input the error ID if you know it, e.g. Z30005)</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error parameters", add two items by clicking on the "+" button</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For "Item 1" (offending argument key), set its type to "String" and write the argument identifier (e.g. "first input", or "Z30000K1")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For "Item 2" (offending argument value), click on the "…" next to "Item 2" and select "argument reference"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id", select the first input (e.g. "first string")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse the "then" function call if you want, by clicking on the down-chevron next to "then". You should see something like "f(x) Throw Error( Input was the wrong format, Typed list( Object, "first input", → first string ) )"</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Continue to check the second argument if the first was good:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "else", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "if"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Set up "condition" to check the validity of the second argument by following the same process as described in step 5.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Set up "then" to throw an error for the second argument by following the same process as described in step 6.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Finally, set up the success path:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to the nested "else", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the successful function, which in this case can be "join strings with separator"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and set it to "argument reference", then select "first string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and set it to "argument reference", then select "second string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "separator" add a space into the text field</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The resulting function call should look like this: </div> [[File:Throw error expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function</span>]] [[File:Throw error collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function, in its collapsed view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function, in its collapsed view</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Handling errors in compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> While it is useful to allow functions to raise expected errors, it is crucial to be able to handle errors in your compositions in order to safely use these functions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say you want to create a new function "full name of a person" – we will refer to it with the ZID <code>Z30010</code>. This function should return the full name of a person given a first and last names, but if any of the two fields are empty, it should return the text "Unknown" instead. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You could create a composition using our example function "Join two strings with a space" or <code>Z30000</code> to generate the name. If any of the inputs are empty, you know that <code>Z30000</code> will throw an error of type <code>Z30005</code>. Using the function {{Z|Z850}} as a wrapper, you can attempt the join operation and intercept a possible error to simply return "Unknown" whenever it occurs. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Try-Catch function (Z850) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z850}} function is built-in with ZID <code>Z850</code> and takes three arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – The initial function call to run. If nothing goes wrong, the response will be the result of this function call.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – An error type to catch in case it is thrown during the execution of the first function call.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error handler''' – A function call that will be run in case the error specified above is caught during the execution of the initial function call. If that happens, the result of the error handler will be the value returned.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Try-Catch ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Once we have all the functions for our composition, we can craft it like this: </div> <syntaxhighlight lang="prolog"> try_catch( join_with_space( Z30010K1, Z30010K2 ), Z30005, echo( "Unknown" ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This means that: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">The "Join two strings with a space" function will be tried with the two inputs and, if everything goes well, the output of this function will be returned</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If any of the inputs are blank, "Join two strings with a space" with raise an error of type <code>Z30005</code></span> * <span lang="en" dir="ltr" class="mw-content-ltr">Our {{Z|Z850}} will then detect this error and run the {{Z|Z801}} function to return "Unknown"</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's create this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›” icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the outermost function you want to use, which in this case is "Try-Catch".</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Set the main function call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under the field where the "Try-Catch" function is selected, next to the "function call" key, click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the function "join two strings with space"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and select "argument reference", then select the "first name" argument from the dropdown.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and select "argument reference", then select the "second name" argument from the dropdown.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Select the error to catch:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error type", search and select "bad string input" – you can search directly by its ZID <code>Z30005</code></span> # <span lang="en" dir="ltr" class="mw-content-ltr">Set the error handler function call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "error handler", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "echo"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "input" and "type", search and select the type "String"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now, under "input", type "Unknown" in the text field</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The resulting function should look like this: </div> [[File:Try catch expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in expanded mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in expanded mode</span>]] [[File:Try catch collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in collapsed mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in collapsed mode</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Testing your failure use cases === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As we introduced in the above section about [[#Practice Test-Driven Development|practicing TDD]], it's important to test not only the most common paths, but also the possible edge cases. It is equally important to test failure behavior. In this section we will give you the tools necessary to test that your function fails with a given set of inputs, and that the error thrown is the expected one. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> To do that, you will need other two system functions: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Is error type (Z852) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z852}} function is built-in with ZID <code>Z852</code> and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error''' – An {{Z|Z5}} object, which can be thrown by a failing call. An error instance has a type and a value.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – A reference to an {{Z|Z50}} which will be compared to the type of the Error passed as a first argument. If that's the case, the function will return true.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Get error thrown by function call (Z853) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z853}} function is built-in with ZID <code>Z853</code> and takes one argument: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – A function call which can either return a successful value of any type, or throw an error.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> This function returns a {{Z|Z882}} with a {{Z|Z40}} in first place and an {{Z|Z1}} in the second: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the Function call runs successfully and hence does not throw any error, the returned pair will contain False in the first place, and void in the second.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the Function call throws an error, the returned pair will contain True in the first place, and the caught error in the second.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> To use this function in your compositions, you might need to use the additional functions: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">{{Z|Z821}}, and</span> * {{Z|Z822}} <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Testing errors ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say our target function, "Join two strings with a space" or <code>Z30000</code>, throws an error of type <code>Z30005</code> and we want to test this behavior. To do that we need to: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Throw a failing function call</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Get the error using the function {{Z|Z853}}</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Check that the error is the right type with {{Z|Z852}}</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Tests have two fields: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Call''' – A function call that will produce an output with the inputs you want to test. This call will return a value.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Result validation''' – A function call that will validate that the value returned by the call above is the expected one. The first argument of this function call will be automatically assigned to take the return value of the first call.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> For step-by-step instructions on how to create tests, see {{ll|Wikifunctions:Introduction#Create_tests}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In our example, we can structure it like this — but this is not the only way! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The call, which will return an {{Z|Z5}} object: </div> <syntaxhighlight lang="prolog"> error = get_second_element_of_typed_list( get_error_thrown_by( join_strings_by_whitespace( "", "not empty" ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> And the result validation, which will take the {{Z|Z5}} object as its first argument: </div> <syntaxhighlight lang="prolog"> is_error_type( error, Z30005 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's do this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding a test by clicking on the "+" button in the "Tests" table from your Function page. The "call" and "result validation" fields already have some functions pre-set, but to test the errors we will need to change them.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">First, let's set the call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "call", click the "›" chevron button to expand the function call.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", edit the field and search and select the function "Get second element of a typed pair"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Once selected, next to "Typed pair", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Get error thrown by function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "function call", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Join two strings with a space" (or by ZID <code>Z30000</code>)</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now set the inputs so that they cause a failure: at least one of them should be empty.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse your "call" by clicking again on the down-chevron button if you want!</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Next, let's set the result validation:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "result validation", click the "›" chevron button to expand the function call.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", edit the field and search and select the function "Is error type"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now you will only be asked to configure the second argument. Under "error type", search and select your <code>Z30005</code> error type.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">And you are done! You can now click the circular arrow in the "Implementations" box and you should see green checks.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> If everything went right, you can now save your test. It should look like this: </div> [[File:Get error expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in expanded mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in expanded mode</span>]] [[File:Get error collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in collapsed mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in collapsed mode</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Creating actionable error messages === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As described above, Error Types have an optional key <code>Z50K3</code> which contains a multilingual list of HTML strings. When rendering information about an error, the messages stored in the error type can help create a clear, precise, informative, translatable and actionable error message. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For that purpose, error messages can contain parameters like <code>$1</code>, <code>$2</code>, etc., where the digit corresponds to the error type argument and its value in the error instance. These error messages are rendered in Wikifunctions inside the "Details" dialog window after executing a function call. Additionally, these error messages are surfaced in other client interfaces, like Abstract Wikipedia, to provide better guidance to Abstract Content editors. </div> [[File:Wikifunctions actionable error message example in the Details dialog.png|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">The error message is rendered using the HTML message of the error type and the error argument values.</span>]] [[File:Wikifunctions actionable error message example in Abstract Wikipedia.png|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">When available, the HTML error message is rendered in the Abstract Wikipedia preview section.</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> Let's use a real example to understand the benefits of HTML error messages: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The function {{Z|Z37847}} returns the first Lexeme reference given a Wikidata Item reference and a language. When there is no Lexeme for this Item-Language combination, it throws an error of type {{Z|Z28248}}, which has three keys: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K1''' is the input Wikidata item QID</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K2''' is the connecting property, in this case <code>P5137/item for this sense</code></span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K3''' is the language code</span> <div lang="en" dir="ltr" class="mw-content-ltr"> When calling this function for a Wikidata lexeme that doesn't exist, the call will throw an error instance like this: </div> <syntaxhighlight lang="json" highlight="10,12"> { "Z1K1": "Z5", "Z5K1": "Z28248", "Z5K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z885", "Z885K1": "Z28248" }, "Z28248K1": "Q319", "Z28248K2": "P5137", "Z28248K3": "ast" } } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> While the error type label indicates: <code>No matching lexeme for item in language</code>, a better error message should indicate: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">which is the failing item,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">which is the language missing, and</span> * <span lang="en" dir="ltr" class="mw-content-ltr">what are the possible ways to fix it.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The error message <code>Z50K3</code> field can provide this functionality. Whenever an Error Type has an error message for the user language (or any of its fallbacks), the error message shown will be rendered by: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">First, replacing the message parameters with the values of the keys. In our example, any <code>$1</code> will be replaced with the value of <code>Z28248K1</code> ("Q319"), <code>$2</code> with "P5137", and <code>$3</code> with "ast",</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Last, sanitizing and rendering the HTML message.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> So a HTML message like: </div> <syntaxhighlight lang="html"> There is no matching lexeme for the item $1 in "$3".<br> <a href="http://wikidata.org/wiki/$1">Edit in Wikidata</a> </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Will become: </div> : There is no matching lexeme for the item Q319 in "ast" : [[d:Q319|Edit in Wikidata]] <div lang="en" dir="ltr" class="mw-content-ltr"> == Debugging your implementations == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Sometimes things can go wrong. A function might behave differently than expected or a value might not look quite right. Sometimes implementations are really complex and, because they are run in a sandboxed environment, it can seem really difficult to debug. To help understand what's going on inside a function call, Wikifunctions includes a small set of debugging tools. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> These tools don't change the result of a function, but will add extra information to the returned metadata, which you can observe after running the function. You can use <code>Wikifunctions.Debug()</code> from your code implementations or the function {{Z|Z854}} from your compositions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section you will learn: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">How to add debug messages from both code and composition implementations,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to inspect the metadata manually or via the UI to inspect these logs.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Debugging your code implementations === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> When writing code, both from JavaScript and Python3, you can use <code>Wikifunctions.Debug()</code> to add a message to your debugging log and continue the execution. </div> {{phab|T441028}} <div lang="en" dir="ltr" class="mw-content-ltr"> <code>Wikifunctions.Debug()</code> has one parameter, which is generally expected to be a string. However, any other object passed as parameter will get directly converted into a string. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If we want to add debug logs to our code implementations for our "Join two strings with a space" example function, we can do, in JavaScript: </div> <syntaxhighlight lang="JavaScript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { Wikifunctions.Debug( `first input is empty "${ Z30000K1 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { Wikifunctions.Debug( `second input is empty "${ Z30000K2 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } Wikifunctions.Debug( "both inputs are fine" ); return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> And the same in your Python3 implementation will be: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": Wikifunctions.Debug( 'first input is empty "'+Z30000K1+'"' ) Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": Wikifunctions.Debug( 'second input is empty "'+Z30000K2+'"' ) Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) Wikifunctions.Debug( 'both inputs are fine' ) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This way, no matter what happens, we will be adding one message to your debugging logs: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the function call fails when checking on the first or second input, the result of the execution will be a failure, but it will contain one informative log about what branch caused the failure.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the function call succeeds—because both inputs are valid—the function call will return the joined string, but the returned metadata will also contain a debug log.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Debugging your compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> To support debugging compositions, Wikifunctions provides the built-in function {{Z|Z854}}. This function allows you to attach debug messages to the execution of any function call that generates the final output. The debug logs collected during the evaluation are returned as part of the execution metadata, under the <code>executorDebugLogs</code> key. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Add debug log to function call (Z854) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z854}} function is built-in with ZID <code>Z854</code> and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – Any composition you want to execute.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Debug log''' – A string message that will be recorded if the given function call is evaluated.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> When the wrapped function call runs, the provided message is added to the execution logs. If that function call is not executed, or its execution is not part of the final output, its debug log will not appear in the final result metadata. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You will benefit from this built-in if you want to observe: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Which branch of a conditional was executed, or</span> * <span lang="en" dir="ltr" class="mw-content-ltr">the order of evaluation in a composition.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Add debug log to function call ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say that you want to add debug logs to our example function "Join two strings with a space" or <code>Z30000</code>, so that different messages are added to the different possible outcomes. You could use our debugging builtin like this: </div> <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), add_debug_log( throw_error( Z30005, ... ), 'failed on first input' ) if( is_empty_string( Z30000K2 ), add_debug_log( throw_error( Z30005, ... ), 'failed on second input' ), add_debug_log( join_with_separator( Z30000K1, Z30000K2, " " ), 'both inputs are ok!' ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This way, </div> * <span lang="en" dir="ltr" class="mw-content-ltr">when called with an empty first input, the function will return a failed response, and the metadata will contain an <code>executorDebugLogs</code> entry with the "failed on first input" log.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">When called with an empty second input, the call will also fail, but the logged message will be "failed on second input"</span> * <span lang="en" dir="ltr" class="mw-content-ltr">When called with valid inputs, the function will return a successful response, and additionally the metadata will contain "both inputs are ok" in its <code>executorDebugLogs</code> key.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> This is the way this composition would look: </div> [[File:Add debug log expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Composition implementation using Add debug logs to log all possible execution paths</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Composition implementation using Add debug logs to log all possible execution paths</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Accessing execution debug logs === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Whether your execution logs are added via <code>Wikifunctions.Debug()</code> or via the {{Z|Z854}} built-in function, they are returned as part of the response metadata. To see the logs, once you run your function, click on the "Details" button that appears at the bottom of the "Result" section. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The error and debug information will appear at the top of the "Details" dialog. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> This is what you would see when running the composition from our previous example with valid and invalid inputs: </div> {| class="wikitable" | [[File:Execution logs success.png|frameless|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a successful execution with debug logs</span>]] | [[File:Execution logs failure.png|frameless|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a failed execution with debug logs</span>]] |- | <span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a successful execution: shows no errors, but displays the successful execution log: ''"both inputs are ok!"''</span> | <span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a failed execution: shows the error information, and the additional execution log for the first failure branch: ''"failed on first input"''</span> |} [[Category:How to create implementations| {{#translation:}}]] dlmwu3u2p5okpwp642pllbzvcgl8mvp Wikifunctions:How to create implementations/sr-ec 4 71819 331123 296946 2026-10-23T08:23:28Z FuzzyBot 207 Updating to match new version of source page 331123 wikitext text/x-wiki <languages/> <div lang="en" dir="ltr" class="mw-content-ltr"> This page provides a more detailed guide to '''creating implementations''', beyond the overview at {{ll|Wikifunctions:Introduction}}. </div> <span id="Types_of_Implementations"></span> == Врсте Имплементација == <div lang="en" dir="ltr" class="mw-content-ltr"> In Wikifunctions, an '''implementation''' can take one of two main forms: '''code''' or '''composition'''. A code implementation directly expresses the function’s logic in any of the available programming languages (currently, Python3 or JavaScript). It’s most useful when the function’s behavior can’t easily be built from existing Wikifunctions, or when precise control over data processing is needed. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> A composition implementation, on the other hand, defines the function entirely by combining other existing functions, without writing code. Compositions are easier to understand, reuse, and translate into other languages automatically, but they depend on suitable building blocks already being available and often are less performant. In general, start by checking whether your goal can be achieved through composition; if it can’t, or if performance or fine-grained logic matters, choose a code implementation instead. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> There's a third type of implementation: '''built-ins'''. These are run by system-built code, and are not editable. Most likely all pre-defined functions will have a built-in implementation. In such cases, when opening the implementation page, you will see a message stating ''"{{int|wikilambda-implementation-selector-none}}"'' </div> <span id="Practice_Test-Driven_Development"></span> == Практикујте Развој Вођен Тестовима == <div lang="en" dir="ltr" class="mw-content-ltr"> '''Test-Driven Development''', or '''TDD''', is a way of creating software where you write tests before you write the actual code. Tests are just a way of understanding what your function is supposed to do by listing examples and how they should work. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In Wikifunctions, writing tests first offers significant benefits. If you are working on an implementation, you can run your code against the existing tests to check that it behaves as expected. This makes it easier to catch errors early before even publishing your implementation. Tests are also a powerful way to describe the function you need. By writing tests, '''you clearly communicate the expected behavior''', and the community can step in and help with the implementation, or create alternative implementations. </div> Замислите да желите да имплементирате Функцију која спаја два стринга са размаком између. Основни тест за ову функцију би могао да изгледа овако: <syntaxhighlight lang="prolog"> join_with_space( "Hello", "world" ) => "Hello world" </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Once you have defined the basic behavior, it's important to '''think about edge cases'''—situations where the inputs are such that you might need some special behavior. </div> На пример, шта ако се први стринг завршава размаком, или други стринг почиње размаком? Да ли би функција требало да задржи постојеће размаке и дода још један, или да врати резултат са само једним размаком између речи? У зависности од Ваших потреба, требало би написати тест за овај случај. На пример, тест за овај гранични случај би могао да изгледа као један од ова два: <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> или <syntaxhighlight lang="prolog"> join_with_space( "Hello ", " world") => "Hello world" </syntaxhighlight> Пробајте да покријете све могуће граничне случајеве тестовима. Након што завршите са писањем тестова, повежите их са функцијом кликом на дугме „Повежи”. <div lang="en" dir="ltr" class="mw-content-ltr"> == Code implementations == </div> [[File:Code implementation.png|thumb|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions code editor initialized with a function template</span>|<span lang="en" dir="ltr" class="mw-content-ltr">When adding a new code implementation, the function template is initialized with the function and argument names</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> When creating an implementation using code, the Wikifunctions UI will set up a code editor with the selected language activated for syntax highlighting and validation. When the function to implement and the programming language are selected, this editor will be set with the correct function template: '''do not remove or edit this'''! Keep your code inside this function signature: if you need auxiliary functions, you can simply declare them inside your top-level function declaration. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Using input types in your code === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Wikifunctions types {{Z|Z6}} and {{Z|Z40}} can be used as if they were native types in both JavaScript and Python3. For example, a String input can be concatenated or a Boolean be directly used in a logical expression. To use other types in your code implementations, you will have to look deeper into the type, figure out if it has a conversion to a native equivalent, and treat it accordingly. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, let's say we want to write some Python code that handles an input of type {{Z|Z20420}}. In the page for this type, let's look at its "type converters to code" and search for a Python one. The converter {{Z|Z20424}} will be applied to our date input before our code, so looking at "native type" we know that our input will be a Python ''dict'' and looking at the implementation we can see the keys we can expect: </div> <syntaxhighlight lang="python3"> return { 'K1': year, 'K2': month, 'K3': day } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> When a type doesn't have a converter, you'll have to access its parts directly using its keys. For example, let's assume that your function <code>Z30000</code> has one input <code>Z30000K1</code> of type {{Z|Z11}}. This type has two keys: <code>Z11K1</code> for the language (itself an object of type {{Z|Z60}}), and <code>Z11K2</code> for the string value. Similarly, the language object has a key <code>Z60K1</code> for the language code. So, to get a string with the language code and the text, you can write: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1 ) { // e.g. "en: some text" return Z30000K1.Z11K1.Z60K1 + ": " + Z30000K1.Z11K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> For a quick reference of the available type conversions visit [[Special:MyLanguage/Wikifunctions:Execution targets#Default type conversion|the default type conversion table]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Returning the right outputs === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Similarly to the way you treat inputs, outputs need to match the type specified in the function definition. Some can be treated as simply as native types, so any string output will be converted into a Wikifunctions {{Z|Z6}} object and any native boolean returned by your implementation will be converted into a Wikifunctions {{Z|Z40}} object. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Those types that have "type converters from code" will apply the appropriate function to the output, in order to build the required type. Following the example of {{Z|Z20420}}, the {{Z|Z20443}} will transform the output from your implementation–a dict with K1, K2 and K3 keys–into its correct ZObject representation. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For types that don't have converters from code, you can carefully build and return the output objects. For example, imagine that our function <code>Z30000</code> takes two string inputs: language code and text, and should return a {{Z|Z11}} object. You can do this in Python by using the <code>ZObject</code> constructor: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): lang_object = ZObject( {"Z1K1": "Z9", "Z9K1": "Z60"}, Z60K1 = Z30000K1 ) return ZObject( {"Z1K1": "Z9", "Z9K1": "Z11"}, Z11K1 = lang_object, Z11K2 = Z30000K2 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Or in JavaScript: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { const langObject = new ZObject( new Map( [ [ "Z60K1", Z30000K1 ] ] ), { "Z1K1": "Z9", "Z9K1": "Z60" } ); const monolingualKeys = new Map( [ [ "Z11K1", langObject ], [ "Z11K2", Z30000K2 ] ] ); return new ZObject( monolingualKeys, { "Z1K1": "Z9", "Z9K1": "Z11" } ); } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> You can learn more about the <code>ZObject</code> class and other useful constructors in {{ll|Wikifunctions:Execution_targets#Custom_and_non-built-in_type_conversion}} </div> {{phab|T392750}}<div lang="en" dir="ltr" class="mw-content-ltr"> As of 2026-05, trying to return a list of lists may fail, so you're not able to implement such functions in code. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Code in Python === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section, we give a concrete example on how to create an implementation in the form of Code in Python. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is Z30000. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The implementation is defined using the ZID of the function. So are the arguments of the function. So in the case of the function Z30000 with its two arguments, the function template should look like this: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> As we described before, we know that the arguments (<code>Z30000K1</code> and <code>Z30000K2</code>) are Strings, so we can treat them as simply as we use native strings in Python. Also, the function should return a String. For our example, we simply return the two arguments concatenated with a space in between: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Since this is Python, do not forget to indent this line. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If you have followed our advice to [[#Practice Test-Driven Development|practice TDD]], you will already have a set of tests that you know should work. If that's the case, while building your implementation you can click on the circular arrow in the Tests panel, and see if your implementation passes all of them. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Remember that the runtime has no state. Don’t assume values for global or static variables. If you have further questions about what you can and cannot do in Python, ask on [[Wikifunctions:Python implementations]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Code in JavaScript === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section, we give a concrete example on how to create an implementation in the form of Code in JavaScript. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is <code>Z30000</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The implementation is defined using the ZID of the function. So are the arguments of the function. So in the case of the function <code>Z30000</code> with its two arguments, the function template should look like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> We know that the arguments (<code>Z30000K1</code> and <code>Z30000K2</code>) are Strings, so we can treat them as native strings in JavaScript. Also, the function should return a String. To complete our function, you can then add a line concatenating the input strings, like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> If you have tests as recommended in the [[#Practice Test-Driven Development|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes all of them. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Remember that the runtime has no state. Don’t assume values for global or static variables. If you have further questions about what you can and cannot do in JavaScript, ask on [[Wikifunctions:JavaScript implementations]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> === Calling another Wikifunctions function === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> A code implementation can call certain other Wikifunctions functions, receive the output of the call, and use that output in further processing. We refer to such calls as callbacks. At present, due to security and performance concerns, only the following built-in Wikidata fetch and search functions can be called in this way: {{Z|Z6820}}, {{Z|Z6821}}, {{Z|Z6822}}, {{Z|Z6824}}, {{Z|Z6825}}, {{Z|Z6826}}, {{Z|Z6830}}, and {{Z|Z6831}}. This capability is in an initial stage of deployment; we hope to allow calls to a broader range of functions in the future. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Let’s look at a JavaScript implementation containing a callback. This implementation fetches an item from Wikidata, extracts the label of that item in a given language, and returns the label string. The item to fetch is given by argument <code>Z400K1</code>, and the language is given by <code>Z400K2</code>. </div> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const item = Wikifunctions.Call('Z6821', Z400K1); for (const label of item.Z6001K2.Z12K1) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> A callback is made by calling <code>Wikifunctions.Call</code>, as shown in the example. The first argument to <code>Wikifunctions.Call</code> is always the ZID of the function to be called – in this case, {{Z|Z6821}}, which takes a single argument. Following that, the arguments to be passed to that function are listed, separated by commas. Here, that argument, <code>Z400K1</code>, is the same value that was passed to the function <code>Z400</code>. This is a common pattern of argument passing to callbacks, but their arguments can also be built using the <code>ZObject</code> constructor (as explained above), or obtained in other ways. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The value of <code>Z400K1</code> would be an instance of {{Z|Z6091}}, containing the QID of the item to be fetched. Line 2 of the example calls <code>Z6821</code> to fetch that item from Wikidata and assigns the resulting ZObject to the const <code>item</code>. The remaining code iterates over the item’s labels until it finds the one matching the language given by <code>Z400K2</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For the first example above, we have used <code>Z6821</code> for simplicity. However - unless an entire entity is needed by the implementation, it is strongly recommended to use <code>Z6820</code> to retrieve Wikidata items, which can be quite large. Although a call to <code>Z6820</code> is a bit more complex, its parameters allow for fetching selected portions of a Wikidata item, which can greatly improve performance and avoid some errors, by reducing the network bandwidth and processing time that are needed. (<code>Z6820</code> can also be used in place of <code>Z6822</code>, <code>Z6824</code>, <code>Z6825</code>, and <code>Z6826</code>, to get similar bandwidth-reduction benefits.) </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Just below we show how <code>Z6820</code> can be used, in <code>Wikifunctions.Call</code>, to implement the same behavior as above. Note that we use the second argument passed to <code>Z6820</code>, <code>[labelsPart]</code>, to say “Just return the item’s labels”, and we use the third argument, <code>[Z400K2]</code>, to say “Just return labels in the given language”. (This argument would also apply to aliases and descriptions, if they were included in the result.) </div> <syntaxhighlight lang="javascript"> function Z400( Z400K1, Z400K2 ) { const labelsPart = new ZObject( new Map( [ ['Z6030K1', new ZReference('Z6033')] ] ), {Z1K1: 'Z9', Z9K1: 'Z6030'} ); const entities = Wikifunctions.Call( 'Z6820', [Z400K1], [labelsPart], [Z400K2], []); const item = entities.get(Z400K1.Z6091K1); const labels = item.Z6001K2.Z12K1; for (const label of labels) { if (label.Z11K1.Z60K1 === Z400K2.Z60K1) { return label.Z11K2; }} return 'NOT FOUND'; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Other things to note: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Even though code implementations are now able to fetch Wikidata entities, it is recommended that they not be written to return ''entire'' entities. This is because of current limitations on the size of the value returned from a code implementation. To fetch and return an entire large entity, it’s better to call the fetch function from a composition.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Only one callback can execute at a time. For security reasons, it is not possible to use the concurrency features of JavaScript or Python to execute multiple callbacks in parallel.</span> ** <span lang="en" dir="ltr" class="mw-content-ltr">Keep in mind, however, that you can fetch multiple entities at once using Z6820.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">There is currently a 3 MiB limit on the size of Wikidata content that can be returned to a code implementation, by a single callback. The same limit applies to the size of the result returned from a code implementation.</span> <span id="Compositions"></span> == Композиције == <div lang="en" dir="ltr" class="mw-content-ltr"> In this section, we give a concrete example on how to create an implementation in the form of a composition. Say we want to create an implementation for a Function which combines two input strings by putting a space between them, returning the result of that. Let’s assume the ZID of that function is <code>Z30000</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> It is usually a good idea to first think about how to combine existing functions in order to create the desired output. Sometimes this might be trivial, and you can just go ahead with composing functions, but in many cases it is worthwhile to note the desired composition down. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For example, for the given Function, we could use the existing Function {{Z|Z10000}}. That Function takes two strings and makes one string out of them. But we need to add a space in between. So we first concatenate a space to the end of the first string, and then concatenate the second string to the result of that first concatenation. So our composition could be noted down like this: </div> <syntaxhighlight lang="prolog"> join_strings( join_strings( Z30000K1, " " ), Z30000K2 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> There are multiple ways to write a composition: notice that the same thing could be accomplished with: </div> <syntaxhighlight lang="prolog"> join_strings( Z30000K1, join_strings( " ", Z30000K2 ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> An alternative implementation could also use the existing Function {{Z|Z15175}}, so your composition could be: </div> <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> As you can see, there are multiple ways to accomplish this, so take your time and explore the existing functions available in the {{ll|Wikifunctions:Catalogue}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's try to create the second example, <code>join_strings(Z30000K1, join_strings(" ", Z30000K2))</code>. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In order to create this: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›" icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search for the name of the outermost function you want to use, which in this example is "join two strings". Then, select the wanted function from the dropdown list.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">You will see two new fields, one for each of the arguments needed for the selected function.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">For the first argument, we want to select the first input to our function:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and select "Argument reference".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id" you can now select the first string of your function from the dropdown, which contains all available inputs.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">For the second argument, we want to use the result of another call to "join two strings":</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and select "Function call".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function you want to call, which is again "join two strings".</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For this inner function call, configure the "first string" by simply typing a white space in the text field, and configure the "second string" as you did for step 6: change it using the "…" button to "Argument reference", and then select the second argument in the dropdown.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Your composition is now complete! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You can expand and collapse the details using the chevron buttons to see how it looks. If you already have Tests as recommended in the [[#Practice Test-Driven Development|TDD]] section above, click on the circular arrow in the Tests panel and see if your implementation passes the tests. Once your composition passes the tests, go ahead and publish it. </div> [[File:Composition implementation expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its expanded view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its expanded view</span>]] [[File:Composition implementation collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its collapsed view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">A Wikifunctions composition implementation in its collapsed view</span>]] <span id="Wikifunctions_error_handling"></span> == Обрада грешака на Викифункцијама == <div lang="en" dir="ltr" class="mw-content-ltr"> As a Wikifunctions function creator, you might want to warn the user calling your function when something goes wrong in the code, or when their inputs do not fit a certain criteria. For example, if your Function expects a string input to contain a name, you might want to check that the name is not empty and, if it is, show an error message that the person using your Function can understand. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For this purpose, you can use <code>Wikifunctions.Error()</code> from your code implementations or the function {{Z|Z851}} from your compositions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section you will learn: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">How to throw errors from both code and composition implementations,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to write tests for error cases, and</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to catch and handle errors thrown by functions that you are using in your compositions.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Throwing errors from code implementations === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> When writing code, both from JavaScript and Python, you can use <code>Wikifunctions.Error()</code> to end the execution with a wanted error. </div> <code>Wikifunctions.Error()</code> има два параметра: # Тип грешке: стринг који садржи ZID врсте грешке коју желите да вратите. # <span lang="en" dir="ltr" class="mw-content-ltr">Error arguments: a list of string arguments to build the error.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's go one by one: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Error type ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> An error type is an object that describes a kind of error that could happen in the system. There are a number of built-in error types but you can also build other error types that are more suited to your use case. When using errors, the best idea is to browse through the available error types, which can be explored in [[Special:ListObjectsByType/Z50|this list]]. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If there are no errors that fit your case, create a new one by going to the create page, and selecting "Error type" in the type selector. Then, set the necessary fields: </div> [[File:Error type.png|thumb|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Error type creation in Wikifunctions</span>|<span lang="en" dir="ltr" class="mw-content-ltr">To create new Error type (Z50), edit the label and add the necessary keys.</span>]] * <span lang="en" dir="ltr" class="mw-content-ltr">'''Label''' – This is the main title of the error, which should contain a short but descriptive message. Set the error label on the right-side box titled "About".</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Keys''' – Keys contain additional information about what caused the error. For example, if an input had the wrong format, you might want to inform the user of what was the input content when raising the error. To use them in your implementations, keys should be strings. To create a key, click on the "[+]" icon below "keys", select "String" under "value type", and add a label that describes it appropriately, for example "current input". Once you have all the necessary keys, you can Publish your error type and keep the ID of the newly created object.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error message''' – Error types can contain a multilingual array of HTML parametrized error messages. The parameter notation is $1, $2, etc., where the digit corresponds to the error type key. For example, when creating an error type with one string key "current input", the error message can use the positional parameter "$1", which will be replaced with the value of the "current input" key at the time of rendering the error. To add HTML messages, click on the "[+]" icon below "html fragments", select a language and input the HTML string.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Error arguments ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Error arguments correspond to the keys of the Error type, and they should provide additional information to understand the error. Error arguments should always be Strings. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Wikifunctions.Error() ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say that you want an error to be thrown when either your first or your second input are empty. You have already created the error type, and the assigned ZID was <code>Z30005</code>. Your error type has two string keys: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Input key: contains the key of the failing input</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Input value: contains the current value of the failing input</span> <div lang="en" dir="ltr" class="mw-content-ltr"> To raise an error in your JavaScript implementation you should do something like this: </div> <syntaxhighlight lang="javascript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { // If the first input is empty, raise error Z30005 // with two string args: [ first input key, first input value ] Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { // If the second input is empty, raise error Z30005 // with two string args: [ second input key, second input value ] Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> To raise an error in your Python implementation you should do something like this: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": # If the first input is empty, raise error Z30005 # with two string args: [ first input key, first input value ] Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": # If the second input is empty, raise error Z30005 # with two string args: [ first input key, first input value ] Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Remember that calling <code>Wikifunctions.Error()</code> ends the execution! </div> <span id="Throwing_errors_from_compositions"></span> === Бацање грешака у композицијама === Ако правите композицију, можете бацити грешку позивом посебне функције {{Z|Z851}}. <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Throw Error function (Z851) ==== </div> Функција {{Z|Z851}} је слична методи <code>Wikifunctions.Error()</code> и прима два аргумента: * '''Врста грешке''' – Референца на Врсту грешке коју желите да баците * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error parameters''' – A list with the arguments to create your Error, which should also be Strings.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Throw Error ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say you want to modify your composition so that it first checks that the arguments are not empty, and raises an error when it finds an empty one. Then, if none of them are empty, it runs the original composition, which is: </div> <syntaxhighlight lang="prolog"> join_with_separator( Z30000K1, Z30000K2, " " ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> To do this, you need to create conditional paths, for which you can use the {{Z|Z802}} function. Think of it like this: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the first argument is empty, throw an error for the first argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Else, proceed to check the second argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the second argument is empty, throw an error for the second argument</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Else, proceed with the success path and return the joint strings with the space separator</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Or in functional pseudo code: </div> <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), throw_error( Z30005, [ "Z30000K1", Z30000K1 ] ), if( is_empty_string( Z30000K2 ), throw_error( Z30005, [ "Z30000K2", Z30000K2 ] ), join_with_separator( Z30000K1, Z30000K2, " " ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's create this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+” button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›” icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the outermost function you want to use, which in this case is "if".</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Check the validity of the first argument:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "condition", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "is empty string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "input", click on the "…" button and select "argument reference"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id", select the first input (e.g. "first string")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse the "condition" function call if you want, by clicking on the down-chevron next to "condition". You should see something like "f(x) is empty string( → first string )"</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Throw error if the condition is true:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "then", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Throw Error"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error type", search and select your error type (you can directly input the error ID if you know it, e.g. Z30005)</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error parameters", add two items by clicking on the "+" button</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For "Item 1" (offending argument key), set its type to "String" and write the argument identifier (e.g. "first input", or "Z30000K1")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">For "Item 2" (offending argument value), click on the "…" next to "Item 2" and select "argument reference"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "key id", select the first input (e.g. "first string")</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse the "then" function call if you want, by clicking on the down-chevron next to "then". You should see something like "f(x) Throw Error( Input was the wrong format, Typed list( Object, "first input", → first string ) )"</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Continue to check the second argument if the first was good:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "else", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "if"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Set up "condition" to check the validity of the second argument by following the same process as described in step 5.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Set up "then" to throw an error for the second argument by following the same process as described in step 6.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Finally, set up the success path:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to the nested "else", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the successful function, which in this case can be "join strings with separator"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and set it to "argument reference", then select "first string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and set it to "argument reference", then select "second string"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "separator" add a space into the text field</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The resulting function call should look like this: </div> [[File:Throw error expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function</span>]] [[File:Throw error collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function, in its collapsed view</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Throw Error function, in its collapsed view</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Handling errors in compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> While it is useful to allow functions to raise expected errors, it is crucial to be able to handle errors in your compositions in order to safely use these functions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say you want to create a new function "full name of a person" – we will refer to it with the ZID <code>Z30010</code>. This function should return the full name of a person given a first and last names, but if any of the two fields are empty, it should return the text "Unknown" instead. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You could create a composition using our example function "Join two strings with a space" or <code>Z30000</code> to generate the name. If any of the inputs are empty, you know that <code>Z30000</code> will throw an error of type <code>Z30005</code>. Using the function {{Z|Z850}} as a wrapper, you can attempt the join operation and intercept a possible error to simply return "Unknown" whenever it occurs. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Try-Catch function (Z850) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z850}} function is built-in with ZID <code>Z850</code> and takes three arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – The initial function call to run. If nothing goes wrong, the response will be the result of this function call.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – An error type to catch in case it is thrown during the execution of the first function call.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error handler''' – A function call that will be run in case the error specified above is caught during the execution of the initial function call. If that happens, the result of the error handler will be the value returned.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Try-Catch ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Once we have all the functions for our composition, we can craft it like this: </div> <syntaxhighlight lang="prolog"> try_catch( join_with_space( Z30010K1, Z30010K2 ), Z30005, echo( "Unknown" ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This means that: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">The "Join two strings with a space" function will be tried with the two inputs and, if everything goes well, the output of this function will be returned</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If any of the inputs are blank, "Join two strings with a space" with raise an error of type <code>Z30005</code></span> * <span lang="en" dir="ltr" class="mw-content-ltr">Our {{Z|Z850}} will then detect this error and run the {{Z|Z801}} function to return "Unknown"</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's create this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding an implementation by clicking on the "+" button in the "Implementations" table from your Function page.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Make sure that the option "composition" under "Implementation" is selected.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Click on the "›” icon or click the "Select Function" link to expand the function details.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the outermost function you want to use, which in this case is "Try-Catch".</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Set the main function call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under the field where the "Try-Catch" function is selected, next to the "function call" key, click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function" search and select the function "join two strings with space"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "first string", click on the "…" button and select "argument reference", then select the "first name" argument from the dropdown.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "second string", click on the "…" button and select "argument reference", then select the "second name" argument from the dropdown.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Select the error to catch:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "error type", search and select "bad string input" – you can search directly by its ZID <code>Z30005</code></span> # <span lang="en" dir="ltr" class="mw-content-ltr">Set the error handler function call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "error handler", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "echo"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "input" and "type", search and select the type "String"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now, under "input", type "Unknown" in the text field</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The resulting function should look like this: </div> [[File:Try catch expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in expanded mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in expanded mode</span>]] [[File:Try catch collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in collapsed mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Wikifunctions composition using Try-catch function, in collapsed mode</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Testing your failure use cases === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As we introduced in the above section about [[#Practice Test-Driven Development|practicing TDD]], it's important to test not only the most common paths, but also the possible edge cases. It is equally important to test failure behavior. In this section we will give you the tools necessary to test that your function fails with a given set of inputs, and that the error thrown is the expected one. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> To do that, you will need other two system functions: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Is error type (Z852) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z852}} function is built-in with ZID <code>Z852</code> and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error''' – An {{Z|Z5}} object, which can be thrown by a failing call. An error instance has a type and a value.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Error type''' – A reference to an {{Z|Z50}} which will be compared to the type of the Error passed as a first argument. If that's the case, the function will return true.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Get error thrown by function call (Z853) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z853}} function is built-in with ZID <code>Z853</code> and takes one argument: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – A function call which can either return a successful value of any type, or throw an error.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> This function returns a {{Z|Z882}} with a {{Z|Z40}} in first place and an {{Z|Z1}} in the second: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the Function call runs successfully and hence does not throw any error, the returned pair will contain False in the first place, and void in the second.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the Function call throws an error, the returned pair will contain True in the first place, and the caught error in the second.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> To use this function in your compositions, you might need to use the additional functions: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">{{Z|Z821}}, and</span> * {{Z|Z822}} <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Testing errors ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say our target function, "Join two strings with a space" or <code>Z30000</code>, throws an error of type <code>Z30005</code> and we want to test this behavior. To do that we need to: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Throw a failing function call</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Get the error using the function {{Z|Z853}}</span> * <span lang="en" dir="ltr" class="mw-content-ltr">Check that the error is the right type with {{Z|Z852}}</span> <div lang="en" dir="ltr" class="mw-content-ltr"> Tests have two fields: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Call''' – A function call that will produce an output with the inputs you want to test. This call will return a value.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Result validation''' – A function call that will validate that the value returned by the call above is the expected one. The first argument of this function call will be automatically assigned to take the return value of the first call.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> For step-by-step instructions on how to create tests, see {{ll|Wikifunctions:Introduction#Create_tests}}. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In our example, we can structure it like this — but this is not the only way! </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The call, which will return an {{Z|Z5}} object: </div> <syntaxhighlight lang="prolog"> error = get_second_element_of_typed_list( get_error_thrown_by( join_strings_by_whitespace( "", "not empty" ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> And the result validation, which will take the {{Z|Z5}} object as its first argument: </div> <syntaxhighlight lang="prolog"> is_error_type( error, Z30005 ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Let's do this step by step: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">Start adding a test by clicking on the "+" button in the "Tests" table from your Function page. The "call" and "result validation" fields already have some functions pre-set, but to test the errors we will need to change them.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">First, let's set the call:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "call", click the "›" chevron button to expand the function call.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", edit the field and search and select the function "Get second element of a typed pair"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Once selected, next to "Typed pair", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Get error thrown by function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Next to "function call", click on the "…" button and select "function call"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", search and select the function "Join two strings with a space" (or by ZID <code>Z30000</code>)</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now set the inputs so that they cause a failure: at least one of them should be empty.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">You can now collapse your "call" by clicking again on the down-chevron button if you want!</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Next, let's set the result validation:</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "result validation", click the "›" chevron button to expand the function call.</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Under "function", edit the field and search and select the function "Is error type"</span> ## <span lang="en" dir="ltr" class="mw-content-ltr">Now you will only be asked to configure the second argument. Under "error type", search and select your <code>Z30005</code> error type.</span> # <span lang="en" dir="ltr" class="mw-content-ltr">And you are done! You can now click the circular arrow in the "Implementations" box and you should see green checks.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> If everything went right, you can now save your test. It should look like this: </div> [[File:Get error expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in expanded mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in expanded mode</span>]] [[File:Get error collapsed.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in collapsed mode</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Testing a failure using Get error and Is error type functions, in collapsed mode</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Creating actionable error messages === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> As described above, Error Types have an optional key <code>Z50K3</code> which contains a multilingual list of HTML strings. When rendering information about an error, the messages stored in the error type can help create a clear, precise, informative, translatable and actionable error message. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> For that purpose, error messages can contain parameters like <code>$1</code>, <code>$2</code>, etc., where the digit corresponds to the error type argument and its value in the error instance. These error messages are rendered in Wikifunctions inside the "Details" dialog window after executing a function call. Additionally, these error messages are surfaced in other client interfaces, like Abstract Wikipedia, to provide better guidance to Abstract Content editors. </div> [[File:Wikifunctions actionable error message example in the Details dialog.png|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">The error message is rendered using the HTML message of the error type and the error argument values.</span>]] [[File:Wikifunctions actionable error message example in Abstract Wikipedia.png|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">When available, the HTML error message is rendered in the Abstract Wikipedia preview section.</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> Let's use a real example to understand the benefits of HTML error messages: </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The function {{Z|Z37847}} returns the first Lexeme reference given a Wikidata Item reference and a language. When there is no Lexeme for this Item-Language combination, it throws an error of type {{Z|Z28248}}, which has three keys: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K1''' is the input Wikidata item QID</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K2''' is the connecting property, in this case <code>P5137/item for this sense</code></span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Z28248K3''' is the language code</span> <div lang="en" dir="ltr" class="mw-content-ltr"> When calling this function for a Wikidata lexeme that doesn't exist, the call will throw an error instance like this: </div> <syntaxhighlight lang="json" highlight="10,12"> { "Z1K1": "Z5", "Z5K1": "Z28248", "Z5K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z885", "Z885K1": "Z28248" }, "Z28248K1": "Q319", "Z28248K2": "P5137", "Z28248K3": "ast" } } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> While the error type label indicates: <code>No matching lexeme for item in language</code>, a better error message should indicate: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">which is the failing item,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">which is the language missing, and</span> * <span lang="en" dir="ltr" class="mw-content-ltr">what are the possible ways to fix it.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> The error message <code>Z50K3</code> field can provide this functionality. Whenever an Error Type has an error message for the user language (or any of its fallbacks), the error message shown will be rendered by: </div> # <span lang="en" dir="ltr" class="mw-content-ltr">First, replacing the message parameters with the values of the keys. In our example, any <code>$1</code> will be replaced with the value of <code>Z28248K1</code> ("Q319"), <code>$2</code> with "P5137", and <code>$3</code> with "ast",</span> # <span lang="en" dir="ltr" class="mw-content-ltr">Last, sanitizing and rendering the HTML message.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> So a HTML message like: </div> <syntaxhighlight lang="html"> There is no matching lexeme for the item $1 in "$3".<br> <a href="http://wikidata.org/wiki/$1">Edit in Wikidata</a> </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> Will become: </div> : There is no matching lexeme for the item Q319 in "ast" : [[d:Q319|Edit in Wikidata]] <div lang="en" dir="ltr" class="mw-content-ltr"> == Debugging your implementations == </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Sometimes things can go wrong. A function might behave differently than expected or a value might not look quite right. Sometimes implementations are really complex and, because they are run in a sandboxed environment, it can seem really difficult to debug. To help understand what's going on inside a function call, Wikifunctions includes a small set of debugging tools. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> These tools don't change the result of a function, but will add extra information to the returned metadata, which you can observe after running the function. You can use <code>Wikifunctions.Debug()</code> from your code implementations or the function {{Z|Z854}} from your compositions. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> In this section you will learn: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">How to add debug messages from both code and composition implementations,</span> * <span lang="en" dir="ltr" class="mw-content-ltr">how to inspect the metadata manually or via the UI to inspect these logs.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Debugging your code implementations === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> When writing code, both from JavaScript and Python3, you can use <code>Wikifunctions.Debug()</code> to add a message to your debugging log and continue the execution. </div> {{phab|T441028}} <div lang="en" dir="ltr" class="mw-content-ltr"> <code>Wikifunctions.Debug()</code> has one parameter, which is generally expected to be a string. However, any other object passed as parameter will get directly converted into a string. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> If we want to add debug logs to our code implementations for our "Join two strings with a space" example function, we can do, in JavaScript: </div> <syntaxhighlight lang="JavaScript"> function Z30000( Z30000K1, Z30000K2 ) { if ( trim( Z30000K1 ) === '' ) { Wikifunctions.Debug( `first input is empty "${ Z30000K1 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K1", Z30000K1 ] ) } if ( trim( Z30000K2 ) === '' ) { Wikifunctions.Debug( `second input is empty "${ Z30000K2 }"` ); Wikifunctions.Error( 'Z30005', [ "Z30000K2", Z30000K2 ] ) } Wikifunctions.Debug( "both inputs are fine" ); return Z30000K1 + " " + Z30000K2; } </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> And the same in your Python3 implementation will be: </div> <syntaxhighlight lang="python3"> def Z30000(Z30000K1, Z30000K2): if Z30000K1.strip() == "": Wikifunctions.Debug( 'first input is empty "'+Z30000K1+'"' ) Wikifunctions.Error("Z30005", ["Z30000K1", Z30000K1]) if Z30000K2.strip() == "": Wikifunctions.Debug( 'second input is empty "'+Z30000K2+'"' ) Wikifunctions.Error("Z30005", ["Z30000K2", Z30000K2]) Wikifunctions.Debug( 'both inputs are fine' ) return Z30000K1 + " " + Z30000K2 </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This way, no matter what happens, we will be adding one message to your debugging logs: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">If the function call fails when checking on the first or second input, the result of the execution will be a failure, but it will contain one informative log about what branch caused the failure.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">If the function call succeeds—because both inputs are valid—the function call will return the joined string, but the returned metadata will also contain a debug log.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> === Debugging your compositions === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> To support debugging compositions, Wikifunctions provides the built-in function {{Z|Z854}}. This function allows you to attach debug messages to the execution of any function call that generates the final output. The debug logs collected during the evaluation are returned as part of the execution metadata, under the <code>executorDebugLogs</code> key. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Add debug log to function call (Z854) ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The {{Z|Z854}} function is built-in with ZID <code>Z854</code> and takes two arguments: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Function call''' – Any composition you want to execute.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">'''Debug log''' – A string message that will be recorded if the given function call is evaluated.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> When the wrapped function call runs, the provided message is added to the execution logs. If that function call is not executed, or its execution is not part of the final output, its debug log will not appear in the final result metadata. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> You will benefit from this built-in if you want to observe: </div> * <span lang="en" dir="ltr" class="mw-content-ltr">Which branch of a conditional was executed, or</span> * <span lang="en" dir="ltr" class="mw-content-ltr">the order of evaluation in a composition.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> ==== Using Add debug log to function call ==== </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Say that you want to add debug logs to our example function "Join two strings with a space" or <code>Z30000</code>, so that different messages are added to the different possible outcomes. You could use our debugging builtin like this: </div> <syntaxhighlight lang="prolog"> if ( is_empty_string( Z30000K1 ), add_debug_log( throw_error( Z30005, ... ), 'failed on first input' ) if( is_empty_string( Z30000K2 ), add_debug_log( throw_error( Z30005, ... ), 'failed on second input' ), add_debug_log( join_with_separator( Z30000K1, Z30000K2, " " ), 'both inputs are ok!' ) ) ) </syntaxhighlight> <div lang="en" dir="ltr" class="mw-content-ltr"> This way, </div> * <span lang="en" dir="ltr" class="mw-content-ltr">when called with an empty first input, the function will return a failed response, and the metadata will contain an <code>executorDebugLogs</code> entry with the "failed on first input" log.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">When called with an empty second input, the call will also fail, but the logged message will be "failed on second input"</span> * <span lang="en" dir="ltr" class="mw-content-ltr">When called with valid inputs, the function will return a successful response, and additionally the metadata will contain "both inputs are ok" in its <code>executorDebugLogs</code> key.</span> <div lang="en" dir="ltr" class="mw-content-ltr"> This is the way this composition would look: </div> [[File:Add debug log expanded.png|frame|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Composition implementation using Add debug logs to log all possible execution paths</span>|<span lang="en" dir="ltr" class="mw-content-ltr">Composition implementation using Add debug logs to log all possible execution paths</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> === Accessing execution debug logs === </div> <div lang="en" dir="ltr" class="mw-content-ltr"> Whether your execution logs are added via <code>Wikifunctions.Debug()</code> or via the {{Z|Z854}} built-in function, they are returned as part of the response metadata. To see the logs, once you run your function, click on the "Details" button that appears at the bottom of the "Result" section. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> The error and debug information will appear at the top of the "Details" dialog. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> This is what you would see when running the composition from our previous example with valid and invalid inputs: </div> {| class="wikitable" | [[File:Execution logs success.png|frameless|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a successful execution with debug logs</span>]] | [[File:Execution logs failure.png|frameless|center|alt=<span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a failed execution with debug logs</span>]] |- | <span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a successful execution: shows no errors, but displays the successful execution log: ''"both inputs are ok!"''</span> | <span lang="en" dir="ltr" class="mw-content-ltr">Function metadata dialog for a failed execution: shows the error information, and the additional execution log for the first failure branch: ''"failed on first input"''</span> |} [[Category:How to create implementations| {{#translation:}}]] 1t8xauiwv51nyvb1n1i3n8mzb3znn1o Wikifunctions:What Wikifunctions is not/nl 4 75995 331067 251554 2026-10-23T08:06:08Z FuzzyBot 207 Updating to match new version of source page 331067 wikitext text/x-wiki <languages/> {{shortcut|[[WF:NOT]]}} {{Draft}} Wikifuncties is een nieuw soort website, gericht op een nieuwe gemeenschap. We hopen heel graag samen te werken met veel hulpmiddelen, sites, gemeenschappen en soorten systemen die er zijn: we willen samenwerken met IDE's, cloud computing-platforms, app-ontwikkelingssites en nog veel meer. Maar we willen ook iets nieuws zijn en we hopen een nieuwe, unieke ruimte voor ons te vormen: een Wikimedia-project voor iedereen om samen een bibliotheek van codefuncties te maken en te onderhouden om de Wikimedia-projecten en daarbuiten te ondersteunen, zodat iedereen ze kan aanroepen en hergebruiken in de natuurlijke en programmeringstalen. De reikwijdte van het project is echter binnen grenzen. Laten we dus ook verkennen wat Wikifuncties niet is. <span id="Wikifunctions_is_not_an_encyclopædia_of_algorithms"></span> == Wikifuncties is geen encyclopedie van algoritmen == Dit betekent dat we ons '''niet''' zullen concentreren op pagina's voor beroemde en minder beroemde algoritmen zoals [[w:nl:Algoritme van Euclides|Euclides]], [[w:nl:Methode van Newton-Raphson|Newton's]], of [[w:nl:Dijkstra's algoritme|Dijkstra's algoritme]], met als doel alle bestaande algoritmen getrouw en in hun historische context weer te geven. Ja, we verwachten een functie te hebben voor de [[:nl:Grootste gemene deler|grootste gemene deler]] (GGD) van twee gehele getallen. En er kunnen een of meer implementaties zijn die gebaseerd zijn op het algoritme van Euclides om de GGD te berekenen. Maar het hoofddoel van Wikifuncties is niet het verzamelen van algoritmen, en het zou niet onvolledig zijn als er geen enkele werden opgenomen, en in plaats daarvan alternatieven werden gebruikt om de GGD te berekenen. Als u dat zoekt, zijn veel Wikipedia's eigenlijk [[w:List of algorithms|goede bronnen]]. In tegenstelling tot een encyclopedisch overzicht van bestaande algoritmen, nodigt Wikifuncties ook originele werken uit. We zullen niet beperkt zijn tot functies die eerst elders zijn gepubliceerd, en we vereisen niet dat elke functie en implementatie gebaseerd is op eerder gepubliceerd werk. Wikifuncties, net als Wikibooks en heel anders dan Wikipedia, staan open voor nieuwe bijdragen. De belangrijkste criteria voor implementaties zijn: onder welke voorwaarden kunnen we een bepaalde implementatie uitvoeren, en welke middelen wordt verwacht dat deze zal kosten? <span id="Wikifunctions_is_not_an_app_development_site"></span> == Wikifuncties is geen site voor app-ontwikkeling == We verwachten niet dat het mogelijk wordt gemaakt om volwaardige, zelfstandige apps binnen Wikifuncties te maken — er zal geen plek zijn om "state" op te slaan, we zijn niet van plan externe API's aan te roepen of direct wijzigingen aan andere sites te veroorzaken, en we zijn niet van plan apps te voorzien van pictogrammen, UX, enzovoort. We verwachten absoluut dat Wikifuncties een zeer nuttige bron zal zijn voor app-ontwikkelaars, en kunnen ons goed voorstellen dat apps in feite wrappers zijn rond één of meer functies van Wikifuncties, maar die nog steeds code en andere assets nodig hebben die geen deel uitmaken van Wikifuncties. We concurreren niet op het gebied van no-code of low-code development sites. <span id="Wikifunctions_is_not_a_code_hosting_service"></span> == Wikifuncties is geen site voor het hosten van code == Wikifuncties zal code hosten, maar niet voor hele projecten, alleen voor individuele functies. Er zullen geen bibliotheken, apps of services zijn die op Wikifuncties zijn ontwikkeld met bugtrackers, forums, enzovoort. Er zal geen webgebaseerd versiebeheersysteem zijn zoals ''Mercurial'' of ''Git''. We hopen dat er bibliotheken, apps en services zullen zijn die afhankelijk zijn van functies die beschikbaar zijn in Wikifuncties, maar die op een andere site worden ontwikkeld, zoals ''Gerrit'', ''GitHub'' of ''GitLab''. <span id="Wikifunctions_is_not_a_programming_language,_nor_is_trying_to_evangelise_a_particular_language"></span> == Wikifuncties is geen programmeertaal, ook zullen we geen bepaalde programmeertaal voor te schrijven == In Wikifuncties zal het mogelijk zijn om functies in een veelheid van programmeertalen te implementeren. De mogelijkheid om functies samen te maken om functies op hoger niveau te maken lijkt misschien op een nieuwe programmeertaal, door het toestaan van geneste functie-aanroepen, maar het zal extreem beperkt zijn in vergelijking met de programmeertalen. <span id="Wikifunctions_is_not_an_Integrated_Development_Environment_(IDE)"></span> == Wikifuncties is geen Integrated Development Environment (IDE) == We bieden u geen interface voor het maken en ontwikkelen van softwareprojecten, met interface met bouw-, testen- en broncontrolesystemen. <span id="Wikifunctions_is_not_a_question-and-answer_website"></span> == Wikifuncties is geen vraag en antwoord website == We concurreren niet met ''Stack Overflow'' en vergelijkbare websites, waar een ontwikkelaar vraagt hoe een bepaalde taak kan worden uitgevoerd en leden de vraag bespreken en beantwoorden. We zullen geen codefragmenten geven om de vraag te helpen beantwoorden, maar we organiseren wel code binnen onze website om de evaluatie van functies binnen een bibliotheek van functies mogelijk te maken. <span id="Wikifunctions_is_not_a_cloud_computing_platform"></span> == Wikifuncties is geen cloud computing-platform == Wij bieden geen resources en toegang tot services en API's, zodat u uw verwerking op ons platform kunt uitvoeren, al dan niet betaald. Het gebruik van het evaluatieplatform van Wikifuncties is bedoeld om de toegang tot kennis voor iedereen te verbeteren. <span id="Wikifunctions_is_not_a_code_snippet_website"></span> == Wikifuncties is geen website met stukjes code == We concurreren niet met codesnippet-sites zoals GitHub Gists, [[w:Rosetta_Code|Rosetta Code]], [https://esolangs.org/ esolangs.org] of [http://helloworldcollection.de/ helloworldcollection.de]. Wikifuncties verschilt doordat het het mogelijk maakt om code te draaien en bestaande functies samen te stellen om nieuwe te creëren. Daarnaast is Wikifuncties bedoeld voor nuttige en betekenisvolle code, niet voor tijdelijke, willekeurige fragmenten die andere platforms kunnen accepteren. <span id="Wikifunctions_is_not_a_code_education_platform"></span> == Wikifuncties is geen platform voor code-educatie == We zijn niet gericht op het onderwijzen van mensen hoe te coderen, het materiaal in Wikifuncties wordt niet in een pedagogische volgorde uiteengezet, en we zullen ook niet ervoor zorgen dat we alle belangrijke onderwerpen voor codering volledig behandelen. We willen dat Wikifuncties nuttig zijn voor mensen die niet weten hoe ze moeten coderen en die niet hoeven te leren om de meeste Wikifuncties effectief te gebruiken. Hoewel de Wikifunctions-gemeenschap elkaar wellicht helpt bij het delen van beste aanpakken, stijlgidsen en tips over het gebruik van de site in verschillende talen, zullen deze gericht zijn op het dienen van de kennis van de wereld. <div lang="en" dir="ltr" class="mw-content-ltr"> == Wikifunctions is not (only) the boiler room for Abstract Wikipedia == </div> [[File:Mechanical_room_in_basement._Wayne_N._Aspinall_Federal_Building_and_U.S._Courthouse,_Grand_Junction,_Colorado_LCCN2014650034.tif|thumb|<span lang="en" dir="ltr" class="mw-content-ltr">A '[[d:Q6804549|boiler room]]', where unsightly-but-vital machinery is hidden</span>]] <div lang="en" dir="ltr" class="mw-content-ltr"> Natural language generation (NLG) is the focus of {{SITENAME}} as of 2026, and the site began as part of the wider [[meta:Special:MyLanguage/Abstract_Wikipedia|Abstract Wikipedia project]], but NLG is far from the only field in which functions are being developed. That is to say, WF is necessary for AW, but AW is not necessary for WF. </div> <div lang="en" dir="ltr" class="mw-content-ltr"> On top of the computer science staples of Boolean logic, arithmetic, and list manipulation, we have useful functions relating to disciplines such as [[Z16718|chemistry]], [[Z35550|dimensional analysis]], [[Z20074|electrical engineering]], [[Z22162|genomics]], [[Z10393|information theory]], [[Z26830|meteorology]], [[Z13955|number theory]], [[Z27919|physiology]], [[Z20094|probability]], [[Z24497|quantum mechanics]], [[Z14226|railroad engineering]], [[Z28600|timekeeping/chronometry]], and [[Z26841|trigonometry]]. </div> [[Category:Project concept{{#translation:}}]] 44q330gzgcomym666g1cror63anucr4 Wikifunctions:Naming conventions/nl 4 76840 331147 326927 2026-10-23T08:29:49Z FuzzyBot 207 Updating to match new version of source page 331147 wikitext text/x-wiki <languages/> {{shortcut|[[WF:NC]]}} {{Draft}} De pagina heeft als doel enkele conventies samen te vatten met betrekking tot hoe objecten bij Wikifuncties worden benoemd. Omdat het nog een jong project is, zijn er nog niet veel richtlijnen vastgesteld. <span id="Capitalization"></span> == Hoofdlettergebruik == Sommige talen gebruiken hoofdletters en kleine letters. Labels van objecten moeten in zulke talen worden geschreven alsof het een gewone uitdrukking is. Gebruik van [[:w:en:Title case|Title case]] wordt afgeraden. Bijvoorbeeld, in plaats van ''Bereken De Afstand Tussen Aarde En Zon Op Een Bepaalde Datum'', typt u iets als ''bereken de afstand tussen aarde en zon op een bepaalde datum''. Schrijf alleen eigennamen en andere woorden met een hoofdletter zoals vereist door de regels van de taal waarin u schrijft. Dit geldt bijvoorbeeld voor zelfstandige naamwoorden in het Duits, en voor sommige woordklassen in het Engels, zoals dagen van de week en namen van talen. Schrijf die woorden niet met een hoofdletter als de regels van uw taal dit niet vereisen. Bij het benoemen van een vreemde taal in een label gebruikt u de hoofdletterconventies van die labeltaal (bijvoorbeeld, "Toki Pona" moet met een hoofdletter in een Engels label worden geschreven).Afkortingen moeten hun conventionele vorm gebruiken; gebruik bijvoorbeeld in het Engels "[[:en:RSA (cryptosystem)|RSA]]" en niet "rsa" voor de naam van het encryptie-algoritme. Volgens de conventie moeten de namen van objecten die gegevenstypen beschrijven, als eerste letter een hoofdletter (bijvoorbeeld [[Z1]] of [[Z8]]) hebben. <span id="Search_characters"></span> == Tekens gebruikt bij het zoeken == De zoekmachine gebruikt een paar tekens als modificatoren, dus vermijd deze aan het begin van een woord. Deze tekens zijn: <code>~ * \? - " !</code>. Let op dat "?" op zichzelf (in plaats van "\?") geen modifier is. Het is echter een teken voor "grijze ruimte". Andere dergelijke tekens zijn <code>~ ! @ # $ % ^ & ( ) _ + - = { } | [ ] \ : " ; ' < > ? , . /</code>. De zoekmachine behandelt deze (afzonderlijk of in combinatie) als onderdeel van de woordgrens. Dit is meestal geen probleem, maar als ze waarschijnlijk belangrijk zijn bij zoekopdrachten, moet u ze vermijden aan het begin of einde van een woord (of tussen woorden), tenzij het nodig is (bijvoorbeeld [[Z11729]]). Zie [[:mw:Special:MyLanguage/Help:CirrusSearch|Help:CirrusSearch]] voor details over hoe u kunt zoeken naar tekst met een van deze tekens. <span id="Implementation_names"></span> == Implementatie-namen == Bij het maken van een Implementatie vermeld de taal die u in de naam heeft gebruikt (Python/JavaScript/Composition). Als er meer dan één implementatie in dezelfde taal is, wordt aanbevolen om in de titel een beetje detail te geven over wat deze implementatie anders maakt. Bijvoorbeeld het benoemen van de algoritme-naam (als er een bestaat). <span id="Test_cases"></span> == Testgevallen == Labels van een testgeval zouden een aanwijzing moeten geven over wat er daar wordt gecontroleerd. Het hoeft niet per se waarden te bevatten voor elke invoer en uitvoer, maar zou in ieder geval een domein moeten specificeren dat er wordt gecontroleerd. U zou bijvoorbeeld kunnen zeggen dat deze test het gedrag controleert van een stringfunctie wanneer deze letters uit het cyrillische alfabet krijgt, of van een wiskundige functie wanneer een breuk of complex getal wordt doorgegeven. Als het testgeval verband houdt met een stringfunctie en u een stringargument in de testgevalnaam opneemt, omring het argument dan met citaten of merk het op een andere manier zodat duidelijk wordt wat de waarde is. Het is vooral nuttig als de waarde aan het begin of aan het einde een aanzienlijke lege ruimte heeft (bijvoorbeeld bij het testen van een functie voor het trimmen van tekst). <span id="Configuration_of_functions_for_given_languages"></span> == Configuratie van functies voor bepaalde talen == * Moet beginnen met "configuratie voor". ** Als de configuratie een displayfunctie is, moet deze "config for display" worden genoemd, gevolgd door de exacte naam van het type. ** Indien de configuratie een leesfunctie is, moet deze "config for reading" zijn, gevolgd door de exacte naam van het type. == Types == * Moet in een zin zijn (bijv. rationeel getal) ** Deze regel mag niet worden gevolgd als de typenaam buiten Wikifuncties wordt gebruikt en meestal in een slang-case vorm (bijv. {{Z|Z20838}}) is. <span id="Multi-lingual_labels"></span> == Meertalige labels == {{Phab|T359663}} Labels in ''meerdere talen'' (met de taalcode <code>mul</code>, met de [[d:Special:MyLanguage/Help:Default values for labels and aliases|Wikidata's conventie]]) kan worden gebruikt om het label te specificeren op een manier die geen woorden bevat, bijvoorbeeld als een wiskundige uitdrukking. Zie {{Z|10512}} als voorbeeld. Op het moment van schrijven gebruikt de software deze labels echter niet als vangnet. <span id="language-specific_local_naming_conventions"></span> == taalspecifieke lokale naamgevingsconventies == Sommige talen kunnen hun eigen taal-specifieke naamgevingsconventies hebben (dit moet waarschijnlijk worden besloten door middel van discussies binnen de gemeenschap die de taal spreekt, hoewel veel waarschijnlijk in concept zijn). * [[Wikifunctions:Naming conventions/日本語]] (Japanese) [[Category:Policy{{#translation:}}]] 7wuo50uiy28kkaj4mek77i4gtbfk1tr Z32308 0 78503 330872 308327 2026-10-22T12:53:13Z Mormegil 150 +cs 330872 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z32308" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6" }, "Z17K2": "Z32308K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "list" }, { "Z1K1": "Z11", "Z11K1": "Z1592", "Z11K2": "lista" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "リスト" }, { "Z1K1": "Z11", "Z11K1": "Z1062", "Z11K2": "seznam" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z32308K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" }, { "Z1K1": "Z11", "Z11K1": "Z1592", "Z11K2": "språk" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "言語" }, { "Z1K1": "Z11", "Z11K1": "Z1062", "Z11K2": "jazyk" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20", "Z32310", "Z41023", "Z41024", "Z41025" ], "Z8K4": [ "Z14", "Z32309" ], "Z8K5": "Z32308" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "join list of strings in given language (proper)" }, { "Z1K1": "Z11", "Z11K1": "Z1592", "Z11K2": "sammanfoga strängar med \",\" och \"och\" på språk" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "指定言語で文字列のリストを自然に結合" }, { "Z1K1": "Z11", "Z11K1": "Z1062", "Z11K2": "spojit řetězce v daném jazyce do seznamu s „a“" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1062", "Z31K2": [ "Z6", "seznam řetězců" ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "e.g. \"A, B and C\"" }, { "Z1K1": "Z11", "Z11K1": "Z1592", "Z11K2": "sammanfogar en lista med textsträngar med kommatecken och \"och\", alltså [\"A\", \"B\", \"C\"] =\u003E \"A, B och C\"" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "\"A, B, C\" / 英語なら \"A, B and C\"" }, { "Z1K1": "Z11", "Z11K1": "Z1062", "Z11K2": "Z dodaného seznamu řetězců udělá seznam podle pravidel uvedeného jazyka (v češtině oddělí čárkami a před posledním dá spojku „a“)." } ] } } oghzdjnuz9ruippfqxs28zkg22t22gd Z37726 0 87831 331005 326911 2026-10-23T02:08:29Z Affandy Murad 10666 Add Indonesian translation 331005 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z37726" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z89", "Z17K2": "Z37726K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "initial fragment" }, { "Z1K1": "Z11", "Z11K1": "Z1025", "Z11K2": "początkowy fragment" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "元のフラグメント" }, { "Z1K1": "Z11", "Z11K1": "Z1062", "Z11K2": "počáteční fragment" }, { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "fragmen awal" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z37726K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "QID to replace link to" }, { "Z1K1": "Z11", "Z11K1": "Z1025", "Z11K2": "QID odnośnika do zastąpienia" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "置換されるリンクのQID" }, { "Z1K1": "Z11", "Z11K1": "Z1062", "Z11K2": "odkazované QID, které se má nahradit tučným písmem" }, { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "QID untuk mengganti tautan ke" } ] } } ], "Z8K2": "Z89", "Z8K3": [ "Z20", "Z37727" ], "Z8K4": [ "Z14", "Z37728" ], "Z8K5": "Z37726" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "replace specific Abstract Wikipedia link with bold" }, { "Z1K1": "Z11", "Z11K1": "Z1025", "Z11K2": "zamiana linku Abstract Wiki do QID na pogrubienie" }, { "Z1K1": "Z11", "Z11K1": "Z1004", "Z11K2": "remplacer le lien vers l'item par du gras" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "特定の抽象ウィキペディアリンクを太字に置換" }, { "Z1K1": "Z11", "Z11K1": "Z1062", "Z11K2": "nahradit jeden odkaz Abstraktní Wikipedie tučným" }, { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Tautan Wikipedia Abstrak tertentu dicetak tebal." } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1025", "Z31K2": [ "Z6", "zastąp link do QID pogrubieniem w Abstrakcyjnej Wikipedii", "zamiana linku Abstrakcyjnej Wikipedii do QID na pogrubienie" ] }, { "Z1K1": "Z31", "Z31K1": "Z1002", "Z31K2": [ "Z6", "bold title", "bold subject of article", "replace Abstract Wikipedia link to QID with bold" ] }, { "Z1K1": "Z31", "Z31K1": "Z1830", "Z31K2": [ "Z6", "太字タイトル", "タイトルを太字", "記事の主題を太字" ] }, { "Z1K1": "Z31", "Z31K1": "Z1062", "Z31K2": [ "Z6", "ztučnit název", "tučný název" ] }, { "Z1K1": "Z31", "Z31K1": "Z1078", "Z31K2": [ "Z6", "judul tebal", "subjek artikel dicetak tebal", "ganti tautan Wikipedia pada bagian Abstrak yang mengarah ke QID dengan teks yang dicetak tebal" ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Intended as a wrapper for the first fragment in an article to replace a self-link with bolding the title item." }, { "Z1K1": "Z11", "Z11K1": "Z1025", "Z11K2": "Funkcja opakowująca pierwszy fragment artykułu, zastępująca odnośnik do samego siebie pogrubieniem etykiety opisywanego elementu." }, { "Z1K1": "Z11", "Z11K1": "Z1004", "Z11K2": "utilisé pour respecter les conventions de résumé introductif, où le titre de l'article est en gras" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "記事の最初のフラグメント用のラッパーとして、記事自身へのリンクをタイトル項目の太字表記に置き換えるための関数。" }, { "Z1K1": "Z11", "Z11K1": "Z1062", "Z11K2": "Určeno pro obalení prvního fragmentu článku, kde se odkaz na sebe vymění za ztučnění subjektu článku." }, { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Dimaksudkan sebagai pembungkus untuk fragmen pertama dalam sebuah artikel, guna mengganti tautan mandiri dengan menebalkan judul item tersebut." } ] } } rdsgcqlg0plt9wgh6ihgo2xe2d59o6k Z38053 0 88252 331004 316698 2026-10-23T02:01:17Z Affandy Murad 10666 Add Indonesian language 331004 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z38053" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z310", "Z17K2": "Z38053K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "image" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "画像" }, { "Z1K1": "Z11", "Z11K1": "Z1062", "Z11K2": "obrázek" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z38053K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item QID used to construct alt text" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "代替テキストを生成するために使用される項目QID" }, { "Z1K1": "Z11", "Z11K1": "Z1062", "Z11K2": "QID položky, podle které se má vyrobit alt text" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z38053K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language for alt text" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "代替テキストの言語" }, { "Z1K1": "Z11", "Z11K1": "Z1062", "Z11K2": "jazyk alternativního textu" } ] } } ], "Z8K2": "Z89", "Z8K3": [ "Z20", "Z38056" ], "Z8K4": [ "Z14", "Z38055" ], "Z8K5": "Z38053" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "image thumbnail with alt text set by QID" }, { "Z1K1": "Z11", "Z11K1": "Z1004", "Z11K2": "image en vignette avec texte alt issu d'un QID" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "QIDにより設定される代替テキスト付き画像サムネイル" }, { "Z1K1": "Z11", "Z11K1": "Z1062", "Z11K2": "náhled obrázku s alternativním textem podle QIDu" }, { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Gambar mini dengan teks alternatif diset oleh QID" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } iet28e8xqyn6j3fzmnlsa1kh5dr3cfa Z38956 0 89441 331034 326588 2026-10-23T03:04:11Z Affandy Murad 10666 add Indonesian translation 331034 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z38956" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z38956K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "entity" }, { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "entitas" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z38956K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" }, { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "bahasa" } ] } } ], "Z8K2": "Z89", "Z8K3": [ "Z20", "Z43841" ], "Z8K4": [ "Z14", "Z45215" ], "Z8K5": "Z38956" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "infobox for country" }, { "Z1K1": "Z11", "Z11K1": "Z1004", "Z11K2": "infobox pays" }, { "Z1K1": "Z11", "Z11K1": "Z1820", "Z11K2": "देश के लिए जानकारी डिब्बा" }, { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "kotak info untuk negara" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1002", "Z31K2": [ "Z6", "infobox for sovereign state" ] }, { "Z1K1": "Z31", "Z31K1": "Z1078", "Z31K2": [ "Z6", "kotak info untuk negara berdaulat" ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1820", "Z11K2": "देश के लिए विकिपीडिया शैली का व्यापक जानकारी डिब्बा" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Creates an HTML infobox for a country using Wikidata." }, { "Z1K1": "Z11", "Z11K1": "Z1004", "Z11K2": "Crée une infobox HTML pour un pays en utilisant Wikidata." }, { "Z1K1": "Z11", "Z11K1": "Z1078", "Z11K2": "Membuat kotak info HTML untuk suatu negara menggunakan Wikidata." } ] } } kisd0hl7ce0p0lo7694cx2bmi1mtzd5 User:IanVG 2 93632 330881 313809 2026-10-22T14:00:02Z IanVG 102152 330881 wikitext text/x-wiki I am interested in creating functions that will eventually assist with my Wikiversity engineering contributions. [[User:IanVG/Sandbox]] * Functions I created === Implementations connected === * {{Z|Z41431}} * {{Z|Z41433}} === Implementations not-connected but requested === * {{Z|Z41417}} * {{Z|Z41469}} * {{Z|Z41634}} * {{Z|Z41638}} * {{Z|Z41510}} * {{Z|Z41632}} * {{Z|Z41646}} === Implementation not-connected nor requested === * {{Z|Z42063}} * {{Z|Z46791}} === No implementation created yet === * {{Z|Z42169}} == Useful links == - 99of9 has some good ones * Wikiprojects that use wikifunctions * wikifunction naming conventions * [[Wikifunctions:Requests for connection and disconnection]] hk9322plj8mn7hqamvtq4ofawjumd8l 330886 330881 2026-10-22T14:06:12Z IanVG 102152 330886 wikitext text/x-wiki I am interested in creating functions that will eventually assist with my Wikiversity engineering contributions. [[User:IanVG/Sandbox]] * Functions I created === Implementations connected === * {{Z|Z41431}} * {{Z|Z41433}} === Implementations not-connected but requested === * {{Z|Z41417}} * {{Z|Z41469}} * {{Z|Z41634}} * {{Z|Z41638}} * {{Z|Z41510}} * {{Z|Z41632}} * {{Z|Z41646}} === Implementation not-connected nor requested === * {{Z|Z42063}} * {{Z|Z46791}} * {{Z|Z46796}} === No implementation created yet === * {{Z|Z42169}} == Useful links == - 99of9 has some good ones * Wikiprojects that use wikifunctions * wikifunction naming conventions * [[Wikifunctions:Requests for connection and disconnection]] 87uu67h31l2hu5gjprlj3ezcs4nxccu 330887 330886 2026-10-22T14:07:07Z IanVG 102152 330887 wikitext text/x-wiki I am interested in creating functions that will eventually assist with my Wikiversity engineering contributions. I've been contributing for {{#function:Z20744|01/09/2026|{{#time:j/n/Y}}}} days. [[User:IanVG/Sandbox]] * Functions I created === Implementations connected === * {{Z|Z41431}} * {{Z|Z41433}} === Implementations not-connected but requested === * {{Z|Z41417}} * {{Z|Z41469}} * {{Z|Z41634}} * {{Z|Z41638}} * {{Z|Z41510}} * {{Z|Z41632}} * {{Z|Z41646}} === Implementation not-connected nor requested === * {{Z|Z42063}} * {{Z|Z46791}} * {{Z|Z46796}} === No implementation created yet === * {{Z|Z42169}} == Useful links == - 99of9 has some good ones * Wikiprojects that use wikifunctions * wikifunction naming conventions * [[Wikifunctions:Requests for connection and disconnection]] ffe63yeu123cd4oiv0pma0l3vsch2np Z42093 0 94615 331011 330598 2026-10-23T02:23:46Z 99of9 1622 Added Z46847 to the approved list of test cases 331011 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z42093" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z42093K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "エンティティ" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "entity" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z42093K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "エンティティは既出?" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "entity repeated?" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6092" }, "Z17K2": "Z42093K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "含めるプロパティ" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "properties to include" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z42093K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "言語" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } } ], "Z8K2": "Z89", "Z8K3": [ "Z20", "Z42095", "Z46847" ], "Z8K4": [ "Z14", "Z42094" ], "Z8K5": "Z42093" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "ウィキデータの日付イベント文 (HTML)" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "dated event sentence from Wikidata, HTML" }, { "Z1K1": "Z11", "Z11K1": "Z1004", "Z11K2": "date d'un événement d'après Wikidata" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1830", "Z31K2": [ "Z6", "XはYにZされた。", "Xは、YにZされた。" ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "ウィキデータ項目の指定した日付プロパティから、指定言語で出来事を時系列順にまとめた文を生成します。対応する自然言語がない場合は非言語表現を返します。単一言語版はZ42091を参照。" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Generates a sentence summarizing selected dated events of a Wikidata item in chronological order in the specified language, using a non-linguistic form when unsupported. Monolingual version is Z42091." } ] } } c9vf8rj50ssy2qov9yq1xyfu381f4hp 331013 331011 2026-10-23T02:30:46Z 99of9 1622 nudge 331013 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z42093" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z42093K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "エンティティ" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "entity" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z42093K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "エンティティは既出?" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "entity repeated?" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6092" }, "Z17K2": "Z42093K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "含めるプロパティ" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "properties to include" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z42093K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "言語" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } } ], "Z8K2": "Z89", "Z8K3": [ "Z20", "Z42095", "Z46847" ], "Z8K4": [ "Z14", "Z42094" ], "Z8K5": "Z42093" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "ウィキデータの日付イベント文 (HTML)" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "dated event sentence from Wikidata" }, { "Z1K1": "Z11", "Z11K1": "Z1004", "Z11K2": "date d'un événement d'après Wikidata" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1830", "Z31K2": [ "Z6", "XはYにZされた。", "Xは、YにZされた。" ] }, { "Z1K1": "Z31", "Z31K1": "Z1002", "Z31K2": [ "Z6", "dated event sentence from Wikidata, HTML" ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "ウィキデータ項目の指定した日付プロパティから、指定言語で出来事を時系列順にまとめた文を生成します。対応する自然言語がない場合は非言語表現を返します。単一言語版はZ42091を参照。" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Generates a sentence summarizing selected dated events of a Wikidata item in chronological order in the specified language, using a non-linguistic form when unsupported. Monolingual version is Z42091." } ] } } lxiiaooxgtmpnui6fc5arbvflia0llo Z42094 0 94616 331012 313466 2026-10-23T02:29:22Z 99of9 1622 try to include first set of references 331012 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z42094" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z42093", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z42230", "Z42230K1": { "Z1K1": "Z7", "Z7K1": "Z37464", "Z37464K1": { "Z1K1": "Z7", "Z7K1": "Z42091", "Z42091K1": { "Z1K1": "Z18", "Z18K1": "Z42093K1" }, "Z42091K2": { "Z1K1": "Z18", "Z18K1": "Z42093K2" }, "Z42091K3": { "Z1K1": "Z18", "Z18K1": "Z42093K3" }, "Z42091K4": { "Z1K1": "Z18", "Z18K1": "Z42093K4" } }, "Z37464K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z42090" } }, "Z37464K3": [ "Z6091", { "Z1K1": "Z18", "Z18K1": "Z42093K1" } ], "Z37464K4": [ "Z6091", { "Z1K1": "Z18", "Z18K1": "Z42093K1" } ], "Z37464K5": { "Z1K1": "Z18", "Z18K1": "Z42093K4" } }, "Z42230K2": { "Z1K1": "Z7", "Z7K1": "Z27926", "Z27926K1": [ "Z89", { "Z1K1": "Z7", "Z7K1": "Z38691", "Z38691K1": { "Z1K1": "Z7", "Z7K1": "Z23680", "Z23680K1": { "Z1K1": "Z7", "Z7K1": "Z22220", "Z22220K1": { "Z1K1": "Z7", "Z7K1": "Z30120", "Z30120K1": { "Z1K1": "Z18", "Z18K1": "Z42093K1" }, "Z30120K2": [ "Z6030", "Z6036" ], "Z30120K3": [ "Z60" ], "Z30120K4": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z18", "Z18K1": "Z42093K3" } } } } }, "Z38691K2": { "Z1K1": "Z18", "Z18K1": "Z42093K4" } } ] }, "Z42230K3": { "Z1K1": "Z18", "Z18K1": "Z42093K4" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "ウィキデータの日付イベント文 (HTML)、合成" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "dated event sentence from Wikidata, HTML, comp" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 4zmvs6slwonwv21tmcszqnzn38ztpw4 Z43950 0 96902 330895 320857 2026-10-22T15:09:21Z ReXLer 39813 330895 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z43950" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z43949", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z877", "Z877K1": { "Z1K1": "Z18", "Z18K1": "Z43949K1" }, "Z877K2": { "Z1K1": "Z89", "Z89K1": "Bunnypranav" } }, "Z802K2": { "Z1K1": "Z89", "Z89K1": "\u003Cspan style=\"font-family:monospace;font-weight:bold\"\u003E\u003Ca href=\"https://abstract.wikipedia.org/wiki/User:Bunnypranav\"\u003E\u003Cspan style=\"color:#63b3ed\"\u003E~/Bunny\u003C/span\u003E\u003Cspan style=\"color:#2c5282\"\u003Epranav\u003C/span\u003E\u003C/a\u003E:\u0026lt;\u003Ca href=\"https://abstract.wikipedia.org/wiki/User_talk:Bunnypranav\"\u003E\u003Cspan style=\"color:#63b3ed\"\u003Eping\u003C/span\u003E\u003C/a\u003E\u0026gt;\u003C/span\u003E\r\n" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z877", "Z877K1": { "Z1K1": "Z18", "Z18K1": "Z43949K1" }, "Z877K2": { "Z1K1": "Z89", "Z89K1": "JJPMaster" } }, "Z802K2": { "Z1K1": "Z89", "Z89K1": "\u003Ca href=\"https://abstract.wikipedia.org/wiki/User:JJPMaster\"\u003EJJP\u003C/a\u003E\u003Csub\u003E\u003Ca href=\"https://abstract.wikipedia.org/wiki/User_talk:JJPMaster\"\u003EMas\u003C/a\u003E\u003Csub\u003E\u003Ca href=\"https://abstract.wikipedia.org/wiki/Special:Contributions/JJPMaster\"\u003Eter\u003C/a\u003E\u003C/sub\u003E\u003C/sub\u003E (\u003Ca href=\"https://abstract.wikipedia.org/wiki/Q1270787\"\u003Eshe\u003C/a\u003E/\u003Ca href=\"https://abstract.wikipedia.org/wiki/Q3437264\"\u003Ethey\u003C/a\u003E)" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z877", "Z877K1": { "Z1K1": "Z18", "Z18K1": "Z43949K1" }, "Z877K2": { "Z1K1": "Z89", "Z89K1": "Ornithorynque liminaire" } }, "Z802K2": { "Z1K1": "Z89", "Z89K1": "\u003Ca href=\"https://abstract.wikipedia.org/wiki/User:Ornithorynque_liminaire\"\u003EOrnithorynque liminaire (she/they)\u003C/a\u003E (\u003Ca href=\"https://abstract.wikipedia.org/wiki/User_talk:Ornithorynque_liminaire\"\u003Etalk\u003C/a\u003E)" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z27926", "Z27926K1": [ "Z89", { "Z1K1": "Z89", "Z89K1": "\u003Ca href=\"https://abstract.wikipedia.org/wiki/User:" }, { "Z1K1": "Z18", "Z18K1": "Z43949K1" }, { "Z1K1": "Z89", "Z89K1": "\"\u003E" }, { "Z1K1": "Z18", "Z18K1": "Z43949K1" }, { "Z1K1": "Z89", "Z89K1": "\u003C/a\u003E (\u003Ca href=\"https://abstract.wikipedia.org/wiki/User_talk:" }, { "Z1K1": "Z18", "Z18K1": "Z43949K1" }, { "Z1K1": "Z89", "Z89K1": "\"\u003Etalk\u003C/a\u003E)" } ] } } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "user signature, comp" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ozfdeveshppnzrfo9q96k86wcrnqn0g Wikifunctions:Project chat/Archive/2026/09 4 97018 331035 330447 2026-10-23T03:08:05Z SpBot 978 archiving 1 section from [[Wikifunctions:Project chat]] (after section [[Wikifunctions:Project chat/Archive/2026/09#Technical_limitations_or_something_on_my_side?|Technical_limitations_or_something_on_my_side?]]) 331035 wikitext text/x-wiki {{Talkarchive}} == New visualisation templates to help editors navigate {{Z|14294}} == I've got {{Z|40885}} mostly working and I hacked together a version of [[Z40902|a tree view]] that's usable: take a look at [[Talk:Z25091]] and [[Talk:Z39262]]. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 02:35, 3 September 2026 (UTC) == Native implementations reading Z12 labels broken after recent deploy == {{tracked|T436918}} Native (JS/Python) implementations that read labels from their argument now get an empty <code>Z12K1</code>, so they return 0 items. Composition implementations are unaffected. Example: {{Z|Z24116}} (JS impl of {{Z|Z24114}}) with Q1 + [en, mul] returns 0 items, while composition {{Z|Z26569}} returns <code>["universe"]</code>. Cause: orchestrator commit [https://gitlab.wikimedia.org/repos/abstract-wiki/wikifunctions/function-orchestrator/-/commit/beb111db6c "Strip Z12 labels when resolving WFObjects"] (Aug 26), deployed in the 2026-09-02 services deploy. <code>fullyRealize()</code> now strips <code>Z12K1</code>, and native implementation arguments go through it (<code>WFImplementation.js</code>). I've temporarily disconnected Z24116/Z24770 from Z24114 so the working composition Z26569 is used. Question: Is stripping labels from native arguments intentional? How should native code access labels going forward? (FYI: Z24114 tester {{Z|Z36529}} is separately failing; Q30 has no <code>no</code> label; it's under <code>nb</code>/<code>nn</code> now.) [[User:鈴音雨|鈴音雨]] ([[User talk:鈴音雨|talk]]) 08:49, 3 September 2026 (UTC) :{{Z|Z23769}} is also broken. [[User:鈴音雨|鈴音雨]] ([[User talk:鈴音雨|talk]]) 09:46, 3 September 2026 (UTC) :It was intentional to remove some, but not intentional to remove all (or at least we didn't understand the effect). The development team are aware. --[[User:99of9|99of9]] ([[User talk:99of9|talk]]) 09:58, 3 September 2026 (UTC) :Should now be fixed. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 11:20, 4 September 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #263: 5,000 Functions, passing Z40000 == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-09-03|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we mark the 5,000th function on Wikifunction, we explore a new Type for functions, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Also, we remind you that if you have questions or ideas to discuss, the next '''Volunteers' Corner''' will be held on '''[https://zonestamp.toolforge.org/1788802200 September 7, at 17:30 UTC]''' ([https://meet.google.com/xuy-njxh-rkw link to the meeting]). Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 11:00, 4 September 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=30951652 --> == Help for optimizing functions == I developed {{Z|Z41075}}, but in many cases, {{Z|Z571}} or {{Z|Z574}} occurs. I understand that this function is trying to do a lot, but I am trying to find a way to make it lighter. Any advice would be appreciated. [[User:鈴音雨|鈴音雨]] ([[User talk:鈴音雨|talk]]) 06:47, 8 September 2026 (UTC) :I made a few changes, of which I think [[Special:Diff/311013|making all the fetch calls identical]] would have the most impact. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 17:55, 8 September 2026 (UTC) == Incorrect number formatting with uselang on Main Page == <code><nowiki>{{formatnum:{{NUMBEROFFUNCTIONS}}}}</nowiki></code> on [[Wikifunctions:Main_Page]] (or to be precise, on [[Template:Main page]]) evaluates using <code>PAGELANGUAGE</code> (en) by default, not <code>USERLANGUAGE</code>. Setting Polish as the interface language and/or appending <code>?uselang=pl</code> leaves English digit grouping (5,634, not Polish grouping: 5634). Is there a way to fix this? Because right now in Polish, <u>technically speaking</u>, it says there are "5.634 functions" (five and six hundred thirty-four thousandths), since a comma is used as a decimal separator in Polish. [[User:Wcalenieja|Wcalenieja]] ([[User talk:Wcalenieja|talk]]) 19:45, 9 September 2026 (UTC) :This problem has been repeatedly raised on [[WT:Main_Page|the talk page]] and ignored every time. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 21:32, 9 September 2026 (UTC) ::Oh, yeah, you're right :/ [[User:Wcalenieja|Wcalenieja]] ([[User talk:Wcalenieja|talk]]) 22:32, 9 September 2026 (UTC) :Will admin rights help with this? Or where should the change be? I take it we can't use an embedded call: {{#function:Z14280|5634|pl}}?--[[User:99of9|99of9]] ([[User talk:99of9|talk]]) 00:44, 10 September 2026 (UTC) ::Yep, admin rights are needed to edit [[Template:Main page]], since it's edit-protected. Hardcoding a static string defeats the purpose of using <code><nowiki>{{NUMBEROFFUNCTIONS}}</nowiki></code>, which automatically updates as new functions are added. AFAIK users should be navigated to language subpages (e.g., Wikifunctions:Main_Page/pl). On subpages, PAGELANGUAGE is explicitly pl, so standard <code><nowiki>{{formatnum:...}}</nowiki></code> works correctly. But to be honest I'm not that technical, so I may be wrong. [[User:Wcalenieja|Wcalenieja]] ([[User talk:Wcalenieja|talk]]) 10:45, 10 September 2026 (UTC) :::I guess I didn't mean hardcoding, I was more asking about using our own functional formatting by calling {{Z|Z14280}} with an embedded function call. It might look more like {{#function:Z14280|{{NUMBEROFFUNCTIONS}}|pl}} --[[User:99of9|99of9]] ([[User talk:99of9|talk]]) 10:53, 10 September 2026 (UTC) ::::That makes sense. Apologies, I misread your comment as suggesting a hardcoded string rather than a function call. But we should use <code><nowiki>{{#function:Z14280|{{NUMBEROFFUNCTIONS}}|{{int:lang}}}}</nowiki></code> instead of hardcoding <code>pl</code> :) [[User:Wcalenieja|Wcalenieja]] ([[User talk:Wcalenieja|talk]]) 11:03, 10 September 2026 (UTC) :::::Indeed. I think it is now working. This does risk the first visitor in each language seeing "function is being called"... So let's see if we get lots of complaints.--[[User:99of9|99of9]] ([[User talk:99of9|talk]]) 11:20, 10 September 2026 (UTC) == [[module:citation]] and templates == [[template:cite encyclopedia]] requires it [[User:Arlo Barnes|Arlo Barnes]] ([[User talk:Arlo Barnes|talk]]) 02:28, 13 September 2026 (UTC) :[[WF:AN]] to request imports from another wiki. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 02:59, 13 September 2026 (UTC) ::Thanks, moved to [[WF:administrators' noticeboard#importing module:citation and associated templates]]. [[User:Arlo Barnes|Arlo Barnes]] ([[User talk:Arlo Barnes|talk]]) 19:55, 13 September 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #264: Your code can now call back to the Wikidata fetch functions == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-09-10|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we introduce the possibility of calling Wikidata fetch functions, we present a new Type, we celebrate more than 200 new functions this week, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 13:13, 11 September 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=30951652 --> :Maybe with "call back to the Wikidata fetch functions" it would be possible to craate an implmentation for {{Z|Z38960}} as described in its discussion page. Who can help? [[User:HenkvD|HenkvD]] ([[User talk:HenkvD|talk]]) 12:43, 14 September 2026 (UTC) == Calculadora de Obras de Artista por Periodo == Hola, necesito una función que calcule a partir de dadas * Una fecha de inicio (dd/mm/aaaa) * Una fecha de final (dd/mm/aaaa) * Un artista o grupo de artistas La cantidad de obras hechas en ese periodo de tiempo por ese artista o grupo de artistas. [[User:Jackie SMG|Jackie SMG]] ([[User talk:Jackie SMG|talk]]) 05:40, 13 September 2026 (UTC) :Something like ([[d:Q41264|Q41264]], 1650-01-01, 1659-12-31) &rarr; [https://w.wiki/UVaJ 7]? That's not currently possible, because it needs to jump from the artist's Item to the works' Items (backlinks), which SPARQL can do but {{SITENAME}} cannot.<br>Something that is currently possible would be to take a list of works as arguments and filter them by date: [https://www.wikifunctions.org/wiki/Z22820?call=%7B%22Z1K1%22%3A%22Z7%22%2C%22Z7K1%22%3A%22Z22820%22%2C%22Z22820K1%22%3A%5B%22Z6091%22%2C%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q167605%22%7D%2C%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q185372%22%7D%2C%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q544315%22%7D%5D%2C%22Z22820K2%22%3A%7B%22Z1K1%22%3A%22Z7%22%2C%22Z7K1%22%3A%22Z873%22%2C%22Z873K1%22%3A%22Z29661%22%2C%22Z873K2%22%3A%7B%22Z1K1%22%3A%22Z7%22%2C%22Z7K1%22%3A%22Z31262%22%2C%22Z31262K1%22%3A%22Z42044%22%2C%22Z31262K2%22%3A%7B%22Z1K1%22%3A%22Z20420%22%2C%22Z20420K1%22%3A%7B%22Z1K1%22%3A%22Z20159%22%2C%22Z20159K1%22%3A%7B%22Z1K1%22%3A%22Z17813%22%2C%22Z17813K1%22%3A%22Z17814%22%7D%2C%22Z20159K2%22%3A%7B%22Z1K1%22%3A%22Z13518%22%2C%22Z13518K1%22%3A%221663%22%7D%7D%2C%22Z20420K2%22%3A%7B%22Z1K1%22%3A%22Z20342%22%2C%22Z20342K1%22%3A%7B%22Z1K1%22%3A%22Z16098%22%2C%22Z16098K1%22%3A%22Z16101%22%7D%2C%22Z20342K2%22%3A%7B%22Z1K1%22%3A%22Z13518%22%2C%22Z13518K1%22%3A%221%22%7D%7D%7D%2C%22Z31262K3%22%3A%7B%22Z1K1%22%3A%22Z7%22%2C%22Z7K1%22%3A%22Z873%22%2C%22Z873K1%22%3A%22Z39110%22%2C%22Z873K2%22%3A%7B%22Z1K1%22%3A%22Z7%22%2C%22Z7K1%22%3A%22Z13464%22%2C%22Z13464K1%22%3A%22Z39908%22%2C%22Z13464K2%22%3A%5B%22Z6091%22%2C%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q167605%22%7D%2C%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q185372%22%7D%2C%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q544315%22%7D%5D%2C%22Z13464K3%22%3A%7B%22Z1K1%22%3A%22Z6092%22%2C%22Z6092K1%22%3A%22P571%22%7D%7D%7D%2C%22Z31262K4%22%3A%7B%22Z1K1%22%3A%22Z20420%22%2C%22Z20420K1%22%3A%7B%22Z1K1%22%3A%22Z20159%22%2C%22Z20159K1%22%3A%7B%22Z1K1%22%3A%22Z17813%22%2C%22Z17813K1%22%3A%22Z17814%22%7D%2C%22Z20159K2%22%3A%7B%22Z1K1%22%3A%22Z13518%22%2C%22Z13518K1%22%3A%221667%22%7D%7D%2C%22Z20420K2%22%3A%7B%22Z1K1%22%3A%22Z20342%22%2C%22Z20342K1%22%3A%7B%22Z1K1%22%3A%22Z16098%22%2C%22Z16098K1%22%3A%22Z16112%22%7D%2C%22Z20342K2%22%3A%7B%22Z1K1%22%3A%22Z13518%22%2C%22Z13518K1%22%3A%2231%22%7D%7D%7D%7D%7D%7D example]. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 19:06, 13 September 2026 (UTC) ::Más o menos algo así quiero, que se haga mediante Wikidata. Aunque igualmente, ustedes son los que saben programar, por algo estoy aquí solicitando. Muchas gracias de igual forma. ::Esto es para un proyecto que tengo llamado [[:m:Wikimuseum ~ Art]], entonces necesito funciones para ese proyecto para no tener que calcular todo a mano. Les voy a dar actualizaciones si algo pasa. ::Atte: [[User:Jackie SMG|Jackie SMG]] ([[User talk:Jackie SMG|talk]]) 19:14, 13 September 2026 (UTC) :: Hola, soy yo de nuevo. Quiero darle las gracias a la comunidad de Wikifuntions por responder a mis dudas y les quiero avisar que, por motivo de [[:m:Wikimuseum ~ Art]], les voy a estar pidiendo funciones de forma continua para poder desarrollar este nuevo proyecto, el cual planea convertirse en un proyecto hermano. Muchas gracias por su atención. :: Atte: [[User:Jackie SMG|Jackie SMG]] ([[User talk:Jackie SMG|talk]]) 19:51, 15 September 2026 (UTC) == Categories, classifiers, tags and the Function catalogue == Functions are manually classified within the Function-catalogue sub-pages. Objects in the main namespace, including functions, may also be organized into traditional Wikimedia categories by categorizing their Talk pages. In addition, objects may also be grouped together using their labels or aliases; for example, equality functions are likely to have "==" as an alias. There may be other mechanisms that I have overlooked. These approaches share the drawback that they are essentially monolingual and, in practice, mainly restricted to English. I suggest that we should replace the English strings used for such purposes with {{Z|Z12}} objects and link to these wherever feasible. In the future, it may be possible to link directly from any {{Z|Z2}} to such a “tag” object, but I think we would need to create a Feature request on Phabricator for this. In the meantime, maybe we should explore using embedded function calls to provide headings within the Function catalogue? [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 10:26, 16 September 2026 (UTC) :Great ideas. I support all. --[[User:99of9|99of9]] ([[User talk:99of9|talk]]) 10:33, 16 September 2026 (UTC) :{{abbr|ICYMI|in case you missed it}}: {{t|function documentation}}<br>I don't understand where you intend to add [[Z12]]s, since the things you mentioned already use it. Cross-lingual/symbolic aliases [[phab:T359663|are still not working]].<br>Using our own [[Z32839|heading functions]] is a good idea, but the Items need to exist. Extension:Translate is probably the better choice on a lot of pages. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 20:05, 16 September 2026 (UTC) ::The Z12s themselves would be standalone objects, just like a category is a standalone page. Objects could link to them directly, by reference (subject to a change to the Z2 type definition to add a new key for a list of references). Alternatively, a standalone typed pair could link the Z12 object to the list of objects it categorizes, which would be easier for functions to operate over. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 20:53, 16 September 2026 (UTC) :::I still don't follow. Do you mean that the links to the persistent Z12 will serve as categorisation, with Special:WhatLinksHere for listing membership? [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 21:50, 16 September 2026 (UTC) ::::Basically… yes. But I imagine we’d have some more specific searches too. And an embedded function over a Separate association object might even populate an entire Catalogue section. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 22:30, 16 September 2026 (UTC) == The next Natural Language Generation Special Interest Group meeting is tomorrow! == Hi all! A quick message to inform you that Denny will lead a quick first introduction to syntactic phrase functions in the next '''Natural Language Generation Special Interest Group meeting''', that will be held tomorrow, '''[https://zonestamp.toolforge.org/1789488000 September 15, at 16:00 UTC]''' ([https://meet.google.com/xzn-kqer-mah link to the meeting]). See you at the meeting! In case you can't join, the meeting will be recorded and made available on Commons. -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 13:27, 14 September 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=30951652 --> :[[c:File:Abstract Wikipedia NLG SIG Meeting 2026-09.webm]] re: {{Z|39358}} [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 09:34, 17 September 2026 (UTC) == Wikifunctions & Abstract Wikipedia Newsletter #265: More engaging error messages == There is [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-09-18|a new update]] for Abstract Wikipedia and Wikifunctions. Please, come and read it! In this issue, we explain how we reworked error messaging, we talk about our recent and upcoming meetings, and we take a look at the latest software developments. Want to catch up with the previous updates? Check [[:f:Special:MyLanguage/Wikifunctions:Status updates|our archive]]! Enjoy the reading! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 12:59, 18 September 2026 (UTC) <!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Wikifunctions_%26_Abstract_Wikipedia&oldid=30951652 --> {{phab|T439423}} :The "message template" is used on WF too (as you show in [[:File:Wikifunctions_actionable_error_message_example_in_the_Details_dialog.png|the first screenshot there]]), but because it's used as the subtitle for the <q>Errors</q> collapsible section, clicking on hyperlinks collapses the section instead.<!-- --><br>edit: [[Talk:Z28248#Documentation|Made a visualisation]]. Although it now occurs to me that it's cached for a month, so maybe not that useful compared to a [https://www.wikifunctions.org/wiki/Z37847?call=%7B%22Z1K1%22%3A%22Z7%22%2C%22Z7K1%22%3A%22Z37847%22%2C%22Z37847K1%22%3A%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q319%22%7D%2C%22Z37847K2%22%3A%22Z1732%22%7D shared call URL]<!-- --> which has the error. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 05:40, 19 September 2026 (UTC) : <q>We also changed how we track rate limiting for actions including running Functions. These can happen a lot via API calls when using the front-end.</q><!-- --><br>Whatever you did, it now takes several minutes to see test results ''while writing an Implementation'',<!-- --> or to get the preview of an embedded function call. I would have thought those are the work units you'd want to prioritise.<!-- --><br>If you want to reduce the amount of work that gets queued, you could change the indiscriminate execution of the whole test matrix<!-- --> when any Impl/Test is dis/connected, and allow selective queuing of tests from the Implementation editor. [[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 08:51, 19 September 2026 (UTC) == Technical limitations or something on my side? == Hi there, I'm experimenting with different ways to improve NLG in French (many things to do). I experiment some limitations, I don't if they come from the software or something I did: # I tried to create a typed list in {{Z|Z42597}}, similarly to {{Z|Z38002}}, but impossible to add this type (I'm blocked with an empty content box). The Edit Raw JSON script also fails on publication. # I tried to find if an item is a subclass of another in {{Z|Z41641}} and {{Z|Z41649}}, but I only get the error "WASM interpreter aborted (unreachable executed)". Is it me? Or some current limitations? Are there workarounds? Any help appreciated! Cheers. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 14:38, 19 September 2026 (UTC) :1. Z42957 is a {{Z|Z6}}. It is possible to create a typed list of {{Z|Z6091}}, if that’s what you have in mind. :2. Yes, that’s a tricky one. I don’t have time right now, but I should be able to look at it in a few hours or tomorrow morning. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 18:24, 19 September 2026 (UTC) ::Thank you! For some reason I couldn't create a typed list earlier, but it looks fixed now (I was able to create {{Z|Z42639}}). The interface could still be a bit clearer... {{Z|Z42597}} can be deleted, btw. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 19:39, 19 September 2026 (UTC) :::Good. I agree, the interface for type specification is a little peculiar for “generic” types. :::I’ve had a little look at your second problem and I don’t have a quick fix. Theoretically, I think you want to apply the subclass test to each of the classes of which the item is an instance, having failed to establish that the item is an instance of the superclass. [https://www.wikifunctions.org/view/en/Z36572?call=%7B%22Z1K1%22%3A%22Z7%22%2C%22Z7K1%22%3A%22Z36572%22%2C%22Z36572K1%22%3A%7B%22Z1K1%22%3A%22Z7%22%2C%22Z7K1%22%3A%22Z30120%22%2C%22Z30120K1%22%3A%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q84%22%7D%2C%22Z30120K2%22%3A%5B%22Z6030%22%2C%22Z6036%22%5D%2C%22Z30120K3%22%3A%5B%22Z60%22%5D%2C%22Z30120K4%22%3A%5B%22Z6092%22%2C%7B%22Z1K1%22%3A%22Z6092%22%2C%22Z6092K1%22%3A%22P31%22%7D%5D%7D%2C%22Z36572K2%22%3A%5B%22Z6091%22%2C%7B%22Z1K1%22%3A%22Z6091%22%2C%22Z6091K1%22%3A%22Q486972%22%7D%5D%2C%22Z36572K3%22%3A%7B%22Z1K1%22%3A%22Z13518%22%2C%22Z13518K1%22%3A%223%22%7D%7D This function call] seems to work, but I would be worried about timing out, generally. It would perhaps be better to create a list of classes that are, ultimately, types of human settlement and only use the more expensive traversal for items that are not instances of any of those classes. I don’t see any such list currently, but the idea is expressed in {{Z|Z41921}}, so @[[User:Jsamwrites|Jsamwrites]] might be interested in collaborating. [[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 20:38, 19 September 2026 (UTC) ::::As I mentioned [[Talk:Z41920|here]], your solution is ideally correct, but because of technical limitations, I created a faster version for general French usages. [[User:Jsamwrites|John Samuel]] 21:11, 19 September 2026 (UTC) :::::Thanks @[[User:GrounderUK|GrounderUK]]! Any help or Phabricator page (or some dashboard) where we could understand what's likely to timeout? I would love to reduce the burden on the servers but I have no clue on what's causing it. [[User:Ornithorynque liminaire|Ornithorynque liminaire (she/they)]] ([[User talk:Ornithorynque liminaire|talk]]) 11:41, 20 September 2026 (UTC) ::::::I’m not aware of a suitable page, but I think it would be a good idea to have one. Perhaps we should add it to [[Special:MyLanguage/Wikifunctions:How to create implementations]], which is linked to from every implementation? We should probably also have a general Phabricator task for logging errors that are hard to understand and/or impossible to translate. This might fit under [[:phab:T432195]], unless @[[User:LMorgantini-WMF|LMorgantini-WMF]] has a better suggestion. ::::::For now, I would only suggest that we: ::::::* generally avoid {{Z|Z6821}} and use either {{Z|Z6820}} or one of its wrappers, like {{Z|Z30120}} or {{Z|Z23762}} ::::::* test using smaller and fewer Wikidata items ::::::* use the same item(s) for different tests, where appropriate ::::::* avoid unnecessary variation in fetch calls. ::::::[[User:GrounderUK|GrounderUK]] ([[User talk:GrounderUK|talk]]) 13:19, 20 September 2026 (UTC) :::::::* If a function does not need to pull labels or statements from an Item/Property/Lexeme, it should not fetch it. :::::::** When a label or statement ''is'' needed, from that point on you should only pass around the fetched Item/etc. and not its reference. Unfortunately the naming conventions and [[WF:Catalogue/Wikidata_operations/Item#Labels_and_aliases|catalogue]] aren't very helpful for finding the right label functions at the moment. :::::::* Replace {{Z|22820}} with specialised filter functions where possible to avoid having to repeat a long expression. :::::::* When implementing by composition, try to do it without recursion, at least until a non-recursive or code implementation gets connected. Recursive compositions are slower and more annoying to debug. (Code implementations can use recursion with much less overhead, but are limited in other ways ofc.) :::::::* Embedded function calls often fail, even when the same arguments work fine when used on the function's view page. Must be a separate cache. :::::::[[User:YoshiRulz|YoshiRulz]] ([[User talk:YoshiRulz|talk]]) 22:24, 20 September 2026 (UTC) sudngl0nzr6cyve9ov12o8hf3bno23v Z44217 0 97286 331041 330648 2026-10-23T06:02:42Z 鈴音雨 101019 Detach to refresh cached results 331041 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z44217" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z44217K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "項目" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z44217K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "言語" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20", "Z44218", "Z44219", "Z44220" ], "Z8K4": [ "Z14" ], "Z8K5": "Z44217" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "word for an item, or its label" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "項目を表す語またはラベル" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Gives the word that expresses an item in a language, or the item's label when the language has no such word. E.g. administratively gives 行政上 in Japanese." }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "項目を表す語を指定した言語で返します。その言語の語がなければ項目のラベルを返します。例: administratively → 行政上 (日本語)" } ] } } ikfkvddmqqfdee2a89wvuggfpls3con 331042 331041 2026-10-23T06:02:53Z 鈴音雨 101019 Reconnect implementations 331042 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z44217" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z44217K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "項目" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z44217K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "言語" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20", "Z44218", "Z44219", "Z44220" ], "Z8K4": [ "Z14", "Z44221" ], "Z8K5": "Z44217" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "word for an item, or its label" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "項目を表す語またはラベル" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Gives the word that expresses an item in a language, or the item's label when the language has no such word. E.g. administratively gives 行政上 in Japanese." }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "項目を表す語を指定した言語で返します。その言語の語がなければ項目のラベルを返します。例: administratively → 行政上 (日本語)" } ] } } ceqxu5i87830asnmv3iw5elwsxow6tl Z44278 0 97357 330904 323710 2026-10-22T15:35:39Z ReXLer 39813 330904 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z44278" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z44276", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z44276K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q24905" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z22478", "Z22478K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z19302", "Z19302K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z7", "Z7K1": "Z44077", "Z44077K1": { "Z1K1": "Z7", "Z7K1": "Z6820", "Z6820K1": { "Z1K1": "Z7", "Z7K1": "Z17895", "Z17895K1": { "Z1K1": "Z7", "Z7K1": "Z32599", "Z32599K1": { "Z1K1": "Z7", "Z7K1": "Z23756", "Z23756K1": { "Z1K1": "Z18", "Z18K1": "Z44276K1" } }, "Z32599K2": { "Z1K1": "Z6092", "Z6092K1": "P9970" }, "Z32599K3": { "Z1K1": "Z18", "Z18K1": "Z44276K2" } } }, "Z6820K2": [ "Z6030" ], "Z6820K3": [ "Z60" ], "Z6820K4": [ "Z6092" ] }, "Z44077K2": { "Z1K1": "Z7", "Z7K1": "Z30120", "Z30120K1": { "Z1K1": "Z7", "Z7K1": "Z23756", "Z23756K1": { "Z1K1": "Z18", "Z18K1": "Z44276K1" } }, "Z30120K2": [ "Z6030", "Z6033" ], "Z30120K3": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z44276K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z30120K4": [ "Z6092" ] }, "Z44077K3": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z44276K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z44077K4": { "Z1K1": "Z7", "Z7K1": "Z850", "Z850K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z29649", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z44276K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z850K2": "Z36589", "Z850K3": [ "Z6091" ] }, "Z44077K5": { "Z1K1": "Z18", "Z18K1": "Z44276K3" }, "Z44077K6": { "Z1K1": "Z40", "Z40K1": "Z41" } } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z22478", "Z22478K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z19302", "Z19302K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z7", "Z7K1": "Z44077", "Z44077K1": { "Z1K1": "Z7", "Z7K1": "Z6820", "Z6820K1": { "Z1K1": "Z7", "Z7K1": "Z17895", "Z17895K1": { "Z1K1": "Z7", "Z7K1": "Z32599", "Z32599K1": { "Z1K1": "Z7", "Z7K1": "Z23756", "Z23756K1": { "Z1K1": "Z18", "Z18K1": "Z44276K1" } }, "Z32599K2": { "Z1K1": "Z6092", "Z6092K1": "P5137" }, "Z32599K3": { "Z1K1": "Z18", "Z18K1": "Z44276K2" } } }, "Z6820K2": [ "Z6030" ], "Z6820K3": [ "Z60" ], "Z6820K4": [ "Z6092" ] }, "Z44077K2": { "Z1K1": "Z7", "Z7K1": "Z30120", "Z30120K1": { "Z1K1": "Z7", "Z7K1": "Z23756", "Z23756K1": { "Z1K1": "Z18", "Z18K1": "Z44276K1" } }, "Z30120K2": [ "Z6030", "Z6033" ], "Z30120K3": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z44276K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z30120K4": [ "Z6092" ] }, "Z44077K3": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z44276K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z44077K4": { "Z1K1": "Z7", "Z7K1": "Z850", "Z850K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z29649", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z44276K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z850K2": "Z36589", "Z850K3": [ "Z6091" ] }, "Z44077K5": { "Z1K1": "Z18", "Z18K1": "Z44276K3" }, "Z44077K6": { "Z1K1": "Z40", "Z40K1": "Z41" } } } } } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "First word form from lexeme, comp" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 3lzt1gyt4ww8a10oufgsdr2o2jwapdd Z44326 0 97405 331044 323162 2026-10-23T06:07:37Z 鈴音雨 101019 Detach to refresh Z44327 331044 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z44326" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6001", "Z17K2": "Z44326K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "fetched item" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "取得済みの項目" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z44326K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "言語" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z44326" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "name or word for a fetched item" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "取得済み項目の名前または語" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Gives the label of an individual, or the word for a kind of thing, from an item already fetched from Wikidata. E.g. 日本列島 (a label), 人々 (the word for group of persons)." }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "ウィキデータから取得済みの項目について、個体ならラベル、種類ならそれを表す語を返します。例: 日本列島 (ラベル)、人々 (人の集団を表す語)" } ] } } klmll7qtnk38hh3xsmwvg2lkb8bg4kv 331045 331044 2026-10-23T06:07:49Z 鈴音雨 101019 Reconnect after refreshing Z44327 331045 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z44326" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6001", "Z17K2": "Z44326K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "fetched item" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "取得済みの項目" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z44326K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "言語" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z44327" ], "Z8K5": "Z44326" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "name or word for a fetched item" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "取得済み項目の名前または語" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Gives the label of an individual, or the word for a kind of thing, from an item already fetched from Wikidata. E.g. 日本列島 (a label), 人々 (the word for group of persons)." }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "ウィキデータから取得済みの項目について、個体ならラベル、種類ならそれを表す語を返します。例: 日本列島 (ラベル)、人々 (人の集団を表す語)" } ] } } bnrfrx3di4fcds8jzpv9svg2fznybl0 Z44327 0 97406 331043 323161 2026-10-23T06:07:25Z 鈴音雨 101019 Always use the word-or-label function 331043 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z44327" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z44326", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z44217", "Z44217K1": { "Z1K1": "Z7", "Z7K1": "Z23756", "Z23756K1": { "Z1K1": "Z18", "Z18K1": "Z44326K1" } }, "Z44217K2": { "Z1K1": "Z18", "Z18K1": "Z44326K2" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "name or word for a fetched item, composition" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "取得済み項目の名前または語、合成" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 14xs7jlc74kvjzoxks7h4fov4fih8qg Z45353 0 98655 331162 326905 2026-10-23T10:19:53Z Denny 81 Added Z45355 to the approved list of test cases 331162 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z45353" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z45353K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1004", "Z11K2": "item" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z45353K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1004", "Z11K2": "langue" }, { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20", "Z45355" ], "Z8K4": [ "Z14", "Z45354" ], "Z8K5": "Z45353" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "male form of label (string)" }, { "Z1K1": "Z11", "Z11K1": "Z1004", "Z11K2": "forme masculine du libellé (chaîne)" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1002", "Z31K2": [ "Z6", "P3321" ] }, { "Z1K1": "Z31", "Z31K1": "Z1004", "Z31K2": [ "Z6", "P3321" ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } hx9xf0ki2t3pvlfprwwxmq7det0tv3j Z45387 0 98720 330869 327102 2026-10-22T12:23:29Z 99of9 1622 Added Z46789 to the approved list of test cases 330869 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z45387" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z45387K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "example items" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "例示する項目" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z45387K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "言語" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20", "Z45397", "Z46789" ], "Z8K4": [ "Z14", "Z45388" ], "Z8K5": "Z45387" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "inclusion modifier [including X]" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "包含の修飾句 [など]" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Makes an inclusion modifier from a list of example items, such as \"including Hokkaido\". Example: 北海道などの。" }, { "Z1K1": "Z11", "Z11K1": "Z1830", "Z11K2": "例示する項目の並びから、包含の修飾語句を作ります。例えば「北海道などの」。" } ] } } 6f2yrtz8igjdfhkmmuwzigsvlgilhxz Z46459 0 99991 330974 330325 2026-10-22T23:26:25Z Jsamwrites 938 Negative past: Dagbani daa bi; Igbo stored negative form for any tense 330974 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46459" }, "Z2K2": { "Z1K1": "Z14294", "Z14294K1": [ "Z14293", { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z89" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z6095", "Z6095K1": "L1885" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z6095", "Z6095K1": "L1885" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } } }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": "not" }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q1230649" } ] } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z6095", "Z6095K1": "L1885" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z6095", "Z6095K1": "L1885" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } } }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q1230649" } ] } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6095K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z866K2": "L4000" }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z45224", "Z45224K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z45224K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q109267112" } } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } } }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": "not" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z6095", "Z6095K1": "L4000" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z6095", "Z6095K1": "L4000" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } } }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": "not" }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } } } } ], "Z8K5": "Z8" }, "Z14293K2": "Z33034" }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z89" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z89" }, "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z89" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z32201", "Z32201K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z802K2": "n'", "Z802K3": "ne " }, "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z10000K2": " pas" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z32201", "Z32201K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z802K2": "n'", "Z802K3": "ne " }, "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z10000K2": " pas" } } }, "Z40958K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z40958K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z7", "Z7K1": "Z27854", "Z27854K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z7", "Z7K1": "Z39580", "Z39580K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } } } } }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6095K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z39580", "Z39580K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "L1882" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12767", "Z12767K1": { "Z1K1": "Z7", "Z7K1": "Z12767", "Z12767K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q814722" }, { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } ], "Z12767K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q110786" }, { "Z1K1": "Z6091", "Z6091K1": "Q146786" } ], "Z12696K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } }, "Z12767K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q499327" }, { "Z1K1": "Z6091", "Z6091K1": "Q1775415" } ], "Z12696K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } }, "Z802K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q499327" } ], "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q499327" }, { "Z1K1": "Z6091", "Z6091K1": "Q1775415" } ], "Z12696K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } }, "Z802K3": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q814722" }, { "Z1K1": "Z6091", "Z6091K1": "Q1994301" }, { "Z1K1": "Z6091", "Z6091K1": "Q499327" }, { "Z1K1": "Z6091", "Z6091K1": "Q110786" } ] } }, "Z802K3": [ "Z89" ] }, "Z8K3": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1004" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z89" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": "no" }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z6095", "Z6095K1": "L7392" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q814722" }, { "Z1K1": "Z6091", "Z6091K1": "Q499327" }, { "Z1K1": "Z6091", "Z6091K1": "Q110786" } ] } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z6095", "Z6095K1": "L7392" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q814722" }, { "Z1K1": "Z6091", "Z6091K1": "Q499327" }, { "Z1K1": "Z6091", "Z6091K1": "Q110786" } ] } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1003" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z89" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": "non" }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z44924", "Z44924K1": { "Z1K1": "Z7", "Z7K1": "Z45083", "Z45083K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6004", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z22638", "Z22638K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q501405" } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z45224", "Z45224K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z45224K2": { "Z1K1": "Z7", "Z7K1": "Z12767", "Z12767K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q192613" } }, "Z12767K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q625420" } ] } } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z44924", "Z44924K1": { "Z1K1": "Z7", "Z7K1": "Z45083", "Z45083K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6004", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z22638", "Z22638K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q501405" } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z45224", "Z45224K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z45224K2": { "Z1K1": "Z7", "Z7K1": "Z12767", "Z12767K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q192613" } }, "Z12767K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q625420" } ] } } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1403" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z89" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z43825", "Z43825K1": { "Z1K1": "Z7", "Z7K1": "Z27854", "Z27854K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q1392475" } ] } } }, "Z43825K2": { "Z1K1": "Z7", "Z7K1": "Z27854", "Z27854K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z6095", "Z6095K1": "L413869" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q109267112" } } }, "Z802K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } ], "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q109267112" } } } } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1012" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z89" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": "daa" }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q22716" } }, "Z802K2": "di", "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z13752", "Z13752K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13752K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q501405" }, { "Z1K1": "Z6091", "Z6091K1": "Q1475560" } ] }, "Z802K2": "ku", "Z802K3": "bi" } } }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q22716" } }, "Z802K2": "di", "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z13752", "Z13752K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13752K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q501405" }, { "Z1K1": "Z6091", "Z6091K1": "Q1475560" } ] }, "Z802K2": "ku", "Z802K3": "bi" } } }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": "daa" }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1015" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z89" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } }, "Z802K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1014" ] } ], "Z14294K2": "Z46448" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Verb form fragment language options" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Verb strategies: negation (en do-support, fr ne...pas, es no, la non, dag bi/ku/di, daa bi in the past; ig stored negative form for any tense) and present perfect (Q1240211). Other languages use stored verb forms." } ] } } q9dcv1g3nkg0tc4d5t0bacnsyt3mxa2 330975 330974 2026-10-22T23:41:23Z Jsamwrites 938 English perfect of be: has / have been 330975 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46459" }, "Z2K2": { "Z1K1": "Z14294", "Z14294K1": [ "Z14293", { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z89" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z89" }, "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z89" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z32201", "Z32201K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z802K2": "n'", "Z802K3": "ne " }, "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z10000K2": " pas" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z32201", "Z32201K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z802K2": "n'", "Z802K3": "ne " }, "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z10000K2": " pas" } } }, "Z40958K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z40958K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z7", "Z7K1": "Z27854", "Z27854K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z7", "Z7K1": "Z39580", "Z39580K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } } } } }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6095K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z39580", "Z39580K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "L1882" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12767", "Z12767K1": { "Z1K1": "Z7", "Z7K1": "Z12767", "Z12767K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q814722" }, { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } ], "Z12767K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q110786" }, { "Z1K1": "Z6091", "Z6091K1": "Q146786" } ], "Z12696K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } }, "Z12767K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q499327" }, { "Z1K1": "Z6091", "Z6091K1": "Q1775415" } ], "Z12696K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } }, "Z802K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q499327" } ], "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q499327" }, { "Z1K1": "Z6091", "Z6091K1": "Q1775415" } ], "Z12696K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } }, "Z802K3": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q814722" }, { "Z1K1": "Z6091", "Z6091K1": "Q1994301" }, { "Z1K1": "Z6091", "Z6091K1": "Q499327" }, { "Z1K1": "Z6091", "Z6091K1": "Q110786" } ] } }, "Z802K3": [ "Z89" ] }, "Z8K3": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1004" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z89" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": "no" }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z6095", "Z6095K1": "L7392" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q814722" }, { "Z1K1": "Z6091", "Z6091K1": "Q499327" }, { "Z1K1": "Z6091", "Z6091K1": "Q110786" } ] } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z6095", "Z6095K1": "L7392" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q814722" }, { "Z1K1": "Z6091", "Z6091K1": "Q499327" }, { "Z1K1": "Z6091", "Z6091K1": "Q110786" } ] } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1003" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z89" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": "non" }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z44924", "Z44924K1": { "Z1K1": "Z7", "Z7K1": "Z45083", "Z45083K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6004", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z22638", "Z22638K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q501405" } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z45224", "Z45224K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z45224K2": { "Z1K1": "Z7", "Z7K1": "Z12767", "Z12767K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q192613" } }, "Z12767K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q625420" } ] } } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z44924", "Z44924K1": { "Z1K1": "Z7", "Z7K1": "Z45083", "Z45083K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6004", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z22638", "Z22638K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q501405" } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z45224", "Z45224K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z45224K2": { "Z1K1": "Z7", "Z7K1": "Z12767", "Z12767K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q192613" } }, "Z12767K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q625420" } ] } } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1403" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z89" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z43825", "Z43825K1": { "Z1K1": "Z7", "Z7K1": "Z27854", "Z27854K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q1392475" } ] } } }, "Z43825K2": { "Z1K1": "Z7", "Z7K1": "Z27854", "Z27854K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z6095", "Z6095K1": "L413869" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q109267112" } } }, "Z802K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } ], "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q109267112" } } } } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1012" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z89" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": "daa" }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q22716" } }, "Z802K2": "di", "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z13752", "Z13752K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13752K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q501405" }, { "Z1K1": "Z6091", "Z6091K1": "Q1475560" } ] }, "Z802K2": "ku", "Z802K3": "bi" } } }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q22716" } }, "Z802K2": "di", "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z13752", "Z13752K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13752K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q501405" }, { "Z1K1": "Z6091", "Z6091K1": "Q1475560" } ] }, "Z802K2": "ku", "Z802K3": "bi" } } }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": "daa" }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1015" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z89" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } }, "Z802K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1014" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z89" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z6095", "Z6095K1": "L1885" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z6095", "Z6095K1": "L1885" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } } } }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": "not" }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q1230649" } ] } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z6095", "Z6095K1": "L1885" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z6095", "Z6095K1": "L1885" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } } } }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q1230649" } ] } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6095K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z866K2": "L4000" }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z45224", "Z45224K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z45224K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q109267112" } } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } } }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": "not" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z6095", "Z6095K1": "L4000" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z6095", "Z6095K1": "L4000" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } } }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": "not" }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } } } } ], "Z8K5": "Z8" }, "Z14293K2": "Z33034" } ], "Z14294K2": "Z46448" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Verb form fragment language options" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Verb strategies: negation (en do-support, fr ne...pas, es no, la non, dag bi/ku/di, daa bi in the past; ig stored negative form for any tense) and present perfect (Q1240211). Other languages use stored verb forms." } ] } } a05p12gl9leayrqvnkrphinqni1ijv0 330982 330975 2026-10-23T00:13:20Z Jsamwrites 938 English be: simple present and simple past requests give is / was 330982 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46459" }, "Z2K2": { "Z1K1": "Z14294", "Z14294K1": [ "Z14293", { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z89" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z89" }, "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z89" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z32201", "Z32201K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z802K2": "n'", "Z802K3": "ne " }, "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z10000K2": " pas" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z32201", "Z32201K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z802K2": "n'", "Z802K3": "ne " }, "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z10000K2": " pas" } } }, "Z40958K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z40958K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z7", "Z7K1": "Z27854", "Z27854K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z7", "Z7K1": "Z39580", "Z39580K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } } } } }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6095K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z39580", "Z39580K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "L1882" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12767", "Z12767K1": { "Z1K1": "Z7", "Z7K1": "Z12767", "Z12767K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q814722" }, { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } ], "Z12767K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q110786" }, { "Z1K1": "Z6091", "Z6091K1": "Q146786" } ], "Z12696K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } }, "Z12767K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q499327" }, { "Z1K1": "Z6091", "Z6091K1": "Q1775415" } ], "Z12696K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } }, "Z802K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q499327" } ], "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q499327" }, { "Z1K1": "Z6091", "Z6091K1": "Q1775415" } ], "Z12696K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } }, "Z802K3": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q814722" }, { "Z1K1": "Z6091", "Z6091K1": "Q1994301" }, { "Z1K1": "Z6091", "Z6091K1": "Q499327" }, { "Z1K1": "Z6091", "Z6091K1": "Q110786" } ] } }, "Z802K3": [ "Z89" ] }, "Z8K3": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1004" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z89" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": "no" }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z6095", "Z6095K1": "L7392" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q814722" }, { "Z1K1": "Z6091", "Z6091K1": "Q499327" }, { "Z1K1": "Z6091", "Z6091K1": "Q110786" } ] } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z6095", "Z6095K1": "L7392" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q814722" }, { "Z1K1": "Z6091", "Z6091K1": "Q499327" }, { "Z1K1": "Z6091", "Z6091K1": "Q110786" } ] } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1003" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z89" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": "non" }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z44924", "Z44924K1": { "Z1K1": "Z7", "Z7K1": "Z45083", "Z45083K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6004", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z22638", "Z22638K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q501405" } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z45224", "Z45224K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z45224K2": { "Z1K1": "Z7", "Z7K1": "Z12767", "Z12767K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q192613" } }, "Z12767K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q625420" } ] } } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z44924", "Z44924K1": { "Z1K1": "Z7", "Z7K1": "Z45083", "Z45083K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6004", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z22638", "Z22638K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q501405" } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z45224", "Z45224K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z45224K2": { "Z1K1": "Z7", "Z7K1": "Z12767", "Z12767K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q192613" } }, "Z12767K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q625420" } ] } } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1403" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z89" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z43825", "Z43825K1": { "Z1K1": "Z7", "Z7K1": "Z27854", "Z27854K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q1392475" } ] } } }, "Z43825K2": { "Z1K1": "Z7", "Z7K1": "Z27854", "Z27854K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z6095", "Z6095K1": "L413869" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q109267112" } } }, "Z802K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } ], "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q109267112" } } } } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1012" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z89" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": "daa" }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q22716" } }, "Z802K2": "di", "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z13752", "Z13752K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13752K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q501405" }, { "Z1K1": "Z6091", "Z6091K1": "Q1475560" } ] }, "Z802K2": "ku", "Z802K3": "bi" } } }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q22716" } }, "Z802K2": "di", "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z13752", "Z13752K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13752K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q501405" }, { "Z1K1": "Z6091", "Z6091K1": "Q1475560" } ] }, "Z802K2": "ku", "Z802K3": "bi" } } }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": "daa" }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1015" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z89" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } }, "Z802K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1014" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z89" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z89" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z6095", "Z6095K1": "L1885" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z6095", "Z6095K1": "L1885" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } } } }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": "not" }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q1230649" } ] } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z6095", "Z6095K1": "L1885" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z6095", "Z6095K1": "L1885" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } } } }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q1230649" } ] } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6095K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z866K2": "L4000" }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z45224", "Z45224K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z45224K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q109267112" } } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } } }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": "not" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z6095", "Z6095K1": "L4000" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z6095", "Z6095K1": "L4000" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } } }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": "not" }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z8K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z8K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6095K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z866K2": "L1883" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6095K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z866K2": "L1883" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } } }, "Z802K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1392475" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q442485" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6095K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z866K2": "L1883" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } } }, "Z802K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1392475" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6095K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z866K2": "L1883" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } } }, "Z802K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } } } ], "Z8K5": "Z8" }, "Z14293K2": "Z33034" } ], "Z14294K2": "Z46448" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Verb form fragment language options" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Verb strategies: negation (en do-support, fr ne...pas, es no, la non, dag bi/ku/di, daa bi in the past; ig stored negative form for any tense) and present perfect (Q1240211). Other languages use stored verb forms." } ] } } pcyvx0llzgrdohrze7dgzcn3p6ibuwm 330983 330982 2026-10-23T00:26:09Z Jsamwrites 938 English past: one form for every person except be (had, discovered; was) 330983 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46459" }, "Z2K2": { "Z1K1": "Z14294", "Z14294K1": [ "Z14293", { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z89" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z89" }, "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z89" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z32201", "Z32201K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z802K2": "n'", "Z802K3": "ne " }, "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z10000K2": " pas" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z32201", "Z32201K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z802K2": "n'", "Z802K3": "ne " }, "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z10000K2": " pas" } } }, "Z40958K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z40958K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z7", "Z7K1": "Z27854", "Z27854K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z7", "Z7K1": "Z39580", "Z39580K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } } } } }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6095K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z39580", "Z39580K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "L1882" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12767", "Z12767K1": { "Z1K1": "Z7", "Z7K1": "Z12767", "Z12767K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q814722" }, { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } ], "Z12767K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q110786" }, { "Z1K1": "Z6091", "Z6091K1": "Q146786" } ], "Z12696K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } }, "Z12767K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q499327" }, { "Z1K1": "Z6091", "Z6091K1": "Q1775415" } ], "Z12696K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } }, "Z802K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q499327" } ], "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q499327" }, { "Z1K1": "Z6091", "Z6091K1": "Q1775415" } ], "Z12696K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } }, "Z802K3": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q814722" }, { "Z1K1": "Z6091", "Z6091K1": "Q1994301" }, { "Z1K1": "Z6091", "Z6091K1": "Q499327" }, { "Z1K1": "Z6091", "Z6091K1": "Q110786" } ] } }, "Z802K3": [ "Z89" ] }, "Z8K3": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1004" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z89" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": "no" }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z6095", "Z6095K1": "L7392" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q814722" }, { "Z1K1": "Z6091", "Z6091K1": "Q499327" }, { "Z1K1": "Z6091", "Z6091K1": "Q110786" } ] } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z6095", "Z6095K1": "L7392" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q814722" }, { "Z1K1": "Z6091", "Z6091K1": "Q499327" }, { "Z1K1": "Z6091", "Z6091K1": "Q110786" } ] } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1003" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z89" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": "non" }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z44924", "Z44924K1": { "Z1K1": "Z7", "Z7K1": "Z45083", "Z45083K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6004", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z22638", "Z22638K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q501405" } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z45224", "Z45224K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z45224K2": { "Z1K1": "Z7", "Z7K1": "Z12767", "Z12767K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q192613" } }, "Z12767K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q625420" } ] } } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z44924", "Z44924K1": { "Z1K1": "Z7", "Z7K1": "Z45083", "Z45083K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6004", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z22638", "Z22638K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q501405" } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z45224", "Z45224K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z45224K2": { "Z1K1": "Z7", "Z7K1": "Z12767", "Z12767K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q192613" } }, "Z12767K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q625420" } ] } } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1403" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z89" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z43825", "Z43825K1": { "Z1K1": "Z7", "Z7K1": "Z27854", "Z27854K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q1392475" } ] } } }, "Z43825K2": { "Z1K1": "Z7", "Z7K1": "Z27854", "Z27854K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z6095", "Z6095K1": "L413869" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q109267112" } } }, "Z802K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } ], "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q109267112" } } } } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1012" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z89" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": "daa" }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q22716" } }, "Z802K2": "di", "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z13752", "Z13752K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13752K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q501405" }, { "Z1K1": "Z6091", "Z6091K1": "Q1475560" } ] }, "Z802K2": "ku", "Z802K3": "bi" } } }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q22716" } }, "Z802K2": "di", "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z13752", "Z13752K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13752K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q501405" }, { "Z1K1": "Z6091", "Z6091K1": "Q1475560" } ] }, "Z802K2": "ku", "Z802K3": "bi" } } }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": "daa" }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1015" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z89" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } }, "Z802K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1014" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z89" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z89" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z6095", "Z6095K1": "L1885" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z6095", "Z6095K1": "L1885" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } } } }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": "not" }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q1230649" } ] } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z6095", "Z6095K1": "L1885" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z6095", "Z6095K1": "L1885" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } } } }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q1230649" } ] } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6095K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z866K2": "L4000" }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z45224", "Z45224K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z45224K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q109267112" } } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } } }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": "not" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z6095", "Z6095K1": "L4000" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z6095", "Z6095K1": "L4000" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } } } }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z40958", "Z40958K1": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": "not" }, "Z40958K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46096", "Z46096K1": { "Z1K1": "Z7", "Z7K1": "Z21806", "Z21806K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z21806K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46448", "Z46448K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z46448K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z46448K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z8K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z8K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6095K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z866K2": "L1883" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6095K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z866K2": "L1883" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } } }, "Z802K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1392475" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q442485" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6095K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z866K2": "L1883" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } } }, "Z802K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1392475" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6095K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z866K2": "L1883" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } } }, "Z802K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1392475" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6095K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z866K2": "L1883" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6095K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z866K2": "L1883" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } } }, "Z802K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1392475" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q442485" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6095K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z866K2": "L1883" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } } }, "Z802K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1392475" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6095K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z866K2": "L1883" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } } }, "Z802K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q146786" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q21714344" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929049" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6095K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z866K2": "L1883" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6095K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z866K2": "L1883" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } } }, "Z802K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1392475" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q442485" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6095K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z866K2": "L1883" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } } }, "Z802K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q1392475" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6095K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z866K2": "L1883" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z6091", "Z6091K1": "Q56682909" }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z13081", "Z13081K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z13081K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } } }, "Z802K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } } } } ], "Z8K5": "Z8" }, "Z14293K2": "Z33034" } ], "Z14294K2": "Z46448" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Verb form fragment language options" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Verb strategies: negation (en do-support, fr ne...pas, es no, la non, dag bi/ku/di, daa bi in the past; ig stored negative form for any tense) and present perfect (Q1240211). Other languages use stored verb forms." } ] } } 155e95rp0sbwe6z58tt3nsnmolaewhi Z46615 0 100153 330929 330317 2026-10-22T19:37:54Z Jsamwrites 938 Malayalam colour (dative possessor, colour noun) and citizenship (demonym noun agreeing with the subject, or demonym adjective with a head noun) 330929 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46615" }, "Z2K2": { "Z1K1": "Z14294", "Z14294K1": [ "Z14293", { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6092", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" } }, "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z866K2": "P462" }, "Z802K2": [ { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q1474213" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1166153" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q82042" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q24905" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263353" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263362" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q190087" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q16222597" } } ], [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q1474213" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q207509" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q82042" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1084" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263353" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263362" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q190087" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q16222597" } } ] ], "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z866K2": "P27" }, "Z802K2": [ { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q1474213" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q207509" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q82042" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1084" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q179080" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q215627" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q1814980" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110263362" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263353" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263362" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q190087" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q16222597" } } ] ], "Z802K3": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1015" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6092", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" } }, "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z866K2": "P462" }, "Z802K2": [ { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q1474213" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1774805" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q82042" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q24905" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q179080" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1075" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263353" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263362" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q190087" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q16222597" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q208084" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1423674" } } ] ], "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z866K2": "P27" }, "Z802K2": [ { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q1474213" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q207509" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q82042" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1084" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q179080" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q215627" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q1814980" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110263362" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263353" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263362" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q190087" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q16222597" } } ] ], "Z802K3": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1014" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6092", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" } }, "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z866K2": "P462" }, "Z802K2": [ { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q1474213" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q207509" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q82042" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q34698" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263353" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263362" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q190087" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q16222597" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q1084" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1075" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q128234" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q145599" } } ] ], "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z866K2": "P27" }, "Z802K2": [ { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q1474213" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q207509" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q82042" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1084" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q217438" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110263362" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263353" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263362" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q190087" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q16222597" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q829903" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q162378" } } ], [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q1474213" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q207509" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q82042" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q34698" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q217438" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110263362" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263353" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263362" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q190087" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q16222597" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q1775415" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q467" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q499327" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q8441" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q3813849" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q3813849" } } ] ], "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z866K2": "P1082" }, "Z802K2": [ { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q1474213" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q309314" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q179080" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1613416" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263353" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263362" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q309314" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q309314" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q309314" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q190087" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q309314" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q128234" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q202142" } } ] ], "Z802K3": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1012" ] } ], "Z14294K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6092", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" } }, "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } ], "Z8K5": "Z8" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Predicate construction language preferences" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Candidate constructions replacing the default ones for some properties: Dagbani colour as a stative verb (mɔhi) or copula and colour noun, Igbo colour with na-acha and the colour word, Dagbani and Igbo citizenship as 'person of' the country; Malayalam colour and citizenship are not supported yet. Other languages and properties keep the default." } ] } } kmc1s2icg9xbt4znod5cds2ii3n2eq0 330942 330929 2026-10-22T20:07:04Z Jsamwrites 938 Dagbani colour: the stative verb in the perfective (mɔhiya) 330942 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46615" }, "Z2K2": { "Z1K1": "Z14294", "Z14294K1": [ "Z14293", { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6092", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" } }, "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z866K2": "P462" }, "Z802K2": [ { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q1474213" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1166153" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q82042" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q24905" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263353" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263362" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q190087" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q16222597" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q208084" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1424306" } } ], [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q1474213" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q207509" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q82042" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1084" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263353" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263362" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q190087" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q16222597" } } ] ], "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z866K2": "P27" }, "Z802K2": [ { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q1474213" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q207509" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q82042" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1084" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q179080" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q215627" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q1814980" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110263362" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263353" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263362" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q190087" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q16222597" } } ] ], "Z802K3": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1015" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6092", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" } }, "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z866K2": "P462" }, "Z802K2": [ { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q1474213" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1774805" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q82042" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q24905" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q179080" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1075" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263353" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263362" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q190087" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q16222597" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q208084" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1423674" } } ] ], "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z866K2": "P27" }, "Z802K2": [ { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q1474213" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q207509" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q82042" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1084" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q179080" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q215627" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q1814980" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110263362" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263353" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263362" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q190087" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q16222597" } } ] ], "Z802K3": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1014" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6092", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" } }, "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z866K2": "P462" }, "Z802K2": [ { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q1474213" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q207509" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q82042" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q34698" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263353" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263362" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q190087" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q16222597" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q1084" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1075" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q128234" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q145599" } } ] ], "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z866K2": "P27" }, "Z802K2": [ { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q1474213" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q207509" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q82042" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1084" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q217438" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110263362" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263353" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263362" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q190087" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q16222597" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q829903" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q162378" } } ], [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q1474213" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q207509" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q82042" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q34698" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q217438" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110263362" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263353" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263362" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q20574495" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q190087" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q16222597" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q1775415" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q467" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q499327" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q8441" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q3813849" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q3813849" } } ] ], "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z866K2": "P1082" }, "Z802K2": [ { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q1474213" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q309314" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q179080" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1613416" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263353" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q110263362" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q309314" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q134506144" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q309314" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q309314" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q190087" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q309314" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q128234" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q202142" } } ] ], "Z802K3": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1012" ] } ], "Z14294K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6092", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" } }, "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } ], "Z8K5": "Z8" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Predicate construction language preferences" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Candidate constructions replacing the default ones for some properties: Dagbani colour as a stative verb (mɔhi) or copula and colour noun, Igbo colour with na-acha and the colour word, Dagbani and Igbo citizenship as 'person of' the country; Malayalam colour and citizenship are not supported yet. Other languages and properties keep the default." } ] } } 59l9hsc7tvpsvy06ewqgv00kwzb5w3f Z46617 0 100155 330925 330074 2026-10-22T19:35:12Z Jsamwrites 938 Removed Z46629 from the approved list of implementations 330925 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46617" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" } }, "Z17K2": "Z46617K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "candidates" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z46617K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "subject" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z46617K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "value" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z46617K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "context" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46617K5", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6095" } }, "Z8K3": [ "Z20", "Z46630", "Z46631", "Z46632", "Z46633", "Z46634", "Z46635", "Z46636", "Z46637", "Z46638", "Z46639" ], "Z8K4": [ "Z14" ], "Z8K5": "Z46617" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Predicate construction from candidates" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "First candidate construction whose predicate word exists in the language (P5137 or P9970 link to the predicate concept or to the value item; P6271 demonym of the value), with the lexemes of that word in order. Constructions without a predicate word pass with no lexeme. Error when no candidate fits." } ] } } 0z7ko7f0f6m7op6khuk668b5kyoaae5 330928 330925 2026-10-22T19:36:50Z Jsamwrites 938 Removed Z46638 and Z46639 from the approved list of test cases 330928 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46617" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" } }, "Z17K2": "Z46617K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "candidates" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z46617K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "subject" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z46617K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "value" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z46617K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "context" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46617K5", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6095" } }, "Z8K3": [ "Z20", "Z46630", "Z46631", "Z46632", "Z46633", "Z46634", "Z46635", "Z46636", "Z46637" ], "Z8K4": [ "Z14" ], "Z8K5": "Z46617" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Predicate construction from candidates" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "First candidate construction whose predicate word exists in the language (P5137 or P9970 link to the predicate concept or to the value item; P6271 demonym of the value), with the lexemes of that word in order. Constructions without a predicate word pass with no lexeme. Error when no candidate fits." } ] } } nmfgtd8d468aikx67crkn2ddn1s49eu 330935 330928 2026-10-22T19:40:23Z Jsamwrites 938 Removed Z46634 from the approved list of test cases 330935 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46617" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" } }, "Z17K2": "Z46617K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "candidates" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z46617K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "subject" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z46617K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "value" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z46617K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "context" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46617K5", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6095" } }, "Z8K3": [ "Z20", "Z46630", "Z46631", "Z46632", "Z46633", "Z46635", "Z46636", "Z46637" ], "Z8K4": [ "Z14" ], "Z8K5": "Z46617" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Predicate construction from candidates" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "First candidate construction whose predicate word exists in the language (P5137 or P9970 link to the predicate concept or to the value item; P6271 demonym of the value), with the lexemes of that word in order. Constructions without a predicate word pass with no lexeme. Error when no candidate fits." } ] } } 2k4c6jgyluvdx9fxnjvhyd2r66foza4 330936 330935 2026-10-22T19:40:39Z Jsamwrites 938 Added Z46629 to the approved list of implementations 330936 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46617" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" } }, "Z17K2": "Z46617K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "candidates" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z46617K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "subject" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z46617K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "value" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z46617K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "context" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46617K5", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6095" } }, "Z8K3": [ "Z20", "Z46630", "Z46631", "Z46632", "Z46633", "Z46635", "Z46636", "Z46637" ], "Z8K4": [ "Z14", "Z46629" ], "Z8K5": "Z46617" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Predicate construction from candidates" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "First candidate construction whose predicate word exists in the language (P5137 or P9970 link to the predicate concept or to the value item; P6271 demonym of the value), with the lexemes of that word in order. Constructions without a predicate word pass with no lexeme. Error when no candidate fits." } ] } } ge79n7q7hanigcv6vsn2ezeus22q7vt 330937 330936 2026-10-22T19:40:47Z Jsamwrites 938 Added Z46638 and Z46639 to the approved list of test cases 330937 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46617" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" } }, "Z17K2": "Z46617K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "candidates" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z46617K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "subject" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z46617K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "value" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z46617K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "context" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46617K5", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6095" } }, "Z8K3": [ "Z20", "Z46630", "Z46631", "Z46632", "Z46633", "Z46635", "Z46636", "Z46637", "Z46638", "Z46639" ], "Z8K4": [ "Z14", "Z46629" ], "Z8K5": "Z46617" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Predicate construction from candidates" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "First candidate construction whose predicate word exists in the language (P5137 or P9970 link to the predicate concept or to the value item; P6271 demonym of the value), with the lexemes of that word in order. Constructions without a predicate word pass with no lexeme. Error when no candidate fits." } ] } } 2w8te1tpil4uxmsa0ij7ix6kj6b7emk 330941 330937 2026-10-22T19:51:07Z Jsamwrites 938 Added Z46634 to the approved list of test cases 330941 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46617" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" } }, "Z17K2": "Z46617K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "candidates" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z46617K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "subject" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z46617K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "value" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z46617K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "context" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46617K5", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6095" } }, "Z8K3": [ "Z20", "Z46630", "Z46631", "Z46632", "Z46633", "Z46635", "Z46636", "Z46637", "Z46638", "Z46639", "Z46634" ], "Z8K4": [ "Z14", "Z46629" ], "Z8K5": "Z46617" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Predicate construction from candidates" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "First candidate construction whose predicate word exists in the language (P5137 or P9970 link to the predicate concept or to the value item; P6271 demonym of the value), with the lexemes of that word in order. Constructions without a predicate word pass with no lexeme. Error when no candidate fits." } ] } } oglg8o0vsleqnfnk3u86qi0oms34pww Z46629 0 100167 330930 330060 2026-10-22T19:37:56Z Jsamwrites 938 Constructions marked for agreement keep only demonym nouns of the subject's grammatical gender 330930 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46629" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z46617", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6095" } }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q82042" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6095" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6095" } }, "K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q82042" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q217438" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q829903" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6091", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K3" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P5185" } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6005K5" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6091", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K3" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P5185" } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6005K5" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } }, "Z12696K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6091", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K3" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P21" } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6001K5" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z30120", "Z30120K1": { "Z1K1": "Z18", "Z18K1": "Z46617K2" }, "Z30120K2": [ "Z6030", "Z6036" ], "Z30120K3": [ "Z60" ], "Z30120K4": [ "Z6092", { "Z1K1": "Z6092", "Z6092K1": "P21" } ] } } } } }, "Z802K2": { "Z1K1": "Z6091", "Z6091K1": "Q162378" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6091", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K3" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P21" } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6001K5" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z30120", "Z30120K1": { "Z1K1": "Z18", "Z18K1": "Z46617K2" }, "Z30120K2": [ "Z6030", "Z6036" ], "Z30120K3": [ "Z60" ], "Z30120K4": [ "Z6092", { "Z1K1": "Z6092", "Z6092K1": "P21" } ] } } } } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q6581072" } }, "Z802K2": { "Z1K1": "Z6091", "Z6091K1": "Q1775415" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6091", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K3" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P21" } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6001K5" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z30120", "Z30120K1": { "Z1K1": "Z18", "Z18K1": "Z46617K2" }, "Z30120K2": [ "Z6030", "Z6036" ], "Z30120K3": [ "Z60" ], "Z30120K4": [ "Z6092", { "Z1K1": "Z6092", "Z6092K1": "P21" } ] } } } } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q6581097" } }, "Z802K2": { "Z1K1": "Z6091", "Z6091K1": "Q499327" }, "Z802K3": { "Z1K1": "Z6091", "Z6091K1": "Q162378" } } } } } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6095", "Z882K2": "Z6096" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6095", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z46568", "Z46568K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z6825", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z6830", "Z6830K1": { "Z1K1": "Z18", "Z18K1": "Z46617K3" }, "Z6830K2": { "Z1K1": "Z6092", "Z6092K1": "P6271" }, "Z6830K3": { "Z1K1": "Z18", "Z18K1": "Z46617K5" } } }, "Z46568K2": { "Z1K1": "Z18", "Z18K1": "Z46617K3" }, "Z46568K3": [ "Z6092", { "Z1K1": "Z6092", "Z6092K1": "P6271" } ], "Z46568K4": [ "Z6091", { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q82042" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ] } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6095", "Z882K2": "Z6096" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6095", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z46568", "Z46568K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z6825", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z6830", "Z6830K1": { "Z1K1": "Z18", "Z18K1": "Z46617K3" }, "Z6830K2": { "Z1K1": "Z6092", "Z6092K1": "P6271" }, "Z6830K3": { "Z1K1": "Z18", "Z18K1": "Z46617K5" } } }, "Z46568K2": { "Z1K1": "Z18", "Z18K1": "Z46617K3" }, "Z46568K3": [ "Z6092", { "Z1K1": "Z6092", "Z6092K1": "P6271" } ], "Z46568K4": [ "Z6091", { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q82042" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ] } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46570", "Z46570K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q179080" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q179080" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } }, "Z802K3": { "Z1K1": "Z18", "Z18K1": "Z46617K3" } }, "Z46570K2": { "Z1K1": "Z18", "Z18K1": "Z46617K5" }, "Z46570K3": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q82042" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } } }, "Z802K3": [ "Z6095" ] } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z18", "Z18K1": "Z46617K1" } } } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "No construction fits this statement in this language: either the property or its value kind has no construction for the language, or no candidate's predicate word exists (a lexeme of the required lexical category linked to the predicate concept or the value item through P5137 or P9970, or a demonym of the value through P6271)", "Predicate construction from candidates" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6095" } }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q82042" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6095" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6095" } }, "K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q82042" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q217438" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q829903" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6091", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K3" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P5185" } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6005K5" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6091", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K3" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P5185" } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6005K5" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } }, "Z12696K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6091", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K3" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P21" } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6001K5" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z30120", "Z30120K1": { "Z1K1": "Z18", "Z18K1": "Z46617K2" }, "Z30120K2": [ "Z6030", "Z6036" ], "Z30120K3": [ "Z60" ], "Z30120K4": [ "Z6092", { "Z1K1": "Z6092", "Z6092K1": "P21" } ] } } } } }, "Z802K2": { "Z1K1": "Z6091", "Z6091K1": "Q162378" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6091", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K3" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P21" } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6001K5" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z30120", "Z30120K1": { "Z1K1": "Z18", "Z18K1": "Z46617K2" }, "Z30120K2": [ "Z6030", "Z6036" ], "Z30120K3": [ "Z60" ], "Z30120K4": [ "Z6092", { "Z1K1": "Z6092", "Z6092K1": "P21" } ] } } } } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q6581072" } }, "Z802K2": { "Z1K1": "Z6091", "Z6091K1": "Q1775415" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6091", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K3" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P21" } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6001K5" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z30120", "Z30120K1": { "Z1K1": "Z18", "Z18K1": "Z46617K2" }, "Z30120K2": [ "Z6030", "Z6036" ], "Z30120K3": [ "Z60" ], "Z30120K4": [ "Z6092", { "Z1K1": "Z6092", "Z6092K1": "P21" } ] } } } } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q6581097" } }, "Z802K2": { "Z1K1": "Z6091", "Z6091K1": "Q499327" }, "Z802K3": { "Z1K1": "Z6091", "Z6091K1": "Q162378" } } } } } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6095", "Z882K2": "Z6096" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6095", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z46568", "Z46568K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z6825", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z6830", "Z6830K1": { "Z1K1": "Z18", "Z18K1": "Z46617K3" }, "Z6830K2": { "Z1K1": "Z6092", "Z6092K1": "P6271" }, "Z6830K3": { "Z1K1": "Z18", "Z18K1": "Z46617K5" } } }, "Z46568K2": { "Z1K1": "Z18", "Z18K1": "Z46617K3" }, "Z46568K3": [ "Z6092", { "Z1K1": "Z6092", "Z6092K1": "P6271" } ], "Z46568K4": [ "Z6091", { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q82042" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ] } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6095", "Z882K2": "Z6096" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6095", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z46568", "Z46568K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z6825", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z6830", "Z6830K1": { "Z1K1": "Z18", "Z18K1": "Z46617K3" }, "Z6830K2": { "Z1K1": "Z6092", "Z6092K1": "P6271" }, "Z6830K3": { "Z1K1": "Z18", "Z18K1": "Z46617K5" } } }, "Z46568K2": { "Z1K1": "Z18", "Z18K1": "Z46617K3" }, "Z46568K3": [ "Z6092", { "Z1K1": "Z6092", "Z6092K1": "P6271" } ], "Z46568K4": [ "Z6091", { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q82042" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ] } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46570", "Z46570K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q179080" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q179080" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } }, "Z802K3": { "Z1K1": "Z18", "Z18K1": "Z46617K3" } }, "Z46570K2": { "Z1K1": "Z18", "Z18K1": "Z46617K5" }, "Z46570K3": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q82042" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } } }, "Z802K3": [ "Z6095" ] } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z18", "Z18K1": "Z46617K1" } } } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Predicate construction from candidates, composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "First candidate construction whose predicate word exists in the language (P5137 or P9970 link to the predicate concept or to the value item; P6271 demonym of the value), with the lexemes of that word in order. Constructions without a predicate word pass with no lexeme. Error when no candidate fits." } ] } } 9qgo1va95qxt5543417dy0l2j7n59ak Z46634 0 100172 330940 330065 2026-10-22T19:42:47Z Jsamwrites 938 Expectation follows the data: the preferred link comes first 330940 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46634" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46617", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z889", "Z889K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z46617", "Z46617K1": { "Z1K1": "Z7", "Z7K1": "Z46616", "Z46616K1": { "Z1K1": "Z6092", "Z6092K1": "P31" }, "Z46616K2": { "Z1K1": "Z60", "Z60K1": "ml" }, "Z46616K3": [ "Z39328" ], "Z46616K4": { "Z1K1": "Z6", "Z6K1": "Z6091" } }, "Z46617K2": { "Z1K1": "Z6091", "Z6091K1": "Q142" }, "Z46617K3": { "Z1K1": "Z6091", "Z6091K1": "Q6256" }, "Z46617K4": [ "Z39328" ], "Z46617K5": { "Z1K1": "Z60", "Z60K1": "ml" } } }, "Z889K2": [ "Z6095", { "Z1K1": "Z6095", "Z6095K1": "L1540" }, { "Z1K1": "Z6095", "Z6095K1": "L1528" } ], "Z889K3": "Z18683" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z844", "Z844K2": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Predicate construction from candidates: Malayalam country: both linked nouns, the preferred link first" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the lexemes of the chosen construction, in order." } ] } } 615wkupa6je1lhm56cozp9itj9qou7s Z46638 0 100176 330933 330069 2026-10-22T19:38:22Z Jsamwrites 938 Expectation follows the data: English demonym adjective French 330933 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46638" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46617", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z889", "Z889K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z46617", "Z46617K1": { "Z1K1": "Z7", "Z7K1": "Z46616", "Z46616K1": { "Z1K1": "Z6092", "Z6092K1": "P27" }, "Z46616K2": { "Z1K1": "Z60", "Z60K1": "en" }, "Z46616K3": [ "Z39328" ], "Z46616K4": { "Z1K1": "Z6", "Z6K1": "Z6091" } }, "Z46617K2": { "Z1K1": "Z6091", "Z6091K1": "Q7186" }, "Z46617K3": { "Z1K1": "Z6091", "Z6091K1": "Q142" }, "Z46617K4": [ "Z39328" ], "Z46617K5": { "Z1K1": "Z60", "Z60K1": "en" } } }, "Z889K2": [ "Z6095", { "Z1K1": "Z6095", "Z6095K1": "L527" } ], "Z889K3": "Z18683" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z844", "Z844K2": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Predicate construction from candidates: English citizenship: demonym adjective French" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the lexemes of the chosen construction, in order." } ] } } tqhbsuedvkqrumxr2ph0yub1o4zdjxy Z46639 0 100177 330934 330070 2026-10-22T19:38:23Z Jsamwrites 938 Expectation follows the data: Malayalam colour is now supported 330934 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46639" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46617", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z889", "Z889K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z46617", "Z46617K1": { "Z1K1": "Z7", "Z7K1": "Z46616", "Z46616K1": { "Z1K1": "Z6092", "Z6092K1": "P462" }, "Z46616K2": { "Z1K1": "Z60", "Z60K1": "ml" }, "Z46616K3": [ "Z39328" ], "Z46616K4": { "Z1K1": "Z6", "Z6K1": "Z6091" } }, "Z46617K2": { "Z1K1": "Z6091", "Z6091K1": "Q41176" }, "Z46617K3": { "Z1K1": "Z6091", "Z6091K1": "Q3142" }, "Z46617K4": [ "Z39328" ], "Z46617K5": { "Z1K1": "Z60", "Z60K1": "ml" } } }, "Z889K2": [ "Z6095", { "Z1K1": "Z6095", "Z6095K1": "L300788" } ], "Z889K3": "Z18683" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z844", "Z844K2": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Predicate construction from candidates: Malayalam red: the adjective with the head noun colour" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the lexemes of the chosen construction, in order." } ] } } o04g5w5x3na50urbchtihf8y10dzycb Z46641 0 100179 330943 330092 2026-10-22T20:16:18Z Jsamwrites 938 Removed Z46642 from the approved list of implementations 330943 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46641" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z46641K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46641K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20", "Z46643", "Z46644", "Z46645", "Z46646", "Z46647", "Z46648", "Z46649", "Z46650", "Z46651", "Z46652" ], "Z8K4": [ "Z14" ], "Z8K5": "Z46641" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Referring noun phrase for item" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Noun phrase referring to the item: a common noun lexeme linked through P5137, else a proper noun lexeme, else the label in the language or 'mul' (gender from P21); with the article the language uses for such a reference." } ] } } mop3hmlo65fsu0k317xwewlu8z5uunb 330946 330943 2026-10-22T20:26:48Z Jsamwrites 938 Added Z46642 to the approved list of implementations 330946 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46641" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z46641K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46641K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20", "Z46643", "Z46644", "Z46645", "Z46646", "Z46647", "Z46648", "Z46649", "Z46650", "Z46651", "Z46652" ], "Z8K4": [ "Z14", "Z46642" ], "Z8K5": "Z46641" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Referring noun phrase for item" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Noun phrase referring to the item: a common noun lexeme linked through P5137, else a proper noun lexeme, else the label in the language or 'mul' (gender from P21); with the article the language uses for such a reference." } ] } } 5jk623hjjr4ozo976hjb8nh3djuziw4 330947 330946 2026-10-22T20:27:38Z Jsamwrites 938 Added Z46808 to the approved list of test cases 330947 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46641" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z46641K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46641K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20", "Z46643", "Z46644", "Z46645", "Z46646", "Z46647", "Z46648", "Z46649", "Z46650", "Z46651", "Z46652", "Z46808" ], "Z8K4": [ "Z14", "Z46642" ], "Z8K5": "Z46641" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Referring noun phrase for item" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Noun phrase referring to the item: a common noun lexeme linked through P5137, else a proper noun lexeme, else the label in the language or 'mul' (gender from P21); with the article the language uses for such a reference." } ] } } itee233h72qupyf3g9oe7fhppy96fbg Z46642 0 100180 330944 330080 2026-10-22T20:25:38Z Jsamwrites 938 Names whose lexeme declines keep their case open: the form with the bound case (Nationum Unitarum), unmarked forms first 330944 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46642" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z46641", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6001", "Z17K2": "Z8K9", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z7", "Z7K1": "Z14310", "Z14310K1": "Z46640", "Z14310K2": { "Z1K1": "Z18", "Z18K1": "Z46641K2" } }, "K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z46570", "Z46570K1": { "Z1K1": "Z18", "Z18K1": "Z46641K1" }, "Z46570K2": { "Z1K1": "Z18", "Z18K1": "Z46641K2" }, "Z46570K3": { "Z1K1": "Z6091", "Z6091K1": "Q1084" } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "K2": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6091", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K3" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P31" } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6001K5" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K9" } } } }, "K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z46570", "Z46570K1": { "Z1K1": "Z18", "Z18K1": "Z46641K1" }, "Z46570K2": { "Z1K1": "Z18", "Z18K1": "Z46641K2" }, "Z46570K3": { "Z1K1": "Z6091", "Z6091K1": "Q1084" } } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z46570", "Z46570K1": { "Z1K1": "Z18", "Z18K1": "Z46641K1" }, "Z46570K2": { "Z1K1": "Z18", "Z18K1": "Z46641K2" }, "Z46570K3": { "Z1K1": "Z6091", "Z6091K1": "Q147276" } } }, "Z802K2": { "Z1K1": "Z39358", "Z39358K1": { "Z1K1": "Z18", "Z18K1": "Z46641K2" }, "Z39358K2": { "Z1K1": "Z6091", "Z6091K1": "Q1401131" }, "Z39358K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6091", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K3" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P21" } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6001K5" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K9" } } } } }, "Z802K2": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } } ], "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6091", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K3" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P21" } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6001K5" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K9" } } } } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q6581072" } }, "Z802K2": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q162378" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1775415" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } } ], "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6091", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K3" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P21" } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6001K5" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K9" } } } } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q6581097" } }, "Z802K2": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q162378" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q499327" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } } ], "Z802K3": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } } ] } } }, "Z39358K4": { "Z1K1": "Z38546", "Z38546K1": [ "Z38545" ], "Z38546K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z43902" } }, "Z38546K3": [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z46096" } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z11", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z11K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46641K2" } } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z12K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6001K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K9" } } } } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z11", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z11K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "mul" } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z12K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6001K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K9" } } } } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "The item has neither a lexeme linked through P5137 nor a label in this language or in 'mul'", "Referring noun phrase for item" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z11K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z11", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z11K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "mul" } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z12K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6001K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K9" } } } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z11K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z11", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z11K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46641K2" } } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z12K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6001K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K9" } } } } } } } ] } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6005", "Z17K2": "Z8K8", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z19243", "Z19243K1": { "Z1K1": "Z18", "Z18K1": "Z8K8" }, "Z19243K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q131105" } ] } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K2": { "Z1K1": "Z39358", "Z39358K1": { "Z1K1": "Z18", "Z18K1": "Z46641K2" }, "Z39358K2": { "Z1K1": "Z6091", "Z6091K1": "Q1401131" }, "Z39358K3": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39328", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q162378" }, "Z39328K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K3" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P5185" } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6005K5" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K8" } } } } }, "Z39358K4": { "Z1K1": "Z38546", "Z38546K1": [ "Z38545", { "Z1K1": "Z38545", "Z38545K1": "K1", "Z38545K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z6091" } }, "Z38545K3": { "Z1K1": "Z6091", "Z6091K1": "Q128234" } } ], "Z38546K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z43902" } }, "Z38546K3": [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z46096" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z46118" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z802" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z813" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z19243" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z6825" } }, { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6005K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K8" } } ], [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z810" } }, { "Z1K1": "Z38548", "Z38548K1": "K1" }, [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q110786" } ] ] ] ], [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z19243" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z6825" } }, { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6005K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K8" } } ], [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z810" } }, { "Z1K1": "Z38548", "Z38548K1": "K1" }, [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q146786" } ] ] ], [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z19243" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z6825" } }, { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6005K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K8" } } ], [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z810" } }, { "Z1K1": "Z38548", "Z38548K1": "K1" }, [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q110786" } ] ] ] ], { "Z1K1": "Z18", "Z18K1": "Z46641K2" } ] ] } }, "Z802K3": { "Z1K1": "Z39358", "Z39358K1": { "Z1K1": "Z18", "Z18K1": "Z46641K2" }, "Z39358K2": { "Z1K1": "Z6091", "Z6091K1": "Q1401131" }, "Z39358K3": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39328", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q162378" }, "Z39328K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K3" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P5185" } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6005K5" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K8" } } } } }, "Z39358K4": { "Z1K1": "Z38546", "Z38546K1": [ "Z38545" ], "Z38546K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z43902" } }, "Z38546K3": [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z46096" } }, { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z11K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z12K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6005K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K8" } } } } } ] } } } } ], "Z8K5": "Z8" }, "Z8K8": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z46570", "Z46570K1": { "Z1K1": "Z18", "Z18K1": "Z46641K1" }, "Z46570K2": { "Z1K1": "Z18", "Z18K1": "Z46641K2" }, "Z46570K3": { "Z1K1": "Z6091", "Z6091K1": "Q147276" } } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46073", "Z46073K1": { "Z1K1": "Z7", "Z7K1": "Z46069", "Z46069K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z46570", "Z46570K1": { "Z1K1": "Z18", "Z18K1": "Z46641K1" }, "Z46570K2": { "Z1K1": "Z18", "Z18K1": "Z46641K2" }, "Z46570K3": { "Z1K1": "Z6091", "Z6091K1": "Q1084" } } }, "Z46069K2": { "Z1K1": "Z18", "Z18K1": "Z46641K2" } } } } } } ], "Z8K5": "Z8" }, "Z8K9": { "Z1K1": "Z7", "Z7K1": "Z30120", "Z30120K1": { "Z1K1": "Z18", "Z18K1": "Z46641K1" }, "Z30120K2": [ "Z6030", "Z6033", "Z6036" ], "Z30120K3": [ "Z60", { "Z1K1": "Z18", "Z18K1": "Z46641K2" }, { "Z1K1": "Z60", "Z60K1": "mul" } ], "Z30120K4": [ "Z6092", { "Z1K1": "Z6092", "Z6092K1": "P21" }, { "Z1K1": "Z6092", "Z6092K1": "P31" } ] } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Referring noun phrase for item, composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "One fetch of labels and P21/P31; lexeme or label; article from the language options." } ] } } 9gzq2bnzb6d0dgrruawqk47pw4pg0rq Z46654 0 100192 330973 330239 2026-10-22T23:26:20Z Jsamwrites 938 Negative copulas: Malayalam അല്ല (past ആയിരുന്നു / അല്ലായിരുന്നു), Dagbani pa / ka 330973 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46654" }, "Z2K2": { "Z1K1": "Z14294", "Z14294K1": [ "Z14293", { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z39358", "Z39358K1": { "Z1K1": "Z7", "Z7K1": "Z39362", "Z39362K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K2": { "Z1K1": "Z6091", "Z6091K1": "Q1778442" }, "Z39358K3": { "Z1K1": "Z7", "Z7K1": "Z39371", "Z39371K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K4": { "Z1K1": "Z38546", "Z38546K1": { "Z1K1": "Z7", "Z7K1": "Z27665", "Z27665K1": [ "Z1", { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } ] }, "Z38546K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z43902" } }, "Z38546K3": [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } ] } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z876", "Z876K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z1", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z43131", "Z43131K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z43131K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z43131K3": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "C", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } } ], "Z8K5": "Z8" }, "Z876K2": { "Z1K1": "Z7", "Z7K1": "Z28316", "Z28316K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z12696K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ], "Z8K5": "Z8" }, "Z28316K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z28316K3": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z38563", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } }, "Z876K3": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z8K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z7", "Z7K1": "Z46291", "Z46291K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q109377685" } }, "Z802K2": { "Z1K1": "Z6095", "Z6095K1": "L1883" }, "Z802K3": { "Z1K1": "Z6095", "Z6095K1": "L1883" } }, "Z46291K2": { "Z1K1": "Z60", "Z60K1": "en" } }, "Z8K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z8K3": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z7", "Z7K1": "Z14310", "Z14310K1": "Z46502", "Z14310K2": { "Z1K1": "Z60", "Z60K1": "en" } }, "K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ], "Z8K5": "Z8" }, "Z14293K2": "Z33034" }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z39358", "Z39358K1": { "Z1K1": "Z7", "Z7K1": "Z39362", "Z39362K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K2": { "Z1K1": "Z6091", "Z6091K1": "Q1778442" }, "Z39358K3": { "Z1K1": "Z7", "Z7K1": "Z39371", "Z39371K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K4": { "Z1K1": "Z38546", "Z38546K1": { "Z1K1": "Z7", "Z7K1": "Z27665", "Z27665K1": [ "Z1", { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } ] }, "Z38546K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z43902" } }, "Z38546K3": [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } ] } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z876", "Z876K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z1", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z43131", "Z43131K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z43131K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z43131K3": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "C", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } } ], "Z8K5": "Z8" }, "Z876K2": { "Z1K1": "Z7", "Z7K1": "Z28316", "Z28316K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z12696K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ], "Z8K5": "Z8" }, "Z28316K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z28316K3": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z38563", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } }, "Z876K3": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z8K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z7", "Z7K1": "Z46291", "Z46291K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q109377685" } }, "Z802K2": { "Z1K1": "Z6095", "Z6095K1": "L1882" }, "Z802K3": { "Z1K1": "Z6095", "Z6095K1": "L1882" } }, "Z46291K2": { "Z1K1": "Z60", "Z60K1": "fr" } }, "Z8K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z8K3": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z7", "Z7K1": "Z14310", "Z14310K1": "Z46502", "Z14310K2": { "Z1K1": "Z60", "Z60K1": "fr" } }, "K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1004" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z39358", "Z39358K1": { "Z1K1": "Z7", "Z7K1": "Z39362", "Z39362K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K2": { "Z1K1": "Z6091", "Z6091K1": "Q1778442" }, "Z39358K3": { "Z1K1": "Z7", "Z7K1": "Z39371", "Z39371K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K4": { "Z1K1": "Z38546", "Z38546K1": { "Z1K1": "Z7", "Z7K1": "Z27665", "Z27665K1": [ "Z1", { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } ] }, "Z38546K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z43902" } }, "Z38546K3": [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } ] } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z876", "Z876K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z1", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z43131", "Z43131K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z43131K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z43131K3": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "C", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } } ], "Z8K5": "Z8" }, "Z876K2": { "Z1K1": "Z7", "Z7K1": "Z28316", "Z28316K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z12696K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ], "Z8K5": "Z8" }, "Z28316K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z28316K3": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z38563", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } }, "Z876K3": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z8K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z7", "Z7K1": "Z46291", "Z46291K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q109377685" } }, "Z802K2": { "Z1K1": "Z6095", "Z6095K1": "L5141" }, "Z802K3": { "Z1K1": "Z6095", "Z6095K1": "L5140" } }, "Z46291K2": { "Z1K1": "Z60", "Z60K1": "es" } }, "Z8K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z8K3": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z7", "Z7K1": "Z14310", "Z14310K1": "Z46502", "Z14310K2": { "Z1K1": "Z60", "Z60K1": "es" } }, "K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1003" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z39358", "Z39358K1": { "Z1K1": "Z7", "Z7K1": "Z39362", "Z39362K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K2": { "Z1K1": "Z6091", "Z6091K1": "Q1778442" }, "Z39358K3": { "Z1K1": "Z7", "Z7K1": "Z39371", "Z39371K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K4": { "Z1K1": "Z38546", "Z38546K1": { "Z1K1": "Z7", "Z7K1": "Z27665", "Z27665K1": [ "Z1", { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } ] }, "Z38546K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z43902" } }, "Z38546K3": [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } ] } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z876", "Z876K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z1", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z43131", "Z43131K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z43131K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z43131K3": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "C", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } } ], "Z8K5": "Z8" }, "Z876K2": { "Z1K1": "Z7", "Z7K1": "Z28316", "Z28316K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z12696K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ], "Z8K5": "Z8" }, "Z28316K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z28316K3": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z38563", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } }, "Z876K3": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z8K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z7", "Z7K1": "Z46291", "Z46291K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q109377685" } }, "Z802K2": { "Z1K1": "Z6095", "Z6095K1": "L29204" }, "Z802K3": { "Z1K1": "Z6095", "Z6095K1": "L29204" } }, "Z46291K2": { "Z1K1": "Z60", "Z60K1": "la" } }, "Z8K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z8K3": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z7", "Z7K1": "Z14310", "Z14310K1": "Z46502", "Z14310K2": { "Z1K1": "Z60", "Z60K1": "la" } }, "K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1403" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z39358", "Z39358K1": { "Z1K1": "Z7", "Z7K1": "Z39362", "Z39362K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K2": { "Z1K1": "Z6091", "Z6091K1": "Q1778442" }, "Z39358K3": { "Z1K1": "Z7", "Z7K1": "Z39371", "Z39371K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K4": { "Z1K1": "Z38546", "Z38546K1": { "Z1K1": "Z7", "Z7K1": "Z27665", "Z27665K1": [ "Z1", { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } ] }, "Z38546K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z43902" } }, "Z38546K3": [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } ] } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z876", "Z876K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z1", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z43131", "Z43131K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z43131K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z43131K3": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "C", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } } ], "Z8K5": "Z8" }, "Z876K2": { "Z1K1": "Z7", "Z7K1": "Z28316", "Z28316K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z12696K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ], "Z8K5": "Z8" }, "Z28316K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z28316K3": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z38563", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } }, "Z876K3": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z8K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z7", "Z7K1": "Z46291", "Z46291K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q109377685" } }, "Z802K2": { "Z1K1": "Z6095", "Z6095K1": "L643890" }, "Z802K3": { "Z1K1": "Z6095", "Z6095K1": "L643929" } }, "Z46291K2": { "Z1K1": "Z60", "Z60K1": "ig" } }, "Z8K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z8K3": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z7", "Z7K1": "Z14310", "Z14310K1": "Z46502", "Z14310K2": { "Z1K1": "Z60", "Z60K1": "ig" } }, "K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1014" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z39358", "Z39358K1": { "Z1K1": "Z7", "Z7K1": "Z39362", "Z39362K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K2": { "Z1K1": "Z6091", "Z6091K1": "Q1778442" }, "Z39358K3": { "Z1K1": "Z7", "Z7K1": "Z39371", "Z39371K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K4": { "Z1K1": "Z38546", "Z38546K1": { "Z1K1": "Z7", "Z7K1": "Z27665", "Z27665K1": [ "Z1", { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } ] }, "Z38546K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z43902" } }, "Z38546K3": [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } ] } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z876", "Z876K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z1", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z43131", "Z43131K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z43131K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z43131K3": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "C", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } } ], "Z8K5": "Z8" }, "Z876K2": { "Z1K1": "Z7", "Z7K1": "Z28316", "Z28316K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z12696K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ], "Z8K5": "Z8" }, "Z28316K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z28316K3": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z38563", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } }, "Z876K3": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z8K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z39358", "Z39358K1": { "Z1K1": "Z60", "Z60K1": "dag" }, "Z39358K2": { "Z1K1": "Z6091", "Z6091K1": "Q1778442" }, "Z39358K3": [ "Z39328" ], "Z39358K4": { "Z1K1": "Z38546", "Z38546K1": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z7", "Z7K1": "Z46291", "Z46291K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q109377685" } }, "Z802K2": { "Z1K1": "Z6095", "Z6095K1": "L652589" }, "Z802K3": { "Z1K1": "Z6095", "Z6095K1": "L651347" } }, "Z46291K2": { "Z1K1": "Z60", "Z60K1": "dag" } } } }, "Z38546K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z43902" } }, "Z38546K3": [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z802" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z12696" } }, { "Z1K1": "Z38548", "Z38548K1": "KF" }, { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } ], [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z46096" } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q109377685" } }, "Z802K2": "ka", "Z802K3": "pa" } ], [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z46096" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z10000" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z10938" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z27854" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z811" } }, { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z7", "Z7K1": "Z46291", "Z46291K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q109377685" } }, "Z802K2": { "Z1K1": "Z6095", "Z6095K1": "L652589" }, "Z802K3": { "Z1K1": "Z6095", "Z6095K1": "L651347" } }, "Z46291K2": { "Z1K1": "Z60", "Z60K1": "dag" } } } } ] ] ], { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q109377685" } }, "Z802K2": "ni la", "Z802K3": "la" } ] ] ] } }, "Z8K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z8K3": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z7", "Z7K1": "Z14310", "Z14310K1": "Z46502", "Z14310K2": { "Z1K1": "Z60", "Z60K1": "dag" } }, "K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1015" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z39358", "Z39358K1": { "Z1K1": "Z60", "Z60K1": "ml" }, "Z39358K2": { "Z1K1": "Z6091", "Z6091K1": "Q1778442" }, "Z39358K3": [ "Z39328" ], "Z39358K4": { "Z1K1": "Z38546", "Z38546K1": { "Z1K1": "Z7", "Z7K1": "Z12767", "Z12767K1": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z12767K2": [ "Z38545", { "Z1K1": "Z38545", "Z38545K1": "KF", "Z38545K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "Z38545K3": { "Z1K1": "Z6091", "Z6091K1": "Q4147654" } } ] }, "Z38546K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z43902" } }, "Z38546K3": [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z46096" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z43825" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z10938" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z27854" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z811" } }, { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } ] ] ], [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z802" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z12696" } }, { "Z1K1": "Z38548", "Z38548K1": "KF" }, { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } ], [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z802" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z12696" } }, { "Z1K1": "Z38548", "Z38548K1": "KF" }, { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } ], "അല്ലായിരുന്നു", "ആയിരുന്നു" ], [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z802" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z12696" } }, { "Z1K1": "Z38548", "Z38548K1": "KF" }, { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } ], "അല്ല", "ആണ്" ] ] ] ] } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1012" ] } ], "Z14294K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "No copula is defined for this language", "Copula language options" ] } } ], "Z8K5": "Z8" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Copula language options" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Copula by role: English be, French être, Spanish ser / estar (location), Latin sum, Igbo bụ / nọ (location), Dagbani nyɛ + la / be + ni la (location), negative pa / ka; Malayalam joins the complement and ആണ് (negative അല്ല, past ആയിരുന്നു / അല്ലായിരുന്നു)." } ] } } ki8kd5jt9srwn63epsaj8k3ezpxp1a3 330977 330973 2026-10-22T23:51:07Z Jsamwrites 938 Malayalam past copula also for simple past requests 330977 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46654" }, "Z2K2": { "Z1K1": "Z14294", "Z14294K1": [ "Z14293", { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z39358", "Z39358K1": { "Z1K1": "Z7", "Z7K1": "Z39362", "Z39362K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K2": { "Z1K1": "Z6091", "Z6091K1": "Q1778442" }, "Z39358K3": { "Z1K1": "Z7", "Z7K1": "Z39371", "Z39371K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K4": { "Z1K1": "Z38546", "Z38546K1": { "Z1K1": "Z7", "Z7K1": "Z27665", "Z27665K1": [ "Z1", { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } ] }, "Z38546K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z43902" } }, "Z38546K3": [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } ] } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z876", "Z876K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z1", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z43131", "Z43131K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z43131K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z43131K3": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "C", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } } ], "Z8K5": "Z8" }, "Z876K2": { "Z1K1": "Z7", "Z7K1": "Z28316", "Z28316K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z12696K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ], "Z8K5": "Z8" }, "Z28316K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z28316K3": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z38563", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } }, "Z876K3": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z8K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z7", "Z7K1": "Z46291", "Z46291K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q109377685" } }, "Z802K2": { "Z1K1": "Z6095", "Z6095K1": "L1883" }, "Z802K3": { "Z1K1": "Z6095", "Z6095K1": "L1883" } }, "Z46291K2": { "Z1K1": "Z60", "Z60K1": "en" } }, "Z8K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z8K3": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z7", "Z7K1": "Z14310", "Z14310K1": "Z46502", "Z14310K2": { "Z1K1": "Z60", "Z60K1": "en" } }, "K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ], "Z8K5": "Z8" }, "Z14293K2": "Z33034" }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z39358", "Z39358K1": { "Z1K1": "Z7", "Z7K1": "Z39362", "Z39362K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K2": { "Z1K1": "Z6091", "Z6091K1": "Q1778442" }, "Z39358K3": { "Z1K1": "Z7", "Z7K1": "Z39371", "Z39371K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K4": { "Z1K1": "Z38546", "Z38546K1": { "Z1K1": "Z7", "Z7K1": "Z27665", "Z27665K1": [ "Z1", { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } ] }, "Z38546K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z43902" } }, "Z38546K3": [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } ] } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z876", "Z876K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z1", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z43131", "Z43131K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z43131K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z43131K3": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "C", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } } ], "Z8K5": "Z8" }, "Z876K2": { "Z1K1": "Z7", "Z7K1": "Z28316", "Z28316K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z12696K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ], "Z8K5": "Z8" }, "Z28316K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z28316K3": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z38563", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } }, "Z876K3": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z8K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z7", "Z7K1": "Z46291", "Z46291K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q109377685" } }, "Z802K2": { "Z1K1": "Z6095", "Z6095K1": "L1882" }, "Z802K3": { "Z1K1": "Z6095", "Z6095K1": "L1882" } }, "Z46291K2": { "Z1K1": "Z60", "Z60K1": "fr" } }, "Z8K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z8K3": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z7", "Z7K1": "Z14310", "Z14310K1": "Z46502", "Z14310K2": { "Z1K1": "Z60", "Z60K1": "fr" } }, "K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1004" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z39358", "Z39358K1": { "Z1K1": "Z7", "Z7K1": "Z39362", "Z39362K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K2": { "Z1K1": "Z6091", "Z6091K1": "Q1778442" }, "Z39358K3": { "Z1K1": "Z7", "Z7K1": "Z39371", "Z39371K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K4": { "Z1K1": "Z38546", "Z38546K1": { "Z1K1": "Z7", "Z7K1": "Z27665", "Z27665K1": [ "Z1", { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } ] }, "Z38546K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z43902" } }, "Z38546K3": [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } ] } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z876", "Z876K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z1", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z43131", "Z43131K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z43131K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z43131K3": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "C", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } } ], "Z8K5": "Z8" }, "Z876K2": { "Z1K1": "Z7", "Z7K1": "Z28316", "Z28316K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z12696K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ], "Z8K5": "Z8" }, "Z28316K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z28316K3": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z38563", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } }, "Z876K3": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z8K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z7", "Z7K1": "Z46291", "Z46291K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q109377685" } }, "Z802K2": { "Z1K1": "Z6095", "Z6095K1": "L5141" }, "Z802K3": { "Z1K1": "Z6095", "Z6095K1": "L5140" } }, "Z46291K2": { "Z1K1": "Z60", "Z60K1": "es" } }, "Z8K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z8K3": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z7", "Z7K1": "Z14310", "Z14310K1": "Z46502", "Z14310K2": { "Z1K1": "Z60", "Z60K1": "es" } }, "K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1003" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z39358", "Z39358K1": { "Z1K1": "Z7", "Z7K1": "Z39362", "Z39362K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K2": { "Z1K1": "Z6091", "Z6091K1": "Q1778442" }, "Z39358K3": { "Z1K1": "Z7", "Z7K1": "Z39371", "Z39371K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K4": { "Z1K1": "Z38546", "Z38546K1": { "Z1K1": "Z7", "Z7K1": "Z27665", "Z27665K1": [ "Z1", { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } ] }, "Z38546K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z43902" } }, "Z38546K3": [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } ] } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z876", "Z876K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z1", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z43131", "Z43131K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z43131K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z43131K3": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "C", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } } ], "Z8K5": "Z8" }, "Z876K2": { "Z1K1": "Z7", "Z7K1": "Z28316", "Z28316K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z12696K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ], "Z8K5": "Z8" }, "Z28316K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z28316K3": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z38563", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } }, "Z876K3": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z8K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z7", "Z7K1": "Z46291", "Z46291K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q109377685" } }, "Z802K2": { "Z1K1": "Z6095", "Z6095K1": "L29204" }, "Z802K3": { "Z1K1": "Z6095", "Z6095K1": "L29204" } }, "Z46291K2": { "Z1K1": "Z60", "Z60K1": "la" } }, "Z8K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z8K3": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z7", "Z7K1": "Z14310", "Z14310K1": "Z46502", "Z14310K2": { "Z1K1": "Z60", "Z60K1": "la" } }, "K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1403" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z39358", "Z39358K1": { "Z1K1": "Z7", "Z7K1": "Z39362", "Z39362K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K2": { "Z1K1": "Z6091", "Z6091K1": "Q1778442" }, "Z39358K3": { "Z1K1": "Z7", "Z7K1": "Z39371", "Z39371K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K4": { "Z1K1": "Z38546", "Z38546K1": { "Z1K1": "Z7", "Z7K1": "Z27665", "Z27665K1": [ "Z1", { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } ] }, "Z38546K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z43902" } }, "Z38546K3": [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } ] } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z876", "Z876K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z1", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z43131", "Z43131K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z43131K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z43131K3": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "C", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } } ], "Z8K5": "Z8" }, "Z876K2": { "Z1K1": "Z7", "Z7K1": "Z28316", "Z28316K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z12696K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ], "Z8K5": "Z8" }, "Z28316K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z28316K3": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z38563", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } }, "Z876K3": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z8K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z7", "Z7K1": "Z46291", "Z46291K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q109377685" } }, "Z802K2": { "Z1K1": "Z6095", "Z6095K1": "L643890" }, "Z802K3": { "Z1K1": "Z6095", "Z6095K1": "L643929" } }, "Z46291K2": { "Z1K1": "Z60", "Z60K1": "ig" } }, "Z8K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z8K3": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z7", "Z7K1": "Z14310", "Z14310K1": "Z46502", "Z14310K2": { "Z1K1": "Z60", "Z60K1": "ig" } }, "K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1014" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z39358", "Z39358K1": { "Z1K1": "Z7", "Z7K1": "Z39362", "Z39362K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K2": { "Z1K1": "Z6091", "Z6091K1": "Q1778442" }, "Z39358K3": { "Z1K1": "Z7", "Z7K1": "Z39371", "Z39371K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K4": { "Z1K1": "Z38546", "Z38546K1": { "Z1K1": "Z7", "Z7K1": "Z27665", "Z27665K1": [ "Z1", { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } ] }, "Z38546K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z43902" } }, "Z38546K3": [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } ] } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z876", "Z876K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z1", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z43131", "Z43131K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z43131K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z43131K3": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "C", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } } ], "Z8K5": "Z8" }, "Z876K2": { "Z1K1": "Z7", "Z7K1": "Z28316", "Z28316K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z12696K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ], "Z8K5": "Z8" }, "Z28316K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z28316K3": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z38563", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } }, "Z876K3": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z8K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z39358", "Z39358K1": { "Z1K1": "Z60", "Z60K1": "dag" }, "Z39358K2": { "Z1K1": "Z6091", "Z6091K1": "Q1778442" }, "Z39358K3": [ "Z39328" ], "Z39358K4": { "Z1K1": "Z38546", "Z38546K1": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z7", "Z7K1": "Z46291", "Z46291K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q109377685" } }, "Z802K2": { "Z1K1": "Z6095", "Z6095K1": "L652589" }, "Z802K3": { "Z1K1": "Z6095", "Z6095K1": "L651347" } }, "Z46291K2": { "Z1K1": "Z60", "Z60K1": "dag" } } } }, "Z38546K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z43902" } }, "Z38546K3": [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z802" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z12696" } }, { "Z1K1": "Z38548", "Z38548K1": "KF" }, { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } ], [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z46096" } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q109377685" } }, "Z802K2": "ka", "Z802K3": "pa" } ], [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z46096" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z10000" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z10938" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z27854" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z811" } }, { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z7", "Z7K1": "Z46291", "Z46291K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q109377685" } }, "Z802K2": { "Z1K1": "Z6095", "Z6095K1": "L652589" }, "Z802K3": { "Z1K1": "Z6095", "Z6095K1": "L651347" } }, "Z46291K2": { "Z1K1": "Z60", "Z60K1": "dag" } } } } ] ] ], { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q109377685" } }, "Z802K2": "ni la", "Z802K3": "la" } ] ] ] } }, "Z8K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z8K3": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z7", "Z7K1": "Z14310", "Z14310K1": "Z46502", "Z14310K2": { "Z1K1": "Z60", "Z60K1": "dag" } }, "K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1015" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z39358", "Z39358K1": { "Z1K1": "Z60", "Z60K1": "ml" }, "Z39358K2": { "Z1K1": "Z6091", "Z6091K1": "Q1778442" }, "Z39358K3": [ "Z39328" ], "Z39358K4": { "Z1K1": "Z38546", "Z38546K1": { "Z1K1": "Z7", "Z7K1": "Z12767", "Z12767K1": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z12767K2": [ "Z38545", { "Z1K1": "Z38545", "Z38545K1": "KF", "Z38545K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "Z38545K3": { "Z1K1": "Z6091", "Z6091K1": "Q4147654" } } ] }, "Z38546K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z43902" } }, "Z38546K3": [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z46096" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z43825" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z10938" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z27854" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z811" } }, { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } ] ] ], [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z802" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z802" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z12696" } }, { "Z1K1": "Z38548", "Z38548K1": "KF" }, { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } ], { "Z1K1": "Z40", "Z40K1": "Z41" }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z12696" } }, { "Z1K1": "Z38548", "Z38548K1": "KF" }, { "Z1K1": "Z6091", "Z6091K1": "Q1392475" } ] ], [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z802" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z12696" } }, { "Z1K1": "Z38548", "Z38548K1": "KF" }, { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } ], "അല്ലായിരുന്നു", "ആയിരുന്നു" ], [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z802" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z12696" } }, { "Z1K1": "Z38548", "Z38548K1": "KF" }, { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } ], "അല്ല", "ആണ്" ] ] ] ] } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1012" ] } ], "Z14294K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "No copula is defined for this language", "Copula language options" ] } } ], "Z8K5": "Z8" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Copula language options" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Copula by role: English be, French être, Spanish ser / estar (location), Latin sum, Igbo bụ / nọ (location), Dagbani nyɛ + la / be + ni la (location), negative pa / ka; Malayalam joins the complement and ആണ് (negative അല്ല, past ആയിരുന്നു / അല്ലായിരുന്നു)." } ] } } catddcrd3hkufaceb5q1yc0l0lkd4fz Z46658 0 100196 330926 330182 2026-10-22T19:35:37Z Jsamwrites 938 Removed Z46661 from the approved list of implementations 330926 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46658" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z46658K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "construction" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z46658K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "lexeme" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z46658K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "value phrase" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z46658K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "subject features" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46658K5", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20", "Z46706", "Z46707", "Z46708", "Z46709", "Z46710", "Z46711", "Z46712", "Z46713", "Z46714", "Z46715" ], "Z8K4": [ "Z14" ], "Z8K5": "Z46658" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Predicate word phrase" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Predicate noun (with the language's article and, for relational nouns, the value as complement) or predicate adjective agreeing with the subject features." } ] } } bzfwsq6mukzb0ls4p8x123qfimh4c33 330938 330926 2026-10-22T19:41:37Z Jsamwrites 938 Added Z46661 to the approved list of implementations 330938 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46658" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z46658K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "construction" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6095", "Z17K2": "Z46658K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "lexeme" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z46658K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "value phrase" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z46658K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "subject features" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46658K5", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20", "Z46706", "Z46707", "Z46708", "Z46709", "Z46710", "Z46711", "Z46712", "Z46713", "Z46714", "Z46715" ], "Z8K4": [ "Z14", "Z46661" ], "Z8K5": "Z46658" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Predicate word phrase" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Predicate noun (with the language's article and, for relational nouns, the value as complement) or predicate adjective agreeing with the subject features." } ] } } 76bv5hevo75zftxutazrz7bj7cneztx Z46659 0 100197 330978 330319 2026-10-22T23:55:41Z Jsamwrites 938 Removed Z46662 from the approved list of implementations 330978 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46659" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6095" } }, "Z17K2": "Z46659K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "selected construction" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z39358" } }, "Z17K2": "Z46659K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "arguments" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z46659K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "subject features" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46659K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20", "Z46663", "Z46664", "Z46665", "Z46666", "Z46667", "Z46668", "Z46669", "Z46670", "Z46671", "Z46672" ], "Z8K4": [ "Z14" ], "Z8K5": "Z46659" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Semantic predicate phrase" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Deferred verb phrase realizing one selected construction with role-labelled argument phrases; the grammatical subject is not included. Transitive, intransitive and copular constructions." } ] } } c7xfgnga4haujbuye4dntl51lc57w4f 330981 330978 2026-10-23T00:05:53Z Jsamwrites 938 Added Z46662 to the approved list of implementations 330981 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46659" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6095" } }, "Z17K2": "Z46659K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "selected construction" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z39358" } }, "Z17K2": "Z46659K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "arguments" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z46659K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "subject features" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46659K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20", "Z46663", "Z46664", "Z46665", "Z46666", "Z46667", "Z46668", "Z46669", "Z46670", "Z46671", "Z46672" ], "Z8K4": [ "Z14", "Z46662" ], "Z8K5": "Z46659" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Semantic predicate phrase" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Deferred verb phrase realizing one selected construction with role-labelled argument phrases; the grammatical subject is not included. Transitive, intransitive and copular constructions." } ] } } ccdczd592mqap9rh177vk16ojrjbz8l Z46661 0 100199 330931 330101 2026-10-22T19:37:59Z Jsamwrites 938 Adjective with a head noun named by the construction (by the subject's gender when given); numerals as nouns 330931 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46661" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z46658", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q82042" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46658K1" } } } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1084" } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q82042" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46658K1" } } } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q63116" } } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1814980" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46658K1" } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z7", "Z7K1": "Z14310", "Z14310K1": "Z46656", "Z14310K2": { "Z1K1": "Z18", "Z18K1": "Z46658K5" } }, "K1": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z7", "Z7K1": "Z14310", "Z14310K1": "Z46655", "Z14310K2": { "Z1K1": "Z18", "Z18K1": "Z46658K5" } }, "K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1814980" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46658K1" } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "K2": { "Z1K1": "Z7", "Z7K1": "Z46073", "Z46073K1": { "Z1K1": "Z7", "Z7K1": "Z46069", "Z46069K1": { "Z1K1": "Z18", "Z18K1": "Z46658K2" }, "Z46069K2": { "Z1K1": "Z18", "Z18K1": "Z46658K5" } } } }, "K2": { "Z1K1": "Z18", "Z18K1": "Z46658K3" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z7", "Z7K1": "Z14310", "Z14310K1": "Z46655", "Z14310K2": { "Z1K1": "Z18", "Z18K1": "Z46658K5" } }, "K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1814980" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46658K1" } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "K2": { "Z1K1": "Z7", "Z7K1": "Z46073", "Z46073K1": { "Z1K1": "Z7", "Z7K1": "Z46069", "Z46069K1": { "Z1K1": "Z18", "Z18K1": "Z46658K2" }, "Z46069K2": { "Z1K1": "Z18", "Z18K1": "Z46658K5" } } } } }, "Z42101K2": { "Z1K1": "Z18", "Z18K1": "Z46658K4" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q82042" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46658K1" } } } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q34698" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1084" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46658K1" } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1775415" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46658K1" } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q162378" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1775415" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46658K4" } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q499327" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46658K1" } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q162378" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q499327" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46658K4" } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } } } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z46570", "Z46570K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1775415" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46658K1" } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q162378" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1775415" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46658K4" } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1775415" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46658K1" } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q499327" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46658K1" } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q162378" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q499327" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46658K4" } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q499327" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46658K1" } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1084" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46658K1" } } } } } }, "Z46570K2": { "Z1K1": "Z18", "Z18K1": "Z46658K5" }, "Z46570K3": { "Z1K1": "Z6091", "Z6091K1": "Q1084" } } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "No noun of the language is linked to the head concept of the construction", "Predicate word phrase" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q3813849" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46658K1" } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z7", "Z7K1": "Z14310", "Z14310K1": "Z46655", "Z14310K2": { "Z1K1": "Z18", "Z18K1": "Z46658K5" } }, "K1": { "Z1K1": "Z40", "Z40K1": "Z42" }, "K2": { "Z1K1": "Z7", "Z7K1": "Z46074", "Z46074K1": { "Z1K1": "Z7", "Z7K1": "Z46071", "Z46071K1": { "Z1K1": "Z18", "Z18K1": "Z46658K2" }, "Z46071K2": { "Z1K1": "Z18", "Z18K1": "Z46658K5" } }, "Z46074K2": { "Z1K1": "Z7", "Z7K1": "Z46069", "Z46069K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z46570", "Z46570K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1775415" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46658K1" } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q162378" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1775415" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46658K4" } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1775415" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46658K1" } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q499327" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46658K1" } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q162378" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q499327" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46658K4" } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q499327" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46658K1" } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1084" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46658K1" } } } } } }, "Z46570K2": { "Z1K1": "Z18", "Z18K1": "Z46658K5" }, "Z46570K3": { "Z1K1": "Z6091", "Z6091K1": "Q1084" } } }, "Z46069K2": { "Z1K1": "Z18", "Z18K1": "Z46658K5" } }, "Z46074K3": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6006K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6005K6" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z18", "Z18K1": "Z46658K2" } } } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46074", "Z46074K1": { "Z1K1": "Z7", "Z7K1": "Z46071", "Z46071K1": { "Z1K1": "Z18", "Z18K1": "Z46658K2" }, "Z46071K2": { "Z1K1": "Z18", "Z18K1": "Z46658K5" } }, "Z46074K2": { "Z1K1": "Z7", "Z7K1": "Z46069", "Z46069K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z46570", "Z46570K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1775415" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46658K1" } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q162378" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1775415" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46658K4" } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1775415" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46658K1" } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q499327" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46658K1" } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q162378" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q499327" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46658K4" } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q499327" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46658K1" } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1084" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46658K1" } } } } } }, "Z46570K2": { "Z1K1": "Z18", "Z18K1": "Z46658K5" }, "Z46570K3": { "Z1K1": "Z6091", "Z6091K1": "Q1084" } } }, "Z46069K2": { "Z1K1": "Z18", "Z18K1": "Z46658K5" } }, "Z46074K3": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6006K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6005K6" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z18", "Z18K1": "Z46658K2" } } } } } } } }, "Z42101K2": { "Z1K1": "Z18", "Z18K1": "Z46658K4" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z7", "Z7K1": "Z46071", "Z46071K1": { "Z1K1": "Z18", "Z18K1": "Z46658K2" }, "Z46071K2": { "Z1K1": "Z18", "Z18K1": "Z46658K5" } }, "Z42101K2": { "Z1K1": "Z18", "Z18K1": "Z46658K4" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "The predicate word must be a noun, a numeral or an adjective", "Predicate word phrase" ] } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Predicate word phrase, composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Predicate noun (with the language's article and, for relational nouns, the value as complement) or predicate adjective agreeing with the subject features." } ] } } e8s0if7cctv6raxmcz4jiu2cwe9745j Z46662 0 100200 330980 330318 2026-10-23T00:03:45Z Jsamwrites 938 Mark the predicate as stative or dynamic (lexical aspect) for the past tense of sentences 330980 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46662" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z46659", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z39360", "Z39360K1": { "Z1K1": "Z7", "Z7K1": "Z39362", "Z39362K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39360K2": { "Z1K1": "Z7", "Z7K1": "Z39368", "Z39368K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39360K3": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q1975539" }, "Z39328K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z39371", "Z39371K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z39360K4": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1474213" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46659K1" } } } } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1774805" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46323", "Z46323K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q208084" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46659K1" } } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46393", "Z46393K1": { "Z1K1": "Z7", "Z7K1": "Z46291", "Z46291K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46659K1" } } }, "Z46291K2": { "Z1K1": "Z18", "Z18K1": "Z46659K4" } }, "Z46393K2": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q208084" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46659K1" } } } } }, "Z46393K3": [ "Z39328" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46291", "Z46291K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46659K1" } } }, "Z46291K2": { "Z1K1": "Z18", "Z18K1": "Z46659K4" } } }, "Z46323K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z39358" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q164573" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46659K1" } } } } }, "Z19316K2": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q110263353" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46659K1" } } } } } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q110263362" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46659K1" } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q110263353" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46659K1" } } } } } } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46659K2" } } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "No argument with the role required by the construction was supplied", "Semantic predicate phrase" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z39358" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q164573" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46659K1" } } } } }, "Z19316K2": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q110263353" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46659K1" } } } } } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q110263362" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46659K1" } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q110263353" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46659K1" } } } } } } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46659K2" } } } } }, "Z46323K3": { "Z1K1": "Z6091", "Z6091K1": "Q2990574" }, "Z46323K4": { "Z1K1": "Z6091", "Z6091K1": "Q1774805" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1474213" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46659K1" } } } } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1166153" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46322", "Z46322K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q208084" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46659K1" } } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46393", "Z46393K1": { "Z1K1": "Z7", "Z7K1": "Z46291", "Z46291K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46659K1" } } }, "Z46291K2": { "Z1K1": "Z18", "Z18K1": "Z46659K4" } }, "Z46393K2": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q208084" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46659K1" } } } } }, "Z46393K3": [ "Z39328" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z46291", "Z46291K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46659K1" } } }, "Z46291K2": { "Z1K1": "Z18", "Z18K1": "Z46659K4" } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1474213" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46659K1" } } } } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q207509" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46657", "Z46657K1": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q110263362" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46659K1" } } } } }, "Z46657K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q82042" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46659K1" } } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46658", "Z46658K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46659K1" } }, "Z46658K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46659K1" } } }, "Z46658K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z39358" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q110263362" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46659K1" } } } } } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46659K2" } } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "No argument with the role required by the construction was supplied", "Semantic predicate phrase" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z39358" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q110263362" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46659K1" } } } } } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46659K2" } } } } }, "Z46658K4": { "Z1K1": "Z18", "Z18K1": "Z46659K3" }, "Z46658K5": { "Z1K1": "Z18", "Z18K1": "Z46659K4" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z39358" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q110263362" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46659K1" } } } } } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46659K2" } } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "No argument with the role required by the construction was supplied", "Semantic predicate phrase" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z39358" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q110263362" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46659K1" } } } } } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46659K2" } } } } } }, "Z46657K3": { "Z1K1": "Z18", "Z18K1": "Z46659K4" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1474213" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46659K1" } } } } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q309314" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z7", "Z7K1": "Z14310", "Z14310K1": "Z46696", "Z14310K2": { "Z1K1": "Z18", "Z18K1": "Z46659K4" } }, "K1": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q179080" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46659K1" } } } } }, "K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z39358" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q110263362" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46659K1" } } } } } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46659K2" } } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "No argument with the role required by the construction was supplied", "Semantic predicate phrase" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z39358" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q110263362" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46659K1" } } } } } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46659K2" } } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "The construction is not supported by the semantic predicate phrase: it must be a transitive verb, an intransitive verb, a copula or a quantity predicate", "Semantic predicate phrase" ] } } } } }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1975539" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46659K1" } } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1975539" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46659K1" } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1474213" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46659K1" } } } } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1774805" } }, "Z802K2": { "Z1K1": "Z6091", "Z6091K1": "Q935221" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1474213" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46659K1" } } } } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1166153" } }, "Z802K2": { "Z1K1": "Z6091", "Z6091K1": "Q935221" }, "Z802K3": { "Z1K1": "Z6091", "Z6091K1": "Q1562262" } } } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Semantic predicate phrase, composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Deferred verb phrase realizing one selected construction with role-labelled argument phrases; the grammatical subject is not included. Transitive, intransitive and copular constructions." } ] } } 1tvhavtrz4itz9d1bzozqhq7m4xqwu1 Z46673 0 100211 330927 330180 2026-10-22T19:36:05Z Jsamwrites 938 Removed Z46674 from the approved list of implementations 330927 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46673" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } } }, "Z17K2": "Z46673K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "proposition" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6007" }, "Z17K2": "Z46673K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "qualifiers" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z46673K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "context" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46673K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z39358", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z39358", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6007" } } }, "Z8K3": [ "Z20", "Z46675", "Z46676", "Z46677", "Z46678", "Z46679", "Z46680", "Z46681", "Z46682", "Z46683", "Z46684" ], "Z8K4": [ "Z14" ], "Z8K5": "Z46673" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Semantic predicate from Wikidata proposition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Predicate phrase for a Wikidata proposition (one subject, one object) in the language, with the grammatical subject phrase chosen by the construction and the qualifiers unchanged: selection of one construction, then one realization." } ] } } qb023yb2liogal6euptq17kve6a5gf8 330939 330927 2026-10-22T19:42:00Z Jsamwrites 938 Added Z46674 to the approved list of implementations 330939 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46673" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } } }, "Z17K2": "Z46673K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "proposition" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6007" }, "Z17K2": "Z46673K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "qualifiers" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z46673K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "context" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46673K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z39358", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z39358", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6007" } } }, "Z8K3": [ "Z20", "Z46675", "Z46676", "Z46677", "Z46678", "Z46679", "Z46680", "Z46681", "Z46682", "Z46683", "Z46684" ], "Z8K4": [ "Z14", "Z46674" ], "Z8K5": "Z46673" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Semantic predicate from Wikidata proposition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Predicate phrase for a Wikidata proposition (one subject, one object) in the language, with the grammatical subject phrase chosen by the construction and the qualifiers unchanged: selection of one construction, then one realization." } ] } } h9bns79kyrw94p43o6ah6cizclxq23w Z46674 0 100212 330932 330154 2026-10-22T19:38:01Z Jsamwrites 938 Subject case from the construction: locative through the marking options, other cases bound directly 330932 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46674" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z46673", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46673K1" } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z812", "Z812K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46673K1" } } } } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46673K1" } } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z812", "Z812K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46673K1" } } } } } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6095" } }, "Z17K2": "Z8K7", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z39358", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z39358", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6007" } } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K6", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z39358", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z39358", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6007" } } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K5", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z39358", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z39358", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6007" } } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z39358", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z39358", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6007" } } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z39358", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z39358", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6007" } } }, "K1": { "Z1K1": "Z7", "Z7K1": "Z46659", "Z46659K1": { "Z1K1": "Z18", "Z18K1": "Z8K7" }, "Z46659K2": [ { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z39358" }, { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z39358" }, "K1": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q110263353" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K7" } } } } }, "K2": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z7", "Z7K1": "Z46641", "Z46641K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46673K1" } } }, "Z46641K2": { "Z1K1": "Z18", "Z18K1": "Z46673K4" } }, "Z42101K2": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } } ] } }, { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z39358" }, "K1": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q110263362" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K7" } } } } }, "K2": { "Z1K1": "Z18", "Z18K1": "Z8K6" } } ], "Z46659K3": { "Z1K1": "Z7", "Z7K1": "Z39371", "Z39371K1": { "Z1K1": "Z18", "Z18K1": "Z8K4" } }, "Z46659K4": { "Z1K1": "Z18", "Z18K1": "Z46673K4" } }, "K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z39358", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6007" } }, "K1": { "Z1K1": "Z18", "Z18K1": "Z8K4" }, "K2": { "Z1K1": "Z18", "Z18K1": "Z46673K2" } } } } ], "Z8K5": "Z8" }, "Z8K4": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q128234" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K7" } } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q128234" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K7" } } } } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q202142" } }, "Z802K2": { "Z1K1": "Z39358", "Z39358K1": { "Z1K1": "Z18", "Z18K1": "Z46673K4" }, "Z39358K2": { "Z1K1": "Z6091", "Z6091K1": "Q1401131" }, "Z39358K3": { "Z1K1": "Z7", "Z7K1": "Z39371", "Z39371K1": { "Z1K1": "Z18", "Z18K1": "Z8K5" } }, "Z39358K4": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z7", "Z7K1": "Z14310", "Z14310K1": "Z46653", "Z14310K2": { "Z1K1": "Z18", "Z18K1": "Z46673K4" } }, "K1": { "Z1K1": "Z6091", "Z6091K1": "Q109377685" }, "K2": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K5" } }, "K3": { "Z1K1": "Z7", "Z7K1": "Z39371", "Z39371K1": { "Z1K1": "Z18", "Z18K1": "Z8K5" } } } }, "Z802K3": { "Z1K1": "Z39358", "Z39358K1": { "Z1K1": "Z18", "Z18K1": "Z46673K4" }, "Z39358K2": { "Z1K1": "Z6091", "Z6091K1": "Q1401131" }, "Z39358K3": { "Z1K1": "Z7", "Z7K1": "Z39371", "Z39371K1": { "Z1K1": "Z18", "Z18K1": "Z8K5" } }, "Z39358K4": { "Z1K1": "Z7", "Z7K1": "Z38860", "Z38860K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K5" } }, "Z38860K2": { "Z1K1": "Z6091", "Z6091K1": "Q128234" }, "Z38860K3": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q128234" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K7" } } } } } } } }, "Z802K3": { "Z1K1": "Z18", "Z18K1": "Z8K5" } } } } ], "Z8K5": "Z8" }, "Z8K5": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q164573" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K7" } } } } }, "Z19316K2": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q110263353" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K7" } } } } } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z7", "Z7K1": "Z46641", "Z46641K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46673K1" } } }, "Z46641K2": { "Z1K1": "Z18", "Z18K1": "Z46673K4" } }, "Z42101K2": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } } ] }, "Z802K3": { "Z1K1": "Z18", "Z18K1": "Z8K6" } } } } ], "Z8K5": "Z8" }, "Z8K6": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z18683", "Z18683K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z1K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46673K1" } } } } }, "Z18683K2": "Z6091" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z7", "Z7K1": "Z46641", "Z46641K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46673K1" } } } }, "Z46641K2": { "Z1K1": "Z18", "Z18K1": "Z46673K4" } }, "Z42101K2": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } } ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z18683", "Z18683K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z1K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46673K1" } } } } }, "Z18683K2": "Z6010" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z13518K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z19677K3" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6010K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46673K1" } } } } } } }, "Z866K2": "1" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z18683", "Z18683K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6010K4" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46673K1" } } } } }, "Z18683K2": { "Z1K1": "Z6091", "Z6091K1": "Q199" } }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K2": { "Z1K1": "Z39358", "Z39358K1": { "Z1K1": "Z18", "Z18K1": "Z46673K4" }, "Z39358K2": { "Z1K1": "Z6091", "Z6091K1": "Q1401131" }, "Z39358K3": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q146786" } } ], "Z39358K4": { "Z1K1": "Z38546", "Z38546K1": [ "Z38545" ], "Z38546K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z43902" } }, "Z38546K3": [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z46096" } }, { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z7", "Z7K1": "Z14310", "Z14310K1": "Z46695", "Z14310K2": { "Z1K1": "Z18", "Z18K1": "Z46673K4" } }, "K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z13518K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z19677K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6010K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46673K1" } } } } } } } } ] } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "Only whole numbers without a unit are supported for quantity values", "Semantic predicate from Wikidata proposition" ] } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "The value kind of this proposition (time, string, coordinate…) is not supported yet", "Semantic predicate from Wikidata proposition" ] } } } } } ], "Z8K5": "Z8" }, "Z8K7": { "Z1K1": "Z7", "Z7K1": "Z46617", "Z46617K1": { "Z1K1": "Z7", "Z7K1": "Z46616", "Z46616K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46673K1" } } }, "Z46616K2": { "Z1K1": "Z18", "Z18K1": "Z46673K4" }, "Z46616K3": { "Z1K1": "Z18", "Z18K1": "Z46673K3" }, "Z46616K4": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z18683", "Z18683K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z1K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46673K1" } } } } }, "Z18683K2": "Z6091" }, "Z802K2": { "Z1K1": "Z6", "Z6K1": "Z6091" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z18683", "Z18683K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z1K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46673K1" } } } } }, "Z18683K2": "Z6010" }, "Z802K2": { "Z1K1": "Z6", "Z6K1": "Z6010" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z18683", "Z18683K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z1K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46673K1" } } } } }, "Z18683K2": "Z6064" }, "Z802K2": { "Z1K1": "Z6", "Z6K1": "Z6064" }, "Z802K3": "" } } } }, "Z46617K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46673K1" } } }, "Z46617K3": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46673K1" } } } }, "Z46617K4": { "Z1K1": "Z18", "Z18K1": "Z46673K3" }, "Z46617K5": { "Z1K1": "Z18", "Z18K1": "Z46673K4" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "The proposition has several subjects or several objects; coordination is not supported yet, so give one subject and one object", "Semantic predicate from Wikidata proposition" ] } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Semantic predicate from Wikidata proposition, composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Candidates, one construction, the value as a referring phrase or formatted number, the grammatical subject (with a required case), one predicate phrase." } ] } } juzukektn4jn1u8squqskh6hncvch9d Z46696 0 100234 330976 330243 2026-10-22T23:51:03Z Jsamwrites 938 Population in the past: Malayalam ഉണ്ടായിരുന്നു, Dagbani daa mali niriba kalinli 330976 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46696" }, "Z2K2": { "Z1K1": "Z14294", "Z14294K1": [ "Z14293", { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1613416" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46323", "Z46323K1": { "Z1K1": "Z7", "Z7K1": "Z46291", "Z46291K1": { "Z1K1": "Z6095", "Z6095K1": "L1885" }, "Z46291K2": { "Z1K1": "Z60", "Z60K1": "en" } }, "Z46323K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z7", "Z7K1": "Z14310", "Z14310K1": "Z46656", "Z14310K2": { "Z1K1": "Z60", "Z60K1": "en" } }, "K1": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z7", "Z7K1": "Z14310", "Z14310K1": "Z46655", "Z14310K2": { "Z1K1": "Z60", "Z60K1": "en" } }, "K1": { "Z1K1": "Z40", "Z40K1": "Z41" }, "K2": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z7", "Z7K1": "Z46073", "Z46073K1": { "Z1K1": "Z7", "Z7K1": "Z46069", "Z46069K1": { "Z1K1": "Z6095", "Z6095K1": "L5604" }, "Z46069K2": { "Z1K1": "Z60", "Z60K1": "en" } } }, "Z42101K2": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } } ] } }, "K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z46323K3": { "Z1K1": "Z6091", "Z6091K1": "Q2990574" }, "Z46323K4": { "Z1K1": "Z6091", "Z6091K1": "Q1774805" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "Only population (Q1613416) is supported as a quantity predicate", "Quantity predicate language options" ] } } } ], "Z8K5": "Z8" }, "Z14293K2": "Z33034" }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1613416" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46323", "Z46323K1": { "Z1K1": "Z7", "Z7K1": "Z46291", "Z46291K1": { "Z1K1": "Z6095", "Z6095K1": "L10641" }, "Z46291K2": { "Z1K1": "Z60", "Z60K1": "fr" } }, "Z46323K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z39358", "Z39358K1": { "Z1K1": "Z7", "Z7K1": "Z39362", "Z39362K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K2": { "Z1K1": "Z6091", "Z6091K1": "Q1778442" }, "Z39358K3": { "Z1K1": "Z7", "Z7K1": "Z39371", "Z39371K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K4": { "Z1K1": "Z38546", "Z38546K1": { "Z1K1": "Z7", "Z7K1": "Z27665", "Z27665K1": [ "Z1", { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } ] }, "Z38546K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z43902" } }, "Z38546K3": [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } ] } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z876", "Z876K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z1", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z43131", "Z43131K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z43131K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z43131K3": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "Q", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } } ], "Z8K5": "Z8" }, "Z876K2": { "Z1K1": "Z7", "Z7K1": "Z28316", "Z28316K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z12696K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ], "Z8K5": "Z8" }, "Z28316K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z28316K3": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z38563", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } }, "Z876K3": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z8K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z7", "Z7K1": "Z46073", "Z46073K1": { "Z1K1": "Z7", "Z7K1": "Z46069", "Z46069K1": { "Z1K1": "Z6095", "Z6095K1": "L19525" }, "Z46069K2": { "Z1K1": "Z60", "Z60K1": "fr" } } }, "Z42101K2": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q146786" } } ] }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z8K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z46323K3": { "Z1K1": "Z6091", "Z6091K1": "Q2990574" }, "Z46323K4": { "Z1K1": "Z6091", "Z6091K1": "Q1774805" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "Only population (Q1613416) is supported as a quantity predicate", "Quantity predicate language options" ] } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1004" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1613416" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46323", "Z46323K1": { "Z1K1": "Z7", "Z7K1": "Z46291", "Z46291K1": { "Z1K1": "Z6095", "Z6095K1": "L41086" }, "Z46291K2": { "Z1K1": "Z60", "Z60K1": "es" } }, "Z46323K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z39358", "Z39358K1": { "Z1K1": "Z7", "Z7K1": "Z39362", "Z39362K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K2": { "Z1K1": "Z6091", "Z6091K1": "Q1778442" }, "Z39358K3": { "Z1K1": "Z7", "Z7K1": "Z39371", "Z39371K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K4": { "Z1K1": "Z38546", "Z38546K1": { "Z1K1": "Z7", "Z7K1": "Z27665", "Z27665K1": [ "Z1", { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } ] }, "Z38546K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z43902" } }, "Z38546K3": [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } ] } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z876", "Z876K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z1", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z43131", "Z43131K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z43131K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z43131K3": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "Q", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } } ], "Z8K5": "Z8" }, "Z876K2": { "Z1K1": "Z7", "Z7K1": "Z28316", "Z28316K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z12696K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ], "Z8K5": "Z8" }, "Z28316K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z28316K3": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z38563", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } }, "Z876K3": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z8K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z7", "Z7K1": "Z46073", "Z46073K1": { "Z1K1": "Z7", "Z7K1": "Z46069", "Z46069K1": { "Z1K1": "Z6095", "Z6095K1": "L642967" }, "Z46069K2": { "Z1K1": "Z60", "Z60K1": "es" } } }, "Z42101K2": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q146786" } } ] }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z8K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z46323K3": { "Z1K1": "Z6091", "Z6091K1": "Q2990574" }, "Z46323K4": { "Z1K1": "Z6091", "Z6091K1": "Q1774805" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "Only population (Q1613416) is supported as a quantity predicate", "Quantity predicate language options" ] } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1003" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1613416" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46323", "Z46323K1": { "Z1K1": "Z7", "Z7K1": "Z46291", "Z46291K1": { "Z1K1": "Z6095", "Z6095K1": "L40985" }, "Z46291K2": { "Z1K1": "Z60", "Z60K1": "la" } }, "Z46323K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z39358", "Z39358K1": { "Z1K1": "Z7", "Z7K1": "Z39362", "Z39362K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K2": { "Z1K1": "Z6091", "Z6091K1": "Q1778442" }, "Z39358K3": { "Z1K1": "Z7", "Z7K1": "Z39371", "Z39371K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K4": { "Z1K1": "Z38546", "Z38546K1": { "Z1K1": "Z7", "Z7K1": "Z27665", "Z27665K1": [ "Z1", { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } ] }, "Z38546K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z43902" } }, "Z38546K3": [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } ] } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z876", "Z876K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z1", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z43131", "Z43131K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z43131K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z43131K3": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "Q", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } } ], "Z8K5": "Z8" }, "Z876K2": { "Z1K1": "Z7", "Z7K1": "Z28316", "Z28316K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z12696K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ], "Z8K5": "Z8" }, "Z28316K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z28316K3": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z38563", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } }, "Z876K3": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z8K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z7", "Z7K1": "Z46073", "Z46073K1": { "Z1K1": "Z7", "Z7K1": "Z46069", "Z46069K1": { "Z1K1": "Z6095", "Z6095K1": "L275951" }, "Z46069K2": { "Z1K1": "Z60", "Z60K1": "la" } } }, "Z42101K2": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q146786" } } ] }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z8K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z46323K3": { "Z1K1": "Z6091", "Z6091K1": "Q2990574" }, "Z46323K4": { "Z1K1": "Z6091", "Z6091K1": "Q1774805" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "Only population (Q1613416) is supported as a quantity predicate", "Quantity predicate language options" ] } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1403" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1613416" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z39358", "Z39358K1": { "Z1K1": "Z7", "Z7K1": "Z39362", "Z39362K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K2": { "Z1K1": "Z6091", "Z6091K1": "Q1778442" }, "Z39358K3": { "Z1K1": "Z7", "Z7K1": "Z39371", "Z39371K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K4": { "Z1K1": "Z38546", "Z38546K1": { "Z1K1": "Z7", "Z7K1": "Z27665", "Z27665K1": [ "Z1", { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } ] }, "Z38546K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z43902" } }, "Z38546K3": [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } ] } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z876", "Z876K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z1", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z43131", "Z43131K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z43131K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z43131K3": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "Q", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } } ], "Z8K5": "Z8" }, "Z876K2": { "Z1K1": "Z7", "Z7K1": "Z28316", "Z28316K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z12696K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ], "Z8K5": "Z8" }, "Z28316K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z28316K3": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z38563", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } }, "Z876K3": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z8K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z7", "Z7K1": "Z46291", "Z46291K1": { "Z1K1": "Z6095", "Z6095K1": "L623426" }, "Z46291K2": { "Z1K1": "Z60", "Z60K1": "ig" } }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z39358", "Z39358K1": { "Z1K1": "Z60", "Z60K1": "ig" }, "Z39358K2": { "Z1K1": "Z6091", "Z6091K1": "Q1401131" }, "Z39358K3": [ "Z39328" ], "Z39358K4": { "Z1K1": "Z38546", "Z38546K1": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } }, "Z38546K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z43902" } }, "Z38546K3": [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z46096" } }, "ndị bi na ya dị" ], { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } ] } } }, "Z8K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "Only population (Q1613416) is supported as a quantity predicate", "Quantity predicate language options" ] } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1014" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1613416" } }, "Z802K2": { "Z1K1": "Z39358", "Z39358K1": { "Z1K1": "Z60", "Z60K1": "ml" }, "Z39358K2": { "Z1K1": "Z6091", "Z6091K1": "Q1778442" }, "Z39358K3": [ "Z39328" ], "Z39358K4": { "Z1K1": "Z38546", "Z38546K1": { "Z1K1": "Z7", "Z7K1": "Z12767", "Z12767K1": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } }, "Z12767K2": [ "Z38545", { "Z1K1": "Z38545", "Z38545K1": "KF", "Z38545K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "Z38545K3": { "Z1K1": "Z6091", "Z6091K1": "Q4147654" } } ] }, "Z38546K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z43902" } }, "Z38546K3": [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z46096" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z43825" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z10938" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z27854" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z811" } }, { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z7", "Z7K1": "Z46073", "Z46073K1": { "Z1K1": "Z7", "Z7K1": "Z46069", "Z46069K1": { "Z1K1": "Z6095", "Z6095K1": "L529485" }, "Z46069K2": { "Z1K1": "Z60", "Z60K1": "ml" } } }, "Z42101K2": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q146786" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q128234" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q131105" } } ] } } } ] ] ], [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z802" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z802" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z12696" } }, { "Z1K1": "Z38548", "Z38548K1": "KF" }, { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } ], { "Z1K1": "Z40", "Z40K1": "Z41" }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z12696" } }, { "Z1K1": "Z38548", "Z38548K1": "KF" }, { "Z1K1": "Z6091", "Z6091K1": "Q1392475" } ] ], "ഉണ്ടായിരുന്നു", "ഉണ്ട്" ] ] ] ] } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "Only population (Q1613416) is supported as a quantity predicate", "Quantity predicate language options" ] } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1012" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1613416" } }, "Z802K2": { "Z1K1": "Z39358", "Z39358K1": { "Z1K1": "Z60", "Z60K1": "dag" }, "Z39358K2": { "Z1K1": "Z6091", "Z6091K1": "Q1778442" }, "Z39358K3": [ "Z39328" ], "Z39358K4": { "Z1K1": "Z38546", "Z38546K1": { "Z1K1": "Z7", "Z7K1": "Z12767", "Z12767K1": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } }, "Z12767K2": [ "Z38545", { "Z1K1": "Z38545", "Z38545K1": "KF", "Z38545K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "Z38545K3": { "Z1K1": "Z6091", "Z6091K1": "Q4147654" } } ] }, "Z38546K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z43902" } }, "Z38546K3": [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z802" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z802" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z12696" } }, { "Z1K1": "Z38548", "Z38548K1": "KF" }, { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } ], { "Z1K1": "Z40", "Z40K1": "Z41" }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z12696" } }, { "Z1K1": "Z38548", "Z38548K1": "KF" }, { "Z1K1": "Z6091", "Z6091K1": "Q1392475" } ] ], [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z46096" } }, "daa" ], [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z46311" } }, { "Z1K1": "Z6095", "Z6095K1": "L649777" }, [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } ], { "Z1K1": "Z60", "Z60K1": "dag" } ] ], [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z46311" } }, { "Z1K1": "Z6095", "Z6095K1": "L1749285" }, [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q146786" } ], { "Z1K1": "Z60", "Z60K1": "dag" } ] ], [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z46096" } }, "kalinli" ], { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } ] ], [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z46311" } }, { "Z1K1": "Z6095", "Z6095K1": "L649777" }, [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } ], { "Z1K1": "Z60", "Z60K1": "dag" } ], [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z46096" } }, "la" ] ], [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z46311" } }, { "Z1K1": "Z6095", "Z6095K1": "L1749285" }, [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q146786" } ], { "Z1K1": "Z60", "Z60K1": "dag" } ] ], { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } ], [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z46096" } }, "ban be di ni" ] ] ] } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "Only population (Q1613416) is supported as a quantity predicate", "Quantity predicate language options" ] } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1015" ] } ], "Z14294K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "No quantity predicate is defined for this language", "Quantity predicate language options" ] } } ], "Z8K5": "Z8" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Quantity predicate language options" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Population: English have a population of N, French compter N habitants, Spanish tener N habitantes, Latin N incolas habere, Malayalam N നിവാസികൾ + ഉണ്ട് (past ഉണ്ടായിരുന്നു), Igbo nwere ndị bi na ya dị N, Dagbani mali la niriba N ban be di ni (past daa mali niriba kalinli N)." } ] } } 65skw9x9kxl9e7hq65blxy12oozf8no 330979 330976 2026-10-22T23:58:46Z Jsamwrites 938 Dagbani population: niriba kalinli N 330979 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46696" }, "Z2K2": { "Z1K1": "Z14294", "Z14294K1": [ "Z14293", { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1613416" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46323", "Z46323K1": { "Z1K1": "Z7", "Z7K1": "Z46291", "Z46291K1": { "Z1K1": "Z6095", "Z6095K1": "L1885" }, "Z46291K2": { "Z1K1": "Z60", "Z60K1": "en" } }, "Z46323K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z7", "Z7K1": "Z14310", "Z14310K1": "Z46656", "Z14310K2": { "Z1K1": "Z60", "Z60K1": "en" } }, "K1": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z7", "Z7K1": "Z14310", "Z14310K1": "Z46655", "Z14310K2": { "Z1K1": "Z60", "Z60K1": "en" } }, "K1": { "Z1K1": "Z40", "Z40K1": "Z41" }, "K2": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z7", "Z7K1": "Z46073", "Z46073K1": { "Z1K1": "Z7", "Z7K1": "Z46069", "Z46069K1": { "Z1K1": "Z6095", "Z6095K1": "L5604" }, "Z46069K2": { "Z1K1": "Z60", "Z60K1": "en" } } }, "Z42101K2": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } } ] } }, "K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z46323K3": { "Z1K1": "Z6091", "Z6091K1": "Q2990574" }, "Z46323K4": { "Z1K1": "Z6091", "Z6091K1": "Q1774805" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "Only population (Q1613416) is supported as a quantity predicate", "Quantity predicate language options" ] } } } ], "Z8K5": "Z8" }, "Z14293K2": "Z33034" }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1613416" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46323", "Z46323K1": { "Z1K1": "Z7", "Z7K1": "Z46291", "Z46291K1": { "Z1K1": "Z6095", "Z6095K1": "L10641" }, "Z46291K2": { "Z1K1": "Z60", "Z60K1": "fr" } }, "Z46323K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z39358", "Z39358K1": { "Z1K1": "Z7", "Z7K1": "Z39362", "Z39362K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K2": { "Z1K1": "Z6091", "Z6091K1": "Q1778442" }, "Z39358K3": { "Z1K1": "Z7", "Z7K1": "Z39371", "Z39371K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K4": { "Z1K1": "Z38546", "Z38546K1": { "Z1K1": "Z7", "Z7K1": "Z27665", "Z27665K1": [ "Z1", { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } ] }, "Z38546K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z43902" } }, "Z38546K3": [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } ] } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z876", "Z876K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z1", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z43131", "Z43131K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z43131K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z43131K3": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "Q", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } } ], "Z8K5": "Z8" }, "Z876K2": { "Z1K1": "Z7", "Z7K1": "Z28316", "Z28316K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z12696K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ], "Z8K5": "Z8" }, "Z28316K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z28316K3": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z38563", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } }, "Z876K3": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z8K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z7", "Z7K1": "Z46073", "Z46073K1": { "Z1K1": "Z7", "Z7K1": "Z46069", "Z46069K1": { "Z1K1": "Z6095", "Z6095K1": "L19525" }, "Z46069K2": { "Z1K1": "Z60", "Z60K1": "fr" } } }, "Z42101K2": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q146786" } } ] }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z8K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z46323K3": { "Z1K1": "Z6091", "Z6091K1": "Q2990574" }, "Z46323K4": { "Z1K1": "Z6091", "Z6091K1": "Q1774805" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "Only population (Q1613416) is supported as a quantity predicate", "Quantity predicate language options" ] } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1004" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1613416" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46323", "Z46323K1": { "Z1K1": "Z7", "Z7K1": "Z46291", "Z46291K1": { "Z1K1": "Z6095", "Z6095K1": "L41086" }, "Z46291K2": { "Z1K1": "Z60", "Z60K1": "es" } }, "Z46323K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z39358", "Z39358K1": { "Z1K1": "Z7", "Z7K1": "Z39362", "Z39362K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K2": { "Z1K1": "Z6091", "Z6091K1": "Q1778442" }, "Z39358K3": { "Z1K1": "Z7", "Z7K1": "Z39371", "Z39371K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K4": { "Z1K1": "Z38546", "Z38546K1": { "Z1K1": "Z7", "Z7K1": "Z27665", "Z27665K1": [ "Z1", { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } ] }, "Z38546K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z43902" } }, "Z38546K3": [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } ] } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z876", "Z876K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z1", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z43131", "Z43131K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z43131K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z43131K3": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "Q", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } } ], "Z8K5": "Z8" }, "Z876K2": { "Z1K1": "Z7", "Z7K1": "Z28316", "Z28316K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z12696K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ], "Z8K5": "Z8" }, "Z28316K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z28316K3": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z38563", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } }, "Z876K3": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z8K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z7", "Z7K1": "Z46073", "Z46073K1": { "Z1K1": "Z7", "Z7K1": "Z46069", "Z46069K1": { "Z1K1": "Z6095", "Z6095K1": "L642967" }, "Z46069K2": { "Z1K1": "Z60", "Z60K1": "es" } } }, "Z42101K2": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q146786" } } ] }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z8K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z46323K3": { "Z1K1": "Z6091", "Z6091K1": "Q2990574" }, "Z46323K4": { "Z1K1": "Z6091", "Z6091K1": "Q1774805" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "Only population (Q1613416) is supported as a quantity predicate", "Quantity predicate language options" ] } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1003" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1613416" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46323", "Z46323K1": { "Z1K1": "Z7", "Z7K1": "Z46291", "Z46291K1": { "Z1K1": "Z6095", "Z6095K1": "L40985" }, "Z46291K2": { "Z1K1": "Z60", "Z60K1": "la" } }, "Z46323K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z39358", "Z39358K1": { "Z1K1": "Z7", "Z7K1": "Z39362", "Z39362K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K2": { "Z1K1": "Z6091", "Z6091K1": "Q1778442" }, "Z39358K3": { "Z1K1": "Z7", "Z7K1": "Z39371", "Z39371K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K4": { "Z1K1": "Z38546", "Z38546K1": { "Z1K1": "Z7", "Z7K1": "Z27665", "Z27665K1": [ "Z1", { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } ] }, "Z38546K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z43902" } }, "Z38546K3": [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } ] } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z876", "Z876K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z1", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z43131", "Z43131K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z43131K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z43131K3": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "Q", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } } ], "Z8K5": "Z8" }, "Z876K2": { "Z1K1": "Z7", "Z7K1": "Z28316", "Z28316K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z12696K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ], "Z8K5": "Z8" }, "Z28316K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z28316K3": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z38563", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } }, "Z876K3": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z8K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z7", "Z7K1": "Z46073", "Z46073K1": { "Z1K1": "Z7", "Z7K1": "Z46069", "Z46069K1": { "Z1K1": "Z6095", "Z6095K1": "L275951" }, "Z46069K2": { "Z1K1": "Z60", "Z60K1": "la" } } }, "Z42101K2": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q146786" } } ] }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z8K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z46323K3": { "Z1K1": "Z6091", "Z6091K1": "Q2990574" }, "Z46323K4": { "Z1K1": "Z6091", "Z6091K1": "Q1774805" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "Only population (Q1613416) is supported as a quantity predicate", "Quantity predicate language options" ] } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1403" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1613416" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38546", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z40", "Z17K2": "Z8K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z39358", "Z39358K1": { "Z1K1": "Z7", "Z7K1": "Z39362", "Z39362K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K2": { "Z1K1": "Z6091", "Z6091K1": "Q1778442" }, "Z39358K3": { "Z1K1": "Z7", "Z7K1": "Z39371", "Z39371K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z39358K4": { "Z1K1": "Z38546", "Z38546K1": { "Z1K1": "Z7", "Z7K1": "Z27665", "Z27665K1": [ "Z1", { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } ] }, "Z38546K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z43902" } }, "Z38546K3": [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } }, { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z18", "Z18K1": "Z8K3" }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } ] } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z876", "Z876K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z1", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z43131", "Z43131K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z43131K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z43131K3": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "Q", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } } ], "Z8K5": "Z8" }, "Z876K2": { "Z1K1": "Z7", "Z7K1": "Z28316", "Z28316K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z38545", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z12696K2": { "Z1K1": "Z7", "Z7K1": "Z38563", "Z38563K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ], "Z8K5": "Z8" }, "Z28316K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z28316K3": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z38563", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } }, "Z876K3": { "Z1K1": "Z18", "Z18K1": "Z8K2" } }, "Z8K3": { "Z1K1": "Z18", "Z18K1": "Z8K3" } } } ], "Z8K5": "Z8" }, "Z8K1": { "Z1K1": "Z7", "Z7K1": "Z46291", "Z46291K1": { "Z1K1": "Z6095", "Z6095K1": "L623426" }, "Z46291K2": { "Z1K1": "Z60", "Z60K1": "ig" } }, "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z39358", "Z39358K1": { "Z1K1": "Z60", "Z60K1": "ig" }, "Z39358K2": { "Z1K1": "Z6091", "Z6091K1": "Q1401131" }, "Z39358K3": [ "Z39328" ], "Z39358K4": { "Z1K1": "Z38546", "Z38546K1": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } }, "Z38546K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z43902" } }, "Z38546K3": [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z46096" } }, "ndị bi na ya dị" ], { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } ] } } }, "Z8K3": { "Z1K1": "Z40", "Z40K1": "Z42" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "Only population (Q1613416) is supported as a quantity predicate", "Quantity predicate language options" ] } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1014" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1613416" } }, "Z802K2": { "Z1K1": "Z39358", "Z39358K1": { "Z1K1": "Z60", "Z60K1": "ml" }, "Z39358K2": { "Z1K1": "Z6091", "Z6091K1": "Q1778442" }, "Z39358K3": [ "Z39328" ], "Z39358K4": { "Z1K1": "Z38546", "Z38546K1": { "Z1K1": "Z7", "Z7K1": "Z12767", "Z12767K1": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } }, "Z12767K2": [ "Z38545", { "Z1K1": "Z38545", "Z38545K1": "KF", "Z38545K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "Z38545K3": { "Z1K1": "Z6091", "Z6091K1": "Q4147654" } } ] }, "Z38546K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z43902" } }, "Z38546K3": [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z46096" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z43825" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z10938" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z27854" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z811" } }, { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z7", "Z7K1": "Z46073", "Z46073K1": { "Z1K1": "Z7", "Z7K1": "Z46069", "Z46069K1": { "Z1K1": "Z6095", "Z6095K1": "L529485" }, "Z46069K2": { "Z1K1": "Z60", "Z60K1": "ml" } } }, "Z42101K2": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q146786" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q128234" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q131105" } } ] } } } ] ] ], [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z802" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z802" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z12696" } }, { "Z1K1": "Z38548", "Z38548K1": "KF" }, { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } ], { "Z1K1": "Z40", "Z40K1": "Z41" }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z12696" } }, { "Z1K1": "Z38548", "Z38548K1": "KF" }, { "Z1K1": "Z6091", "Z6091K1": "Q1392475" } ] ], "ഉണ്ടായിരുന്നു", "ഉണ്ട്" ] ] ] ] } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "Only population (Q1613416) is supported as a quantity predicate", "Quantity predicate language options" ] } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1012" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1613416" } }, "Z802K2": { "Z1K1": "Z39358", "Z39358K1": { "Z1K1": "Z60", "Z60K1": "dag" }, "Z39358K2": { "Z1K1": "Z6091", "Z6091K1": "Q1778442" }, "Z39358K3": [ "Z39328" ], "Z39358K4": { "Z1K1": "Z38546", "Z38546K1": { "Z1K1": "Z7", "Z7K1": "Z12767", "Z12767K1": { "Z1K1": "Z7", "Z7K1": "Z38552", "Z38552K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } }, "Z12767K2": [ "Z38545", { "Z1K1": "Z38545", "Z38545K1": "KF", "Z38545K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "Z38545K3": { "Z1K1": "Z6091", "Z6091K1": "Q4147654" } } ] }, "Z38546K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z43902" } }, "Z38546K3": [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z802" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z802" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z12696" } }, { "Z1K1": "Z38548", "Z38548K1": "KF" }, { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } ], { "Z1K1": "Z40", "Z40K1": "Z41" }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z12696" } }, { "Z1K1": "Z38548", "Z38548K1": "KF" }, { "Z1K1": "Z6091", "Z6091K1": "Q1392475" } ] ], [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z46096" } }, "daa" ], [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z46311" } }, { "Z1K1": "Z6095", "Z6095K1": "L649777" }, [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } ], { "Z1K1": "Z60", "Z60K1": "dag" } ] ], [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z46311" } }, { "Z1K1": "Z6095", "Z6095K1": "L1749285" }, [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q146786" } ], { "Z1K1": "Z60", "Z60K1": "dag" } ] ], [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z46096" } }, "kalinli" ], { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } ] ], [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z46311" } }, { "Z1K1": "Z6095", "Z6095K1": "L649777" }, [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } ], { "Z1K1": "Z60", "Z60K1": "dag" } ], [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z46096" } }, "la" ] ], [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z46311" } }, { "Z1K1": "Z6095", "Z6095K1": "L1749285" }, [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q146786" } ], { "Z1K1": "Z60", "Z60K1": "dag" } ] ], [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z40958" } }, [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z46096" } }, "kalinli" ], { "Z1K1": "Z7", "Z7K1": "Z38561", "Z38561K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } ] ] ] } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "Only population (Q1613416) is supported as a quantity predicate", "Quantity predicate language options" ] } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1015" ] } ], "Z14294K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z39358", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "No quantity predicate is defined for this language", "Quantity predicate language options" ] } } ], "Z8K5": "Z8" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Quantity predicate language options" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Population: English have a population of N, French compter N habitants, Spanish tener N habitantes, Latin N incolas habere, Malayalam N നിവാസികൾ + ഉണ്ട് (past ഉണ്ടായിരുന്നു), Igbo nwere ndị bi na ya dị N, Dagbani mali la niriba kalinli N (past daa mali niriba kalinli N)." } ] } } snaczxmuxio5jjm5d37orfzr39o9e7n Wikifunctions:Status updates/2026-10-17/de 4 100308 331047 330862 2026-10-23T08:01:10Z Ameisenigel 44 331047 wikitext text/x-wiki <languages/> {{Wikifunctions updates | prevlabel = Vorheriges Update | prev = 2026-10-09 | nextlabel = Nächstes Update | next = }} <span id="Changes_in_evaluator_representations"></span> === Änderungen an Darstellungen im Auswerter === Ab nächstem Mittwoch nehmen wir eine kleine Änderung an der Zwischendarstellung von Funktionsargumenten im Auswerter vor. Diese Objekte werden nicht mehr als reine ZObjekte in Normalform eingelesen; stattdessen werden Listen als JSON-Arrays dargestellt. Genauer gesagt, als [[Wikifunctions:Glossary#Benjamin array|Benjamin-Arrays]], die typsichere Array-Darstellung, die in kanonischer Form und an anderen Stellen in WikiLambda verwendet wird. Anstatt <syntaxhighlight lang="json" line="line">{ "Z1K1": { "Z1K1": { "Z1K1": "Z9", "Z9K1": "Z7" }, "Z7K1": { "Z1K1": "Z9", "Z9K1": "Z881" }, "Z881K1": { "Z1K1": "Z9", "Z9K1": "Z6" } }, "K1": { "Z1K1": "Z6", "Z6K1": "hayyy" }, "K2": { "Z1K1": { "Z1K1": { "Z1K1": "Z9", "Z9K1": "Z7" }, "Z7K1": { "Z1K1": "Z9", "Z9K1": "Z881" }, "Z881K1": { "Z1K1": "Z9", "Z9K1": "Z6" } } } }</syntaxhighlight> sehen die Ausführer nun <syntaxhighlight lang="json" line="line">[ { "Z1K1": "Z9", "Z9K1": "Z6" }, { "Z1K1": "Z6", "Z6K1": "hayyy" } ]</syntaxhighlight> Wie du dir denken kannst, geschieht dies, um die Objektgröße zu verringern: Bei einer Liste in Normalform wird der Typ der Liste für jeden Listenwert erneut gespeichert, was sehr schnell kostspielig wird und zu einem sprunghaften Anstieg des Speicherverbrauchs in den Ausführern führt (stell dir nur einmal vor, wie eine verschachtelte Liste aussehen würde!). Beim neuen Ansatz wird der Typ hingegen nur noch ein einziges Mal pro Liste gespeichert. '''Was musst du also tun?''' Wenn du bisher nicht mit Typumwandlungsfunktionen gearbeitet hast: '''gar nichts'''. Falls deine Typumwandlungsfunktionen keine Typen mit eingebetteten Listen umwandeln: ebenfalls '''nichts'''! Diese Änderung betrifft dich nur, wenn du an Typumwandlungsfunktionen arbeitest, die Typen mit internen Listenwerten verarbeiten. Vorerst betrifft diese Änderung ausschließlich Eingabeobjekte (Funktionsargumente), sodass der Fokus auf Typumwandlungen liegt, die Daten ''in'' Code umwandeln. Deine Umwandlungsfunktionen müssen nun in der Lage sein, das neue Format anstelle des alten zu verarbeiten (oder zusätzlich dazu, falls du vorübergehende Inkompatibilitäten vermeiden möchtest!). Möglicherweise werden wir in Zukunft eine ähnliche Änderung für Funktionsrückgabewerte vornehmen, doch aktuell sind Typumwandlungen, die Daten ''aus'' Code umwandeln, davon nicht betroffen. Um dies etwas zu vereinfachen, ermöglichen wir es dir zudem, '''type_convert_to_code()''' und '''type_convert_from_code()''' (in JS: '''typeConvertToCode''' und '''typeConvertFromCode''') direkt in deinen Code-Implementierungen sowie im Code für Typumwandler aufzurufen! Durch die Verwendung dieser Funktionen erhältst du ein Verhalten, das sowohl vorwärts- als auch rückwärtskompatibel ist. Eine wesentliche Einschränkung besteht jedoch darin, dass diese Funktionen derzeit nur für integrierte Typen und deren Kombinationen funktionieren: Unterstützt werden in diesem Kontext ausschließlich <code>[[Z6|Z6/String]]</code>, <code>[[Z9|Z9/Reference]]</code>, <code>[[Z40|Z40/Boolean]]</code>, <code>[[Z21|Z21/Void]]</code>, <code>[[Z881|Z881()/List]]</code>, <code>[[Z882|Z882()/Pair]]</code> und <code>[[Z883|Z883()/Map types]]</code>. Du könntest '''type_convert_to_code()''' also nicht auf eine <code>[[Z881|Z881]]([[Z13518|Z13518]])/[[Z881|Liste]] von [[Z13518|natürlichen Zahlen]]</code> anwenden, wohl aber auf eine <code>[[Z881|Z881]]([[Z6|Z6]])/[[Z881|Liste]] von [[Z13518|Paaren]] aus [[Z6|Zeichenketten]]</code> oder sogar auf eine <code>[[Z881|Z881]]([[Z882|Z882]]([[Z6|Z6]], [[Z40|Z40]]))/[[Z881|Liste]] von [[Z882|Paaren]] aus [[Z6|Zeichenkette]] und [[Z40|booleschem Wert]]</code>. Dies ist ein Schritt in Richtung einer Zukunft, in der Typumwandler aufeinander aufbauend definiert werden können, was die Wiederverwendung von Code für Typumwandler ermöglicht! <span id="Recent_Changes_in_the_software"></span> === Letzte Änderungen an der Software === Diese Woche haben wir eine Reihe von Verbesserungen vorgenommen. Im Detaildialog auf Wikifunctions haben wir die Zeitangaben aktualisiert, sodass sie nun stets auf dem neuesten Stand bleiben ([[:phab:T440533|T440533]]). Zudem haben wir einen verwirrenden Hinweis zur Herkunft im Bereich der Testergebnisse entfernt ([[:phab:T440537|T440537]]). Außerdem haben wir einen Fehler behoben, durch den Objektbezeichnungen, die wie ZIDs aussahen, falsch dargestellt wurden und in manchen Fällen nicht veröffentlicht werden konnten ([[:phab:T437013|T437013]]). Zudem überschreibt die Schnellbearbeitung von Bezeichnungen/Aliassen/Beschreibungen im “Info”-Bereich nicht mehr Änderungen anderer Autoren, die nach dem Öffnen der Seite durch dich vorgenommen wurden ([[:phab:T436793|T436793]]); außerdem funktionieren die Links zum Rückgängigmachen von Bearbeitungen an Objekten wieder ([[:phab:T395219|T395219]]). Zudem haben wir die Funktion “Ergebnis-Link kopieren” korrigiert, sodass nun tatsächlich der Ergebnis-Link kopiert wird und nicht mehr der Inhalt der aktuellen Eingaben ([[:phab:T433744|T433744]]). In der Abstrakten Wikipedia bieten wir in Fällen, in denen Ergebnis-Links für Browser zu lang sind, die Option “Ergebnis-Link kopieren” nicht mehr an ([[:phab:T439078|T439078]]); zudem haben wir die Hervorhebung verbessert, die ein Fragment mit der Vorschau verknüpft ([[:phab:T439109|T439109]]). Schließlich wurde nach der Malayalam-Wikipedia auch für die Wikipedias in Igbo und Dagbani die Integration aktiviert. Die jeweiligen Communitys können die Integration über die Community-Konfiguration aktivieren; es geschieht jedoch nichts automatisch: Ob und welche Artikel integriert werden, liegt stets im Ermessen der jeweiligen lokalen Community. Weitere Informationen findest du im [[Special:MyLanguage/Wikifunctions:Status_updates/2026-10-02|Newsletter von vor zwei Wochen]]. <span id="Fresh_Functions_weekly:_119_new_Functions"></span> === Wöchentliche neue Funktionen: 119 neue Funktionen === Diese Woche hatten wir 119 neue Funktionen. Hier ist eine unvollständige Liste von Funktionen mit Implementierungen und bestandenen Tests, um einen Eindruck davon zu bekommen, welche Funktionen erstellt wurden. Vielen Dank an alle für ihre Beiträge! * {{Z|Z44403}} * {{Z|Z44406}} * {{Z|Z44421}} * {{Z|Z44424}} * {{Z|Z44430}} * {{Z|Z44433}} * {{Z|Z44435}} * {{Z|Z44443}} * {{Z|Z44447}} * {{Z|Z44462}} * {{Z|Z44472}} * {{Z|Z44477}} * {{Z|Z44480}} * {{Z|Z44483}} * {{Z|Z44486}} * {{Z|Z44491}} * {{Z|Z44494}} * {{Z|Z44497}} * {{Z|Z44500}} * {{Z|Z44543}} * {{Z|Z44558}} * {{Z|Z44567}} * {{Z|Z44569}} * {{Z|Z44575}} * {{Z|Z44577}} * {{Z|Z44581}} * {{Z|Z44592}} * {{Z|Z44593}} * {{Z|Z44609}} * {{Z|Z44613}} * {{Z|Z44615}} * {{Z|Z44619}} * {{Z|Z44630}} * {{Z|Z44631}} * {{Z|Z44632}} * {{Z|Z44633}} * {{Z|Z44633}} * {{Z|Z44635}} * {{Z|Z44636}} * {{Z|Z44637}} * {{Z|Z44638}} * {{Z|Z44639}} * {{Z|Z44640}} * {{Z|Z44641}} * {{Z|Z44642}} * {{Z|Z44643}} * {{Z|Z44644}} * {{Z|Z44686}} * {{Z|Z44687}} * {{Z|Z44688}} * {{Z|Z44689}} * {{Z|Z44690}} * {{Z|Z44691}} * {{Z|Z44692}} * {{Z|Z44693}} * {{Z|Z44723}} * {{Z|Z44729}} * {{Z|Z44736}} * {{Z|Z44747}} * {{Z|Z44763}} * {{Z|Z44769}} * {{Z|Z44771}} * {{Z|Z44772}} * {{Z|Z44777}} * {{Z|Z44780}} * {{Z|Z44821}} * {{Z|Z44822}} * {{Z|Z44823}} * {{Z|Z44858}} * {{Z|Z44900}} * {{Z|Z44917}} * {{Z|Z44923}} * {{Z|Z44924}} * {{Z|Z44933}} * {{Z|Z44938}} * {{Z|Z44959}} * {{Z|Z44970}} * {{Z|Z44981}} * {{Z|Z44992}} * {{Z|Z45002}} * {{Z|Z45013}} * {{Z|Z45024}} * {{Z|Z45035}} * {{Z|Z45044}} * {{Z|Z45053}} * {{Z|Z45064}} * {{Z|Z45073}} * {{Z|Z45082}} * {{Z|Z45083}} * {{Z|Z45102}} * {{Z|Z45114}} * {{Z|Z45118}} * {{Z|Z45123}} * {{Z|Z45127}} * {{Z|Z45128}} * {{Z|Z45129}} * {{Z|Z45130}} * {{Z|Z45131}} * {{Z|Z45165}} * {{Z|Z45174}} * {{Z|Z45198}} * {{Z|Z45203}} * {{Z|Z45224}} * {{Z|Z45235}} * {{Z|Z45246}} * {{Z|Z45257}} * {{Z|Z45267}} * {{Z|Z45278}} * {{Z|Z45289}} * {{Z|Z45305}} Eine [https://www.wikifunctions.org/wiki/Special:ListObjectsByType?type=Z8&orderby=latest vollständige Liste aller Funktionen, sortiert nach Erstellungsdatum], ist verfügbar. [[Category:Status updates{{#translation:}}|2026-10-17]] hiycm8kyysro57hi7no0o7qxkiwf5bo Translations:Wikifunctions:Status updates/2026-10-17/4/de 1198 100340 331046 330721 2026-10-23T08:01:10Z Ameisenigel 44 331046 wikitext text/x-wiki Ab nächstem Mittwoch nehmen wir eine kleine Änderung an der Zwischendarstellung von Funktionsargumenten im Auswerter vor. Diese Objekte werden nicht mehr als reine ZObjekte in Normalform eingelesen; stattdessen werden Listen als JSON-Arrays dargestellt. Genauer gesagt, als [[$1|Benjamin-Arrays]], die typsichere Array-Darstellung, die in kanonischer Form und an anderen Stellen in WikiLambda verwendet wird. Anstatt oflly4oz1pgkdqhbnokynqq9qk0fbgx Z46789 0 100374 330868 2026-10-22T12:23:10Z 99of9 1622 330868 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46789" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z45387", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z45387", "Z45387K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q18915128" }, { "Z1K1": "Z6091", "Z6091K1": "Q949779" } ], "Z45387K2": "Z1002" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "including Sydney and Melbourne" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "[en] \"including Sydney and Melbourne\"" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 8182yn085j7pxm8vagy27g99t439zxx Z46790 0 100375 330870 2026-10-22T12:24:30Z 99of9 1622 330870 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46790" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z45336", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z45336", "Z45336K1": { "Z1K1": "Z6091", "Z6091K1": "Q28128222" }, "Z45336K2": "Z1002" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "hot" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "[en] hot: \"hot\"" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } fh6e9qp4lp7x6rvztt5i6rkl2g2gh3u 330871 330870 2026-10-22T12:52:42Z 99of9 1622 330871 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46790" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z45336", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z45336", "Z45336K1": { "Z1K1": "Z6091", "Z6091K1": "Q28128222" }, "Z45336K2": "Z1002" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "hot" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "[en] hot: \"hot\"??" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Should it be \"which is hot\" or \"which are hot\"??" } ] } } sq7wrvv761o3t4z2bf5l34hhq8466bk Z46791 0 100376 330873 2026-10-22T13:51:34Z IanVG 102152 330873 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46791" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z19677", "Z17K2": "Z46791K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Temperature 2" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z19677", "Z17K2": "Z46791K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Temperature 1" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z19677", "Z17K2": "Z46791K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Specific heat" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z19677", "Z17K2": "Z46791K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Mass flow rate" } ] } } ], "Z8K2": "Z19677", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z46791" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sensible heat" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Equation for calculating the sensible heat transfer of a fluid, like water or air." } ] } } it5ldttpyk1hy8kaophx8m1pnq0emue 330879 330873 2026-10-22T13:58:02Z IanVG 102152 changed name to constant pressure sensible heat 330879 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46791" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z19677", "Z17K2": "Z46791K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Temperature 2" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z19677", "Z17K2": "Z46791K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Temperature 1" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z19677", "Z17K2": "Z46791K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Specific heat" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z19677", "Z17K2": "Z46791K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Mass flow rate" } ] } } ], "Z8K2": "Z19677", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z46791" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Constant pressure sensible heat" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Equation for calculating the sensible heat transfer of a fluid, like water or air." } ] } } e0f4k4tcbe2jcnqur13vzsim8q87b9j 330880 330879 2026-10-22T13:58:25Z IanVG 102152 Really, just constant pressure heat suffices, I think. 330880 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46791" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z19677", "Z17K2": "Z46791K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Temperature 2" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z19677", "Z17K2": "Z46791K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Temperature 1" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z19677", "Z17K2": "Z46791K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Specific heat" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z19677", "Z17K2": "Z46791K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Mass flow rate" } ] } } ], "Z8K2": "Z19677", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z46791" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Constant pressure heat" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Equation for calculating the sensible heat transfer of a fluid, like water or air." } ] } } 9vmsbyo3w0li7ka8vppdut649yqlwft Z46792 0 100377 330874 2026-10-22T13:52:22Z GrounderUK 50 ➕[[Z8]]: [[Z1]] ↤ [[Z1]] 330874 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46792" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z46792K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "object that may be identifiable" } ] } } ], "Z8K2": "Z1", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z46792" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "object identity as ZID else object" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1002", "Z31K2": [ "Z6", "reference as ZID where possible" ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "returns the value of the given object’s identity key as a Wikifunctions object reference or the object itself for an object with no identity key" } ] } } 0n8bw6e39xhx8lqxc9hjy4hevj5e11e 330882 330874 2026-10-22T14:01:06Z GrounderUK 50 Added Z46795 to the approved list of test cases 330882 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46792" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z46792K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "object that may be identifiable" } ] } } ], "Z8K2": "Z1", "Z8K3": [ "Z20", "Z46795" ], "Z8K4": [ "Z14" ], "Z8K5": "Z46792" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "object identity as ZID else object" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1002", "Z31K2": [ "Z6", "reference as ZID where possible" ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "returns the value of the given object’s identity key as a Wikifunctions object reference or the object itself for an object with no identity key" } ] } } 6ved5bymf4cjyzki3bwvqmi75303y6q 330892 330882 2026-10-22T14:17:16Z GrounderUK 50 Added Z46802 to the approved list of implementations 330892 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46792" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z46792K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "object that may be identifiable" } ] } } ], "Z8K2": "Z1", "Z8K3": [ "Z20", "Z46795" ], "Z8K4": [ "Z14", "Z46802" ], "Z8K5": "Z46792" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "object identity as ZID else object" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1002", "Z31K2": [ "Z6", "reference as ZID where possible" ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "returns the value of the given object’s identity key as a Wikifunctions object reference or the object itself for an object with no identity key" } ] } } ej9bh9b6h5f00pgb9d0nujzzpfasw3n Z46793 0 100378 330875 2026-10-22T13:53:09Z IanVG 102152 330875 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46793" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z46791", "Z14K3": { "Z1K1": "Z16", "Z16K1": "Z610", "Z16K2": "def Z46791(Z46791K1, Z46791K2, Z46791K3, Z46791K4):\n\tZ46791K4 * Z46791K3 * (Z46791K1 - Z46791K2)" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sensible heating function implementation in Python" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Q = m * cp * delta T" } ] } } qfoyxmv4hfiq82vld5cln42w3nj1jj1 330876 330875 2026-10-22T13:54:15Z IanVG 102152 330876 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46793" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z46791", "Z14K3": { "Z1K1": "Z16", "Z16K1": "Z610", "Z16K2": "def Z46791(Z46791K1, Z46791K2, Z46791K3, Z46791K4):\n\treturn (Z46791K4 * Z46791K3 * (Z46791K1 - Z46791K2))" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sensible heating function implementation in Python" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Q = m * cp * delta T" } ] } } gg84ys958l9tj7qnq7fs7gf8rytpmck Z46794 0 100379 330877 2026-10-22T13:56:43Z IanVG 102152 330877 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46794" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46791", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z46791", "Z46791K1": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "50" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "1" } }, "Z46791K2": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "30" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "1" } }, "Z46791K3": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "1" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "1" } }, "Z46791K4": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "2" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "1" } } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z19686", "Z19686K2": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "40" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "1" } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Heating air up." } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "30°C air entering and 50°C air leaving, with a Cp of 1.00 kJ/kg*K, with a mass flow rate of 2 kg/s." } ] } } 1dwqr149fpl5kwxkkdmjwhli1b6qxg1 Z46795 0 100380 330878 2026-10-22T13:56:59Z GrounderUK 50 [[Z46792]]➕[[Z20]] 330878 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46795" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46792", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z46792", "Z46792K1": "Z10000" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z40327", "Z40327K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z10000" } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "ZID from Z10000/join two strings" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } dsdzwd5nvfg6eg2b7qlag3otwhufw6h Z46796 0 100381 330883 2026-10-22T14:02:25Z IanVG 102152 330883 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46796" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z19677", "Z17K2": "Z46796K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Ambient temperature, °C" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z19677", "Z17K2": "Z46796K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Nominal operating cell temperature, °C" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z19677", "Z17K2": "Z46796K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Solar irradiance, W/m2" } ] } } ], "Z8K2": "Z19677", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z46796" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Simplified NOCT PV cell temperature" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Uses nominal values of 800 W/m2 and 20°C for standard NOCT PV cell temperature test." } ] } } kcfn9h6azaf3h9srg3j6r7q57s742jd Z46797 0 100382 330884 2026-10-22T14:03:50Z IanVG 102152 330884 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46797" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z46796", "Z14K3": { "Z1K1": "Z16", "Z16K1": "Z610", "Z16K2": "def Z46796(Z46796K1, Z46796K2, Z46796K3):\n\treturn (Z46796K1 + ((Z46796K2 -20)/800) * Z46796K3)" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Main simplified NOCT PV cell temperature with W/m2" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Tc = Ta + ((NOCT - 20)/800) * G" } ] } } 7tpbt7ls6uu9n1e23vm500b6m2pbk0g Z46798 0 100383 330885 2026-10-22T14:05:39Z IanVG 102152 330885 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46798" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46796", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z46796", "Z46796K1": { "Z1K1": "Z19677", "Z19677K1": { "Z1K1": "Z16659", "Z16659K1": "Z16660" }, "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "35" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "1" } }, "Z46796K2": { "Z1K1": "Z19677", "Z19677K1": { "Z1K1": "Z16659", "Z16659K1": "Z16660" }, "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "20" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "1" } }, "Z46796K3": { "Z1K1": "Z19677", "Z19677K1": { "Z1K1": "Z16659", "Z16659K1": "Z16660" }, "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "1000" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "1" } } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z19686", "Z19686K2": { "Z1K1": "Z19677", "Z19677K1": { "Z1K1": "Z16659", "Z16659K1": "Z16660" }, "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "35" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "1" } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "NOCT is 20 °C." } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Scenario where NOCT temperature is the same as the standard NOCT test temperature of 20 °C, which should result in the same temperature as ambient conditions." } ] } } 2z7515p1oisralofdhtvcwskahs6dtn Z46799 0 100384 330888 2026-10-22T14:13:57Z IanVG 102152 330888 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46799" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z19677", "Z17K2": "Z46799K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Plane of array solar energy per unit area" } ] } } ], "Z8K2": "Z19677", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z46799" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "PV reference yield, Yr" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "The total solar energy received per unit area divided by the standard condition solar irradiance (1 kW/m²)." } ] } } gsbpasevcohx8r9bm7zeox57578qu6y Z46800 0 100385 330889 2026-10-22T14:14:49Z IanVG 102152 330889 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46800" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z46799", "Z14K3": { "Z1K1": "Z16", "Z16K1": "Z610", "Z16K2": "def Z46799(Z46799K1):\n\treturn Z46799K1/1" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Units for plane of array solar energy per unit area is in kWh/m²." } ] } } tque6zz0uw7gfpd5kg7onzhxwdei5uv Z46801 0 100386 330890 2026-10-22T14:15:37Z IanVG 102152 330890 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46801" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46799", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z46799", "Z46799K1": { "Z1K1": "Z19677", "Z19677K1": { "Z1K1": "Z16659", "Z16659K1": "Z16660" }, "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "150" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "1" } } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z19686", "Z19686K2": { "Z1K1": "Z19677", "Z19677K1": { "Z1K1": "Z16659", "Z16659K1": "Z16660" }, "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "150" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "1" } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "150 kWh/m²" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "150 kWh/m², the output should be 50 hours." } ] } } 0jmxisgp0k9x0nnufa7z42kmygirtj6 Z46802 0 100387 330891 2026-10-22T14:16:39Z GrounderUK 50 [[Z46792]]➕[[Z14]] initial implementation 330891 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46802" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z46792", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z30433", "Z30433K1": { "Z1K1": "Z18", "Z18K1": "Z46792K1" }, "Z30433K2": { "Z1K1": "Z39", "Z39K1": "Z8K5" } }, "Z802K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z7", "Z7K1": "Z28231", "Z28231K1": { "Z1K1": "Z18", "Z18K1": "Z46792K1" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z30433", "Z30433K1": { "Z1K1": "Z18", "Z18K1": "Z46792K1" }, "Z30433K2": { "Z1K1": "Z39", "Z39K1": "Z4K1" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z39146", "Z39146K1": { "Z1K1": "Z18", "Z18K1": "Z46792K1" } }, "Z802K3": { "Z1K1": "Z18", "Z18K1": "Z46792K1" } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ra6f51eod7u5gxmwz62no0ple1qytqi 330893 330891 2026-10-22T14:23:47Z GrounderUK 50 return ZID rather than string 330893 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46802" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z46792", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z30433", "Z30433K1": { "Z1K1": "Z18", "Z18K1": "Z46792K1" }, "Z30433K2": { "Z1K1": "Z39", "Z39K1": "Z8K5" } }, "Z802K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z7", "Z7K1": "Z28231", "Z28231K1": { "Z1K1": "Z18", "Z18K1": "Z46792K1" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z30433", "Z30433K1": { "Z1K1": "Z18", "Z18K1": "Z46792K1" }, "Z30433K2": { "Z1K1": "Z39", "Z39K1": "Z4K1" } }, "Z802K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z7", "Z7K1": "Z39146", "Z39146K1": { "Z1K1": "Z18", "Z18K1": "Z46792K1" } } }, "Z802K3": { "Z1K1": "Z18", "Z18K1": "Z46792K1" } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ayc2ji6pcs2xvtf28jsgs3ofy1cr8pf 331156 330893 2026-10-23T08:39:33Z HenkvD 1290 English label 331156 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46802" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z46792", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z30433", "Z30433K1": { "Z1K1": "Z18", "Z18K1": "Z46792K1" }, "Z30433K2": { "Z1K1": "Z39", "Z39K1": "Z8K5" } }, "Z802K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z7", "Z7K1": "Z28231", "Z28231K1": { "Z1K1": "Z18", "Z18K1": "Z46792K1" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z30433", "Z30433K1": { "Z1K1": "Z18", "Z18K1": "Z46792K1" }, "Z30433K2": { "Z1K1": "Z39", "Z39K1": "Z4K1" } }, "Z802K2": { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z7", "Z7K1": "Z39146", "Z39146K1": { "Z1K1": "Z18", "Z18K1": "Z46792K1" } } }, "Z802K3": { "Z1K1": "Z18", "Z18K1": "Z46792K1" } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "object identity as ZID else object, Composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 9utqyibdwbm4abjaolyflhu4ks0q9fk Z46803 0 100388 330903 2026-10-22T15:35:32Z ReXLer 39813 330903 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46803" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6001", "Z17K2": "Z46803K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46803K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z46803K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "lexical categories" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z46803K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical features" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z46803" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "(experimental) Word form from lexeme from item" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1002", "Z31K2": [ "Z6", "Word form from item" ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 29750kvh3o9dxd0hpegreg496vsdhc7 330906 330903 2026-10-22T15:39:59Z ReXLer 39813 Added Z46804 to the approved list of implementations 330906 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46803" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6001", "Z17K2": "Z46803K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46803K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z46803K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "lexical categories" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z46803K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical features" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z46804" ], "Z8K5": "Z46803" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "(experimental) Word form from lexeme from item" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1002", "Z31K2": [ "Z6", "Word form from item" ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 0mmrkdpytvlr1kk9khpaa8mewxvlluf 330907 330906 2026-10-22T15:40:05Z ReXLer 39813 Removed Z46804 from the approved list of implementations 330907 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46803" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6001", "Z17K2": "Z46803K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46803K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z46803K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "lexical categories" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z46803K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical features" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z46803" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "(experimental) Word form from lexeme from item" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1002", "Z31K2": [ "Z6", "Word form from item" ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 29750kvh3o9dxd0hpegreg496vsdhc7 330909 330907 2026-10-22T15:41:44Z ReXLer 39813 Added Z46804 to the approved list of implementations 330909 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46803" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6001", "Z17K2": "Z46803K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46803K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z46803K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "lexical categories" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z46803K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical features" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z46804" ], "Z8K5": "Z46803" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "(experimental) Word form from lexeme from item" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1002", "Z31K2": [ "Z6", "Word form from item" ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 0mmrkdpytvlr1kk9khpaa8mewxvlluf 330910 330909 2026-10-22T15:41:57Z ReXLer 39813 Removed Z46804 from the approved list of implementations 330910 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46803" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6001", "Z17K2": "Z46803K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46803K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z46803K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "lexical categories" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z46803K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical features" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z46803" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "(experimental) Word form from lexeme from item" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1002", "Z31K2": [ "Z6", "Word form from item" ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 29750kvh3o9dxd0hpegreg496vsdhc7 330912 330910 2026-10-22T15:44:59Z ReXLer 39813 Added Z46804 to the approved list of implementations 330912 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46803" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6001", "Z17K2": "Z46803K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46803K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z46803K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "lexical categories" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z46803K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical features" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z46804" ], "Z8K5": "Z46803" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "(experimental) Word form from lexeme from item" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1002", "Z31K2": [ "Z6", "Word form from item" ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 0mmrkdpytvlr1kk9khpaa8mewxvlluf 330913 330912 2026-10-22T15:45:09Z ReXLer 39813 Removed Z46804 from the approved list of implementations 330913 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46803" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6001", "Z17K2": "Z46803K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46803K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z46803K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "lexical categories" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z46803K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical features" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z46803" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "(experimental) Word form from lexeme from item" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1002", "Z31K2": [ "Z6", "Word form from item" ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 29750kvh3o9dxd0hpegreg496vsdhc7 330914 330913 2026-10-22T15:48:21Z ReXLer 39813 Added Z46804 to the approved list of implementations 330914 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46803" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6001", "Z17K2": "Z46803K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46803K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z46803K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "lexical categories" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z46803K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical features" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z46804" ], "Z8K5": "Z46803" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "(experimental) Word form from lexeme from item" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1002", "Z31K2": [ "Z6", "Word form from item" ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 0mmrkdpytvlr1kk9khpaa8mewxvlluf 330915 330914 2026-10-22T15:48:36Z ReXLer 39813 Removed Z46804 from the approved list of implementations 330915 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46803" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6001", "Z17K2": "Z46803K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46803K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z46803K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "lexical categories" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z46803K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical features" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z46803" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "(experimental) Word form from lexeme from item" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1002", "Z31K2": [ "Z6", "Word form from item" ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 29750kvh3o9dxd0hpegreg496vsdhc7 330917 330915 2026-10-22T15:51:12Z ReXLer 39813 Added Z46804 to the approved list of implementations 330917 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46803" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6001", "Z17K2": "Z46803K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46803K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z46803K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "lexical categories" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z46803K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical features" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z46804" ], "Z8K5": "Z46803" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "(experimental) Word form from lexeme from item" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1002", "Z31K2": [ "Z6", "Word form from item" ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 0mmrkdpytvlr1kk9khpaa8mewxvlluf 330919 330917 2026-10-22T15:52:41Z ReXLer 39813 Added Z46805 to the approved list of test cases 330919 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46803" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6001", "Z17K2": "Z46803K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46803K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z46803K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "lexical categories" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z46803K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical features" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20", "Z46805" ], "Z8K4": [ "Z14", "Z46804" ], "Z8K5": "Z46803" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "(experimental) Word form from lexeme from item" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1002", "Z31K2": [ "Z6", "Word form from item" ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } lgk8m9t8jbn05uxolktfjwctnwg7spz 330921 330919 2026-10-22T16:01:50Z ReXLer 39813 Added Z46806 to the approved list of test cases 330921 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46803" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6001", "Z17K2": "Z46803K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46803K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z46803K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "lexical categories" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z46803K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical features" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20", "Z46805", "Z46806" ], "Z8K4": [ "Z14", "Z46804" ], "Z8K5": "Z46803" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "(experimental) Word form from lexeme from item" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1002", "Z31K2": [ "Z6", "Word form from item" ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } j4867422sh3qbopeozvsn5emsy0fywd 330924 330921 2026-10-22T16:27:24Z ReXLer 39813 Added Z46807 to the approved list of test cases 330924 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46803" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6001", "Z17K2": "Z46803K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "item" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46803K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z46803K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "lexical categories" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z17K2": "Z46803K4", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "grammatical features" } ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20", "Z46805", "Z46806", "Z46807" ], "Z8K4": [ "Z14", "Z46804" ], "Z8K5": "Z46803" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "(experimental) Word form from lexeme from item" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31", { "Z1K1": "Z31", "Z31K1": "Z1002", "Z31K2": [ "Z6", "Word form from item" ] } ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } jiecahneqs3utqqccgkohi428nb6aye Z46804 0 100389 330905 2026-10-22T15:39:27Z ReXLer 39813 first draft 330905 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46804" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z46803", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z22478", "Z22478K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z19243", "Z19243K1": { "Z1K1": "Z7", "Z7K1": "Z101", "Z101K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z46803K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q24905" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z22478", "Z22478K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z19302", "Z19302K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z7", "Z7K1": "Z44077", "Z44077K1": { "Z1K1": "Z7", "Z7K1": "Z6820", "Z6820K1": { "Z1K1": "Z7", "Z7K1": "Z17895", "Z17895K1": { "Z1K1": "Z7", "Z7K1": "Z32599", "Z32599K1": { "Z1K1": "Z7", "Z7K1": "Z23756", "Z23756K1": { "Z1K1": "Z18", "Z18K1": "Z46803K1" } }, "Z32599K2": { "Z1K1": "Z6092", "Z6092K1": "P9970" }, "Z32599K3": { "Z1K1": "Z18", "Z18K1": "Z46803K2" } } }, "Z6820K2": [ "Z6030" ], "Z6820K3": [ "Z60" ], "Z6820K4": [ "Z6092" ] }, "Z44077K2": { "Z1K1": "Z7", "Z7K1": "Z30120", "Z30120K1": { "Z1K1": "Z7", "Z7K1": "Z23756", "Z23756K1": { "Z1K1": "Z18", "Z18K1": "Z46803K1" } }, "Z30120K2": [ "Z6030", "Z6033" ], "Z30120K3": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z30120K4": [ "Z6092" ] }, "Z44077K3": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z44077K4": { "Z1K1": "Z7", "Z7K1": "Z850", "Z850K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z29649", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z850K2": "Z36589", "Z850K3": [ "Z6091" ] }, "Z44077K5": { "Z1K1": "Z18", "Z18K1": "" }, "Z44077K6": { "Z1K1": "Z40", "Z40K1": "Z41" } } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z22478", "Z22478K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z19302", "Z19302K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z7", "Z7K1": "Z44077", "Z44077K1": { "Z1K1": "Z7", "Z7K1": "Z6820", "Z6820K1": { "Z1K1": "Z7", "Z7K1": "Z17895", "Z17895K1": { "Z1K1": "Z7", "Z7K1": "Z32599", "Z32599K1": { "Z1K1": "Z7", "Z7K1": "Z23756", "Z23756K1": { "Z1K1": "Z18", "Z18K1": "Z46803K1" } }, "Z32599K2": { "Z1K1": "Z6092", "Z6092K1": "P5137" }, "Z32599K3": { "Z1K1": "Z18", "Z18K1": "Z46803K2" } } }, "Z6820K2": [ "Z6030" ], "Z6820K3": [ "Z60" ], "Z6820K4": [ "Z6092" ] }, "Z44077K2": { "Z1K1": "Z7", "Z7K1": "Z30120", "Z30120K1": { "Z1K1": "Z7", "Z7K1": "Z23756", "Z23756K1": { "Z1K1": "Z18", "Z18K1": "Z46803K1" } }, "Z30120K2": [ "Z6030", "Z6033" ], "Z30120K3": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z30120K4": [ "Z6092" ] }, "Z44077K3": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z44077K4": { "Z1K1": "Z7", "Z7K1": "Z850", "Z850K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z29649", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z850K2": "Z36589", "Z850K3": [ "Z6091" ] }, "Z44077K5": { "Z1K1": "Z18", "Z18K1": "Z46803K3" }, "Z44077K6": { "Z1K1": "Z40", "Z40K1": "Z41" } } } } } } } }, "Z19243K2": { "Z1K1": "Z18", "Z18K1": "Z46803K4" } } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Word form from lexeme, comp" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 97gu35ib82yqf31wr9sljk4fotqg59s 330908 330905 2026-10-22T15:41:16Z ReXLer 39813 fixed 330908 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46804" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z46803", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z22478", "Z22478K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z19243", "Z19243K1": { "Z1K1": "Z7", "Z7K1": "Z101", "Z101K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z46803K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q24905" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z22478", "Z22478K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z19302", "Z19302K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z7", "Z7K1": "Z44077", "Z44077K1": { "Z1K1": "Z7", "Z7K1": "Z6820", "Z6820K1": { "Z1K1": "Z7", "Z7K1": "Z17895", "Z17895K1": { "Z1K1": "Z7", "Z7K1": "Z32599", "Z32599K1": { "Z1K1": "Z7", "Z7K1": "Z23756", "Z23756K1": { "Z1K1": "Z18", "Z18K1": "Z46803K1" } }, "Z32599K2": { "Z1K1": "Z6092", "Z6092K1": "P9970" }, "Z32599K3": { "Z1K1": "Z18", "Z18K1": "Z46803K2" } } }, "Z6820K2": [ "Z6030" ], "Z6820K3": [ "Z60" ], "Z6820K4": [ "Z6092" ] }, "Z44077K2": { "Z1K1": "Z7", "Z7K1": "Z30120", "Z30120K1": { "Z1K1": "Z7", "Z7K1": "Z23756", "Z23756K1": { "Z1K1": "Z18", "Z18K1": "Z46803K1" } }, "Z30120K2": [ "Z6030", "Z6033" ], "Z30120K3": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z30120K4": [ "Z6092" ] }, "Z44077K3": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z44077K4": { "Z1K1": "Z7", "Z7K1": "Z850", "Z850K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z29649", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z850K2": "Z36589", "Z850K3": [ "Z6091" ] }, "Z44077K5": { "Z1K1": "Z18", "Z18K1": "Z46803K3" }, "Z44077K6": { "Z1K1": "Z40", "Z40K1": "Z41" } } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z22478", "Z22478K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z19302", "Z19302K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z7", "Z7K1": "Z44077", "Z44077K1": { "Z1K1": "Z7", "Z7K1": "Z6820", "Z6820K1": { "Z1K1": "Z7", "Z7K1": "Z17895", "Z17895K1": { "Z1K1": "Z7", "Z7K1": "Z32599", "Z32599K1": { "Z1K1": "Z7", "Z7K1": "Z23756", "Z23756K1": { "Z1K1": "Z18", "Z18K1": "Z46803K1" } }, "Z32599K2": { "Z1K1": "Z6092", "Z6092K1": "P5137" }, "Z32599K3": { "Z1K1": "Z18", "Z18K1": "Z46803K2" } } }, "Z6820K2": [ "Z6030" ], "Z6820K3": [ "Z60" ], "Z6820K4": [ "Z6092" ] }, "Z44077K2": { "Z1K1": "Z7", "Z7K1": "Z30120", "Z30120K1": { "Z1K1": "Z7", "Z7K1": "Z23756", "Z23756K1": { "Z1K1": "Z18", "Z18K1": "Z46803K1" } }, "Z30120K2": [ "Z6030", "Z6033" ], "Z30120K3": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z30120K4": [ "Z6092" ] }, "Z44077K3": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z44077K4": { "Z1K1": "Z7", "Z7K1": "Z850", "Z850K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z29649", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z850K2": "Z36589", "Z850K3": [ "Z6091" ] }, "Z44077K5": { "Z1K1": "Z18", "Z18K1": "Z46803K3" }, "Z44077K6": { "Z1K1": "Z40", "Z40K1": "Z41" } } } } } } } }, "Z19243K2": { "Z1K1": "Z18", "Z18K1": "Z46803K4" } } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Word form from lexeme, comp" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } h8si588r0u2blr3yy3tpr0b2x7skmw7 330911 330908 2026-10-22T15:44:35Z ReXLer 39813 this will fix it 330911 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46804" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z46803", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z22478", "Z22478K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z19243", "Z19243K1": { "Z1K1": "Z7", "Z7K1": "Z101", "Z101K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z46803K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q24905" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z19302", "Z19302K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z7", "Z7K1": "Z44077", "Z44077K1": { "Z1K1": "Z7", "Z7K1": "Z6820", "Z6820K1": { "Z1K1": "Z7", "Z7K1": "Z17895", "Z17895K1": { "Z1K1": "Z7", "Z7K1": "Z32599", "Z32599K1": { "Z1K1": "Z7", "Z7K1": "Z23756", "Z23756K1": { "Z1K1": "Z18", "Z18K1": "Z46803K1" } }, "Z32599K2": { "Z1K1": "Z6092", "Z6092K1": "P9970" }, "Z32599K3": { "Z1K1": "Z18", "Z18K1": "Z46803K2" } } }, "Z6820K2": [ "Z6030" ], "Z6820K3": [ "Z60" ], "Z6820K4": [ "Z6092" ] }, "Z44077K2": { "Z1K1": "Z7", "Z7K1": "Z30120", "Z30120K1": { "Z1K1": "Z7", "Z7K1": "Z23756", "Z23756K1": { "Z1K1": "Z18", "Z18K1": "Z46803K1" } }, "Z30120K2": [ "Z6030", "Z6033" ], "Z30120K3": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z30120K4": [ "Z6092" ] }, "Z44077K3": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z44077K4": { "Z1K1": "Z7", "Z7K1": "Z850", "Z850K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z29649", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z850K2": "Z36589", "Z850K3": [ "Z6091" ] }, "Z44077K5": { "Z1K1": "Z18", "Z18K1": "Z46803K3" }, "Z44077K6": { "Z1K1": "Z40", "Z40K1": "Z41" } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z19302", "Z19302K1": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z7", "Z7K1": "Z44077", "Z44077K1": { "Z1K1": "Z7", "Z7K1": "Z6820", "Z6820K1": { "Z1K1": "Z7", "Z7K1": "Z17895", "Z17895K1": { "Z1K1": "Z7", "Z7K1": "Z32599", "Z32599K1": { "Z1K1": "Z7", "Z7K1": "Z23756", "Z23756K1": { "Z1K1": "Z18", "Z18K1": "Z46803K1" } }, "Z32599K2": { "Z1K1": "Z6092", "Z6092K1": "P5137" }, "Z32599K3": { "Z1K1": "Z18", "Z18K1": "Z46803K2" } } }, "Z6820K2": [ "Z6030" ], "Z6820K3": [ "Z60" ], "Z6820K4": [ "Z6092" ] }, "Z44077K2": { "Z1K1": "Z7", "Z7K1": "Z30120", "Z30120K1": { "Z1K1": "Z7", "Z7K1": "Z23756", "Z23756K1": { "Z1K1": "Z18", "Z18K1": "Z46803K1" } }, "Z30120K2": [ "Z6030", "Z6033" ], "Z30120K3": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z30120K4": [ "Z6092" ] }, "Z44077K3": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z44077K4": { "Z1K1": "Z7", "Z7K1": "Z850", "Z850K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z29649", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z850K2": "Z36589", "Z850K3": [ "Z6091" ] }, "Z44077K5": { "Z1K1": "Z18", "Z18K1": "Z46803K3" }, "Z44077K6": { "Z1K1": "Z40", "Z40K1": "Z41" } } } } } }, "Z19243K2": { "Z1K1": "Z18", "Z18K1": "Z46803K4" } } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Word form from lexeme, comp" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } qi8f5vi4mu1p8kcp8ptp1albku4fw2k 330916 330911 2026-10-22T15:51:08Z ReXLer 39813 fixed 330916 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46804" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z46803", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z22478", "Z22478K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z19243", "Z19243K1": { "Z1K1": "Z7", "Z7K1": "Z101", "Z101K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z46803K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q24905" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z7", "Z7K1": "Z44077", "Z44077K1": { "Z1K1": "Z7", "Z7K1": "Z6820", "Z6820K1": { "Z1K1": "Z7", "Z7K1": "Z17895", "Z17895K1": { "Z1K1": "Z7", "Z7K1": "Z32599", "Z32599K1": { "Z1K1": "Z7", "Z7K1": "Z23756", "Z23756K1": { "Z1K1": "Z18", "Z18K1": "Z46803K1" } }, "Z32599K2": { "Z1K1": "Z6092", "Z6092K1": "P9970" }, "Z32599K3": { "Z1K1": "Z18", "Z18K1": "Z46803K2" } } }, "Z6820K2": [ "Z6030" ], "Z6820K3": [ "Z60" ], "Z6820K4": [ "Z6092" ] }, "Z44077K2": { "Z1K1": "Z7", "Z7K1": "Z30120", "Z30120K1": { "Z1K1": "Z7", "Z7K1": "Z23756", "Z23756K1": { "Z1K1": "Z18", "Z18K1": "Z46803K1" } }, "Z30120K2": [ "Z6030", "Z6033" ], "Z30120K3": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z30120K4": [ "Z6092" ] }, "Z44077K3": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z44077K4": { "Z1K1": "Z7", "Z7K1": "Z850", "Z850K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z29649", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z850K2": "Z36589", "Z850K3": [ "Z6091" ] }, "Z44077K5": { "Z1K1": "Z18", "Z18K1": "Z46803K3" }, "Z44077K6": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z7", "Z7K1": "Z44077", "Z44077K1": { "Z1K1": "Z7", "Z7K1": "Z6820", "Z6820K1": { "Z1K1": "Z7", "Z7K1": "Z17895", "Z17895K1": { "Z1K1": "Z7", "Z7K1": "Z32599", "Z32599K1": { "Z1K1": "Z7", "Z7K1": "Z23756", "Z23756K1": { "Z1K1": "Z18", "Z18K1": "Z46803K1" } }, "Z32599K2": { "Z1K1": "Z6092", "Z6092K1": "P5137" }, "Z32599K3": { "Z1K1": "Z18", "Z18K1": "Z46803K2" } } }, "Z6820K2": [ "Z6030" ], "Z6820K3": [ "Z60" ], "Z6820K4": [ "Z6092" ] }, "Z44077K2": { "Z1K1": "Z7", "Z7K1": "Z30120", "Z30120K1": { "Z1K1": "Z7", "Z7K1": "Z23756", "Z23756K1": { "Z1K1": "Z18", "Z18K1": "Z46803K1" } }, "Z30120K2": [ "Z6030", "Z6033" ], "Z30120K3": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z30120K4": [ "Z6092" ] }, "Z44077K3": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z44077K4": { "Z1K1": "Z7", "Z7K1": "Z850", "Z850K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z29649", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z850K2": "Z36589", "Z850K3": [ "Z6091" ] }, "Z44077K5": { "Z1K1": "Z18", "Z18K1": "Z46803K3" }, "Z44077K6": { "Z1K1": "Z40", "Z40K1": "Z41" } } } } }, "Z19243K2": { "Z1K1": "Z18", "Z18K1": "Z46803K4" } } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Word form from lexeme, comp" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } n1vy583z1ja2fjh9m6au66r4vk3tmr5 330922 330916 2026-10-22T16:25:47Z ReXLer 39813 330922 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46804" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z46803", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z22478", "Z22478K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z36457", "Z36457K1": { "Z1K1": "Z7", "Z7K1": "Z101", "Z101K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z46803K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q24905" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z7", "Z7K1": "Z44077", "Z44077K1": { "Z1K1": "Z7", "Z7K1": "Z6820", "Z6820K1": { "Z1K1": "Z7", "Z7K1": "Z17895", "Z17895K1": { "Z1K1": "Z7", "Z7K1": "Z32599", "Z32599K1": { "Z1K1": "Z7", "Z7K1": "Z23756", "Z23756K1": { "Z1K1": "Z18", "Z18K1": "Z46803K1" } }, "Z32599K2": { "Z1K1": "Z6092", "Z6092K1": "P9970" }, "Z32599K3": { "Z1K1": "Z18", "Z18K1": "Z46803K2" } } }, "Z6820K2": [ "Z6030" ], "Z6820K3": [ "Z60" ], "Z6820K4": [ "Z6092" ] }, "Z44077K2": { "Z1K1": "Z7", "Z7K1": "Z30120", "Z30120K1": { "Z1K1": "Z7", "Z7K1": "Z23756", "Z23756K1": { "Z1K1": "Z18", "Z18K1": "Z46803K1" } }, "Z30120K2": [ "Z6030", "Z6033" ], "Z30120K3": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z30120K4": [ "Z6092" ] }, "Z44077K3": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z44077K4": { "Z1K1": "Z7", "Z7K1": "Z850", "Z850K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z29649", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z850K2": "Z36589", "Z850K3": [ "Z6091" ] }, "Z44077K5": { "Z1K1": "Z18", "Z18K1": "Z46803K3" }, "Z44077K6": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z7", "Z7K1": "Z44077", "Z44077K1": { "Z1K1": "Z7", "Z7K1": "Z6820", "Z6820K1": { "Z1K1": "Z7", "Z7K1": "Z17895", "Z17895K1": { "Z1K1": "Z7", "Z7K1": "Z32599", "Z32599K1": { "Z1K1": "Z7", "Z7K1": "Z23756", "Z23756K1": { "Z1K1": "Z18", "Z18K1": "Z46803K1" } }, "Z32599K2": { "Z1K1": "Z6092", "Z6092K1": "P5137" }, "Z32599K3": { "Z1K1": "Z18", "Z18K1": "Z46803K2" } } }, "Z6820K2": [ "Z6030" ], "Z6820K3": [ "Z60" ], "Z6820K4": [ "Z6092" ] }, "Z44077K2": { "Z1K1": "Z7", "Z7K1": "Z30120", "Z30120K1": { "Z1K1": "Z7", "Z7K1": "Z23756", "Z23756K1": { "Z1K1": "Z18", "Z18K1": "Z46803K1" } }, "Z30120K2": [ "Z6030", "Z6033" ], "Z30120K3": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z30120K4": [ "Z6092" ] }, "Z44077K3": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z44077K4": { "Z1K1": "Z7", "Z7K1": "Z850", "Z850K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z29649", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z850K2": "Z36589", "Z850K3": [ "Z6091" ] }, "Z44077K5": { "Z1K1": "Z18", "Z18K1": "Z46803K3" }, "Z44077K6": { "Z1K1": "Z40", "Z40K1": "Z41" } } } } } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z19302", "Z19302K1": { "Z1K1": "Z7", "Z7K1": "Z101", "Z101K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z46803K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q24905" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z7", "Z7K1": "Z44077", "Z44077K1": { "Z1K1": "Z7", "Z7K1": "Z6820", "Z6820K1": { "Z1K1": "Z7", "Z7K1": "Z17895", "Z17895K1": { "Z1K1": "Z7", "Z7K1": "Z32599", "Z32599K1": { "Z1K1": "Z7", "Z7K1": "Z23756", "Z23756K1": { "Z1K1": "Z18", "Z18K1": "Z46803K1" } }, "Z32599K2": { "Z1K1": "Z6092", "Z6092K1": "P9970" }, "Z32599K3": { "Z1K1": "Z18", "Z18K1": "Z46803K2" } } }, "Z6820K2": [ "Z6030" ], "Z6820K3": [ "Z60" ], "Z6820K4": [ "Z6092" ] }, "Z44077K2": { "Z1K1": "Z7", "Z7K1": "Z30120", "Z30120K1": { "Z1K1": "Z7", "Z7K1": "Z23756", "Z23756K1": { "Z1K1": "Z18", "Z18K1": "Z46803K1" } }, "Z30120K2": [ "Z6030", "Z6033" ], "Z30120K3": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z30120K4": [ "Z6092" ] }, "Z44077K3": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z44077K4": { "Z1K1": "Z7", "Z7K1": "Z850", "Z850K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z29649", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z850K2": "Z36589", "Z850K3": [ "Z6091" ] }, "Z44077K5": { "Z1K1": "Z18", "Z18K1": "Z46803K3" }, "Z44077K6": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z7", "Z7K1": "Z44077", "Z44077K1": { "Z1K1": "Z7", "Z7K1": "Z6820", "Z6820K1": { "Z1K1": "Z7", "Z7K1": "Z17895", "Z17895K1": { "Z1K1": "Z7", "Z7K1": "Z32599", "Z32599K1": { "Z1K1": "Z7", "Z7K1": "Z23756", "Z23756K1": { "Z1K1": "Z18", "Z18K1": "Z46803K1" } }, "Z32599K2": { "Z1K1": "Z6092", "Z6092K1": "P5137" }, "Z32599K3": { "Z1K1": "Z18", "Z18K1": "Z46803K2" } } }, "Z6820K2": [ "Z6030" ], "Z6820K3": [ "Z60" ], "Z6820K4": [ "Z6092" ] }, "Z44077K2": { "Z1K1": "Z7", "Z7K1": "Z30120", "Z30120K1": { "Z1K1": "Z7", "Z7K1": "Z23756", "Z23756K1": { "Z1K1": "Z18", "Z18K1": "Z46803K1" } }, "Z30120K2": [ "Z6030", "Z6033" ], "Z30120K3": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z30120K4": [ "Z6092" ] }, "Z44077K3": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z44077K4": { "Z1K1": "Z7", "Z7K1": "Z850", "Z850K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z29649", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z850K2": "Z36589", "Z850K3": [ "Z6091" ] }, "Z44077K5": { "Z1K1": "Z18", "Z18K1": "Z46803K3" }, "Z44077K6": { "Z1K1": "Z40", "Z40K1": "Z41" } } } } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z19243", "Z19243K1": { "Z1K1": "Z7", "Z7K1": "Z101", "Z101K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z18", "Z18K1": "Z46803K3" }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q24905" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z7", "Z7K1": "Z44077", "Z44077K1": { "Z1K1": "Z7", "Z7K1": "Z6820", "Z6820K1": { "Z1K1": "Z7", "Z7K1": "Z17895", "Z17895K1": { "Z1K1": "Z7", "Z7K1": "Z32599", "Z32599K1": { "Z1K1": "Z7", "Z7K1": "Z23756", "Z23756K1": { "Z1K1": "Z18", "Z18K1": "Z46803K1" } }, "Z32599K2": { "Z1K1": "Z6092", "Z6092K1": "P9970" }, "Z32599K3": { "Z1K1": "Z18", "Z18K1": "Z46803K2" } } }, "Z6820K2": [ "Z6030" ], "Z6820K3": [ "Z60" ], "Z6820K4": [ "Z6092" ] }, "Z44077K2": { "Z1K1": "Z7", "Z7K1": "Z30120", "Z30120K1": { "Z1K1": "Z7", "Z7K1": "Z23756", "Z23756K1": { "Z1K1": "Z18", "Z18K1": "Z46803K1" } }, "Z30120K2": [ "Z6030", "Z6033" ], "Z30120K3": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z30120K4": [ "Z6092" ] }, "Z44077K3": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z44077K4": { "Z1K1": "Z7", "Z7K1": "Z850", "Z850K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z29649", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z850K2": "Z36589", "Z850K3": [ "Z6091" ] }, "Z44077K5": { "Z1K1": "Z18", "Z18K1": "Z46803K3" }, "Z44077K6": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z6825", "Z6825K1": { "Z1K1": "Z7", "Z7K1": "Z44077", "Z44077K1": { "Z1K1": "Z7", "Z7K1": "Z6820", "Z6820K1": { "Z1K1": "Z7", "Z7K1": "Z17895", "Z17895K1": { "Z1K1": "Z7", "Z7K1": "Z32599", "Z32599K1": { "Z1K1": "Z7", "Z7K1": "Z23756", "Z23756K1": { "Z1K1": "Z18", "Z18K1": "Z46803K1" } }, "Z32599K2": { "Z1K1": "Z6092", "Z6092K1": "P5137" }, "Z32599K3": { "Z1K1": "Z18", "Z18K1": "Z46803K2" } } }, "Z6820K2": [ "Z6030" ], "Z6820K3": [ "Z60" ], "Z6820K4": [ "Z6092" ] }, "Z44077K2": { "Z1K1": "Z7", "Z7K1": "Z30120", "Z30120K1": { "Z1K1": "Z7", "Z7K1": "Z23756", "Z23756K1": { "Z1K1": "Z18", "Z18K1": "Z46803K1" } }, "Z30120K2": [ "Z6030", "Z6033" ], "Z30120K3": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z30120K4": [ "Z6092" ] }, "Z44077K3": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z44077K4": { "Z1K1": "Z7", "Z7K1": "Z850", "Z850K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z29649", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z24144", "Z24144K1": { "Z1K1": "Z18", "Z18K1": "Z46803K2" }, "Z24144K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z24144K3": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z850K2": "Z36589", "Z850K3": [ "Z6091" ] }, "Z44077K5": { "Z1K1": "Z18", "Z18K1": "Z46803K3" }, "Z44077K6": { "Z1K1": "Z40", "Z40K1": "Z41" } } } } }, "Z19243K2": { "Z1K1": "Z18", "Z18K1": "Z46803K4" } } } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Word form from lexeme, comp" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 5i2v1u968moo96uoa83wc5nw16vb6rs Z46805 0 100390 330918 2026-10-22T15:52:16Z ReXLer 39813 330918 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46805" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46803", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z46803", "Z46803K1": { "Z1K1": "Z7", "Z7K1": "Z6821", "Z6821K1": { "Z1K1": "Z6091", "Z6091K1": "Q35831" } }, "Z46803K2": "Z1002", "Z46803K3": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q24905" } ], "Z46803K4": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q1392475" } ] }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "slept" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "sleep, en, verb simple past: slept" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 8sf9hneyik5j5pek0d3qyuehdhrzcxj Z46806 0 100391 330920 2026-10-22T16:01:37Z ReXLer 39813 330920 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46806" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46803", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z46803", "Z46803K1": { "Z1K1": "Z7", "Z7K1": "Z6821", "Z6821K1": { "Z1K1": "Z6091", "Z6091K1": "Q6498684" } }, "Z46803K2": "Z1002", "Z46803K3": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q24905" } ], "Z46803K4": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q110786" }, { "Z1K1": "Z6091", "Z6091K1": "Q3910936" }, { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } ] }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "owns" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "own, en, verb, singular, present, 3rd person: owns" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } se5t1furua9e2n6t7hn6al6l2r2lcp1 Z46807 0 100392 330923 2026-10-22T16:27:01Z ReXLer 39813 330923 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46807" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46803", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z46803", "Z46803K1": { "Z1K1": "Z7", "Z7K1": "Z6821", "Z6821K1": { "Z1K1": "Z6091", "Z6091K1": "Q131819891" } }, "Z46803K2": "Z1002", "Z46803K3": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q34698" } ], "Z46803K4": [ "Z6091" ] }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "known" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "notable work, en, adjective: known" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } bvjrx305swsu8mcue3j6lgk6sl8lbg3 Z46808 0 100393 330945 2026-10-22T20:26:01Z Jsamwrites 938 Create native test (la): declining proper noun in the genitive 330945 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46808" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46641", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z10938", "Z10938K1": { "Z1K1": "Z7", "Z7K1": "Z40459", "Z40459K1": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z7", "Z7K1": "Z46641", "Z46641K1": { "Z1K1": "Z6091", "Z6091K1": "Q1065" }, "Z46641K2": { "Z1K1": "Z60", "Z60K1": "la" } }, "Z42101K2": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q128234" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q146233" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } } ] } } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "Nationum Unitarum" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Referring noun phrase for item: Latin United Nations in the genitive, a declining proper noun" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Realizes the phrase with the genitive bound and compares the text exactly." } ] } } bks3o2z1hkmorfh0d94kmagu54uu96o Z46809 0 100394 330948 2026-10-22T20:47:29Z Jsamwrites 938 Create Abstract sentence from semantic predicate 330948 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46809" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z39358", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z39358", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6007" } } }, "Z17K2": "Z46809K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "semantic predicate" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z46809K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "sentence features" } ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z39358", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z39358", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6007" } } } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z46809" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Abstract sentence from semantic predicate" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Pairs the sentence features (polarity, tense, aspect, mood, clause type) with the result of the semantic predicate (predicate phrase, grammatical subject, qualifiers); declarative when no clause type is given. No surface strings." } ] } } 0he8kre33buvc5000phhqtoqh13ql1j 330966 330948 2026-10-22T20:49:33Z Jsamwrites 938 Added Z46810 to the approved list of implementations 330966 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46809" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z39358", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z39358", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6007" } } }, "Z17K2": "Z46809K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "semantic predicate" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z46809K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "sentence features" } ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z39358", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z39358", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6007" } } } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z46810" ], "Z8K5": "Z46809" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Abstract sentence from semantic predicate" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Pairs the sentence features (polarity, tense, aspect, mood, clause type) with the result of the semantic predicate (predicate phrase, grammatical subject, qualifiers); declarative when no clause type is given. No surface strings." } ] } } cjhg3njuty4cp7kcqvxjjj19d08fqjj 330967 330966 2026-10-22T20:49:36Z Jsamwrites 938 Added Z46813, Z46814, Z46815, Z46816, Z46817, Z46818 and Z46819 to the approved list of test cases 330967 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46809" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z39358", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z39358", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6007" } } }, "Z17K2": "Z46809K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "semantic predicate" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z46809K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "sentence features" } ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z39358", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z39358", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6007" } } } }, "Z8K3": [ "Z20", "Z46813", "Z46814", "Z46815", "Z46816", "Z46817", "Z46818", "Z46819" ], "Z8K4": [ "Z14", "Z46810" ], "Z8K5": "Z46809" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Abstract sentence from semantic predicate" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Pairs the sentence features (polarity, tense, aspect, mood, clause type) with the result of the semantic predicate (predicate phrase, grammatical subject, qualifiers); declarative when no clause type is given. No surface strings." } ] } } etkyptcekk1kl8qao7p0lhes9bagapu Z46810 0 100395 330949 2026-10-22T20:47:32Z Jsamwrites 938 Create the implementation of Abstract sentence from semantic predicate 330949 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46810" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z46809", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q109267112" } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q130192655" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46809K2" } } } }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z39358", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z39358", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6007" } } } }, "K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q41796" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46809K2" } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z802K2": { "Z1K1": "Z18", "Z18K1": "Z46809K2" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q41796" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q474328" } }, "Z810K2": { "Z1K1": "Z18", "Z18K1": "Z46809K2" } } }, "K2": { "Z1K1": "Z18", "Z18K1": "Z46809K1" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "The polarity must be affirmative (Q109267112) or negative (Q1478451)", "Abstract sentence from semantic predicate" ] } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Abstract sentence from semantic predicate, composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Pairs the sentence features (polarity, tense, aspect, mood, clause type) with the result of the semantic predicate (predicate phrase, grammatical subject, qualifiers); declarative when no clause type is given. No surface strings." } ] } } 021cqe0c6t2ouufdy5bi27h5fbn16qt Z46811 0 100396 330950 2026-10-22T20:47:35Z Jsamwrites 938 Create Sentence argument assignment 330950 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46811" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z39358", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z39358", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6007" } } } }, "Z17K2": "Z46811K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "abstract sentence" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46811K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z46811" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence argument assignment" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Grammatical roles of an abstract sentence: subject and predicate phrases, then a temporal adverbial for each start, end or point-in-time qualifier. Role order, not surface order." } ] } } ixloutzbq0ynmgjinufs1f402ghggi9 330968 330950 2026-10-22T20:50:07Z Jsamwrites 938 Added Z46812 to the approved list of implementations 330968 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46811" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z39358", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z39358", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6007" } } } }, "Z17K2": "Z46811K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "abstract sentence" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46811K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z46812" ], "Z8K5": "Z46811" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence argument assignment" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Grammatical roles of an abstract sentence: subject and predicate phrases, then a temporal adverbial for each start, end or point-in-time qualifier. Role order, not surface order." } ] } } dwx8eb31uic58f8epaa37zvcnn8jx5g 330969 330968 2026-10-22T20:50:11Z Jsamwrites 938 Added Z46820, Z46821, Z46822, Z46823, Z46824, Z46825 and Z46826 to the approved list of test cases 330969 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46811" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z39358", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z39358", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6007" } } } }, "Z17K2": "Z46811K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "abstract sentence" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46811K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" } }, "Z8K3": [ "Z20", "Z46820", "Z46821", "Z46822", "Z46823", "Z46824", "Z46825", "Z46826" ], "Z8K4": [ "Z14", "Z46812" ], "Z8K5": "Z46811" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence argument assignment" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Grammatical roles of an abstract sentence: subject and predicate phrases, then a temporal adverbial for each start, end or point-in-time qualifier. Role order, not surface order." } ] } } rb7ri5359nxp61n6wtemqwl78sjq63m Z46812 0 100397 330951 2026-10-22T20:47:38Z Jsamwrites 938 Create the implementation of Sentence argument assignment 330951 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46812" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z46811", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" }, "K1": { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, "K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46811K1" } } } } }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" }, "K1": { "Z1K1": "Z6091", "Z6091K1": "Q179080" }, "K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46811K1" } } } }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6007", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" }, "K1": { "Z1K1": "Z6091", "Z6091K1": "Q2403061" }, "K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6007", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P580" }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P582" }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P585" }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } } } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z46811K1" } } } } } } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence argument assignment, composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Grammatical roles of an abstract sentence: subject and predicate phrases, then a temporal adverbial for each start, end or point-in-time qualifier. Role order, not surface order." } ] } } 3t7c4jsg25dwligjgixhnku3d4j9npr Z46813 0 100398 330952 2026-10-22T20:47:41Z Jsamwrites 938 Create native test (en) 330952 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46813" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46809", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z889", "Z889K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6091", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z46809", "Z46809K1": { "Z1K1": "Z7", "Z7K1": "Z46673", "Z46673K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } } }, "K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q142" } ], "K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } }, "K1": { "Z1K1": "Z6092", "Z6092K1": "P31" }, "K2": [ "Z1", { "Z1K1": "Z6091", "Z6091K1": "Q6256" } ] } }, "Z46673K2": [ "Z6007" ], "Z46673K3": [ "Z39328" ], "Z46673K4": { "Z1K1": "Z60", "Z60K1": "en" } }, "Z46809K2": [ "Z39328" ] } } }, "Z889K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q41796" } ], "Z889K3": "Z18683" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z844", "Z844K2": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Abstract sentence from semantic predicate: English France is a country: declarative added when no clause type is given" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the abstract sentence, without surface strings." } ] } } n8237h0uzlymneo4u1pvvu8a828g09u Z46814 0 100399 330953 2026-10-22T20:47:44Z Jsamwrites 938 Create native test (fr) 330953 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46814" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46809", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z889", "Z889K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6091", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z46809", "Z46809K1": { "Z1K1": "Z7", "Z7K1": "Z46673", "Z46673K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } } }, "K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q142" } ], "K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } }, "K1": { "Z1K1": "Z6092", "Z6092K1": "P31" }, "K2": [ "Z1", { "Z1K1": "Z6091", "Z6091K1": "Q6256" } ] } }, "Z46673K2": [ "Z6007" ], "Z46673K3": [ "Z39328" ], "Z46673K4": { "Z1K1": "Z60", "Z60K1": "fr" } }, "Z46809K2": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q130192655" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } } ] } } }, "Z889K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q41796" }, { "Z1K1": "Z6091", "Z6091K1": "Q130192655" } ], "Z889K3": "Z18683" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z844", "Z844K2": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Abstract sentence from semantic predicate: French, negative polarity kept before the added clause type" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the abstract sentence, without surface strings." } ] } } 2t0lnt6w0vcowuvyo3zpmvkbdlb6aom Z46815 0 100400 330954 2026-10-22T20:47:47Z Jsamwrites 938 Create native test (es) 330954 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46815" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46809", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z889", "Z889K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6091", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z46809", "Z46809K1": { "Z1K1": "Z7", "Z7K1": "Z46673", "Z46673K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } } }, "K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q142" } ], "K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } }, "K1": { "Z1K1": "Z6092", "Z6092K1": "P31" }, "K2": [ "Z1", { "Z1K1": "Z6091", "Z6091K1": "Q6256" } ] } }, "Z46673K2": [ "Z6007" ], "Z46673K3": [ "Z39328" ], "Z46673K4": { "Z1K1": "Z60", "Z60K1": "es" } }, "Z46809K2": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q41796" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q474328" } } ] } } }, "Z889K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q41796" } ], "Z889K3": "Z18683" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z844", "Z844K2": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Abstract sentence from semantic predicate: Spanish, a given clause type is kept and not repeated" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the abstract sentence, without surface strings." } ] } } nztrpbzxfpxic0lvj9km2myn63r2kpd Z46816 0 100401 330955 2026-10-22T20:47:50Z Jsamwrites 938 Create native test (la) 330955 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46816" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46809", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z501K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z5K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z24606", "Z24606K1": { "Z1K1": "Z7", "Z7K1": "Z822", "Z822K1": { "Z1K1": "Z7", "Z7K1": "Z823", "Z823K1": { "Z1K1": "Z99", "Z99K1": { "Z1K1": "Z7", "Z7K1": "Z46809", "Z46809K1": { "Z1K1": "Z7", "Z7K1": "Z46673", "Z46673K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } } }, "K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q142" } ], "K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } }, "K1": { "Z1K1": "Z6092", "Z6092K1": "P31" }, "K2": [ "Z1", { "Z1K1": "Z6091", "Z6091K1": "Q6256" } ] } }, "Z46673K2": [ "Z6007" ], "Z46673K3": [ "Z39328" ], "Z46673K4": { "Z1K1": "Z60", "Z60K1": "la" } }, "Z46809K2": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q130192655" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q6256" } } ] } } } }, "Z24606K2": "errors" } } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "The polarity must be affirmative (Q109267112) or negative (Q1478451)" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Abstract sentence from semantic predicate: Latin, a polarity that is neither affirmative nor negative is an explicit error" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the abstract sentence, without surface strings." } ] } } 80uz9xf93y4i6lm1wjalvofsnv15t7u Z46817 0 100402 330956 2026-10-22T20:47:53Z Jsamwrites 938 Create native test (ml) 330956 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46817" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46809", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z46395", "Z46395K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z46809", "Z46809K1": { "Z1K1": "Z7", "Z7K1": "Z46673", "Z46673K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } } }, "K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q142" } ], "K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } }, "K1": { "Z1K1": "Z6092", "Z6092K1": "P31" }, "K2": [ "Z1", { "Z1K1": "Z6091", "Z6091K1": "Q6256" } ] } }, "Z46673K2": [ "Z6007" ], "Z46673K3": [ "Z39328" ], "Z46673K4": { "Z1K1": "Z60", "Z60K1": "ml" } }, "Z46809K2": [ "Z39328" ] } } }, "Z46395K2": [ "Z39328" ], "Z46395K3": [ "Z39328" ] }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "ഒരു രാജ്യമാണ്" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Abstract sentence from semantic predicate: Malayalam France is a country: the predicate phrase is kept unrealized" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the abstract sentence, without surface strings." } ] } } 8kyly4jbyrq9x9hrflmb4n8p7ig98tn Z46818 0 100403 330957 2026-10-22T20:47:56Z Jsamwrites 938 Create native test (es) 330957 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46818" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46809", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z10938", "Z10938K1": { "Z1K1": "Z7", "Z7K1": "Z40459", "Z40459K1": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z46809", "Z46809K1": { "Z1K1": "Z7", "Z7K1": "Z46673", "Z46673K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } } }, "K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q979" } ], "K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } }, "K1": { "Z1K1": "Z6092", "Z6092K1": "P61" }, "K2": [ "Z1", { "Z1K1": "Z6091", "Z6091K1": "Q7186" } ] } }, "Z46673K2": [ "Z6007" ], "Z46673K3": [ "Z39328" ], "Z46673K4": { "Z1K1": "Z60", "Z60K1": "es" } }, "Z46809K2": [ "Z39328" ] } } } }, "Z42101K2": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q128234" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q131105" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } } ] } } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "Marie Curie" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Abstract sentence from semantic predicate: Spanish Marie Curie discovered polonium: the grammatical subject is the agent" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the abstract sentence, without surface strings." } ] } } c7u0rqkpvhihepcc8w6r9loyujg46j8 Z46819 0 100404 330958 2026-10-22T20:47:58Z Jsamwrites 938 Create native test (ig) 330958 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46819" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46809", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z46809", "Z46809K1": { "Z1K1": "Z7", "Z7K1": "Z46673", "Z46673K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } } }, "K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q142" } ], "K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } }, "K1": { "Z1K1": "Z6092", "Z6092K1": "P463" }, "K2": [ "Z1", { "Z1K1": "Z6091", "Z6091K1": "Q1065" } ] } }, "Z46673K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K5" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z18683", "Z18683K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K3" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z18683K2": { "Z1K1": "Z6091", "Z6091K1": "Q1065" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6001K5" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z30120", "Z30120K1": { "Z1K1": "Z6091", "Z6091K1": "Q142" }, "Z30120K2": [ "Z6030", "Z6036" ], "Z30120K3": [ "Z60" ], "Z30120K4": [ "Z6092", { "Z1K1": "Z6092", "Z6092K1": "P463" } ] } } } } }, "Z46673K3": [ "Z39328" ], "Z46673K4": { "Z1K1": "Z60", "Z60K1": "ig" } }, "Z46809K2": [ "Z39328" ] } } } } }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z42" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z41" } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z844", "Z844K2": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Abstract sentence from semantic predicate: Igbo France member of the United Nations: the start-time qualifier is kept" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the abstract sentence, without surface strings." } ] } } 0l8eremvip36est5veo3madeszcipov Z46820 0 100405 330959 2026-10-22T20:48:02Z Jsamwrites 938 Create native test (en) 330959 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46820" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46811", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z889", "Z889K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6091", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z46811", "Z46811K1": { "Z1K1": "Z7", "Z7K1": "Z46809", "Z46809K1": { "Z1K1": "Z7", "Z7K1": "Z46673", "Z46673K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } } }, "K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q142" } ], "K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } }, "K1": { "Z1K1": "Z6092", "Z6092K1": "P463" }, "K2": [ "Z1", { "Z1K1": "Z6091", "Z6091K1": "Q1065" } ] } }, "Z46673K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K5" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z18683", "Z18683K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K3" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z18683K2": { "Z1K1": "Z6091", "Z6091K1": "Q1065" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6001K5" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z30120", "Z30120K1": { "Z1K1": "Z6091", "Z6091K1": "Q142" }, "Z30120K2": [ "Z6030", "Z6036" ], "Z30120K3": [ "Z60" ], "Z30120K4": [ "Z6092", { "Z1K1": "Z6092", "Z6092K1": "P463" } ] } } } } }, "Z46673K3": [ "Z39328" ], "Z46673K4": { "Z1K1": "Z60", "Z60K1": "en" } }, "Z46809K2": [ "Z39328" ] }, "Z46811K2": { "Z1K1": "Z60", "Z60K1": "en" } } }, "Z889K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, { "Z1K1": "Z6091", "Z6091K1": "Q179080" }, { "Z1K1": "Z6091", "Z6091K1": "Q2403061" } ], "Z889K3": "Z18683" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z844", "Z844K2": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence argument assignment: English France member of the United Nations since 1945: subject, predicate, temporal adverbial" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the grammatical roles, without surface strings." } ] } } fhm6utiktcqgz4j3p1jk2cr2qns0u3f Z46821 0 100406 330960 2026-10-22T20:48:05Z Jsamwrites 938 Create native test (fr) 330960 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46821" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46811", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z889", "Z889K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6091", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z46811", "Z46811K1": { "Z1K1": "Z7", "Z7K1": "Z46809", "Z46809K1": { "Z1K1": "Z7", "Z7K1": "Z46673", "Z46673K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } } }, "K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q142" } ], "K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } }, "K1": { "Z1K1": "Z6092", "Z6092K1": "P31" }, "K2": [ "Z1", { "Z1K1": "Z6091", "Z6091K1": "Q6256" } ] } }, "Z46673K2": [ "Z6007" ], "Z46673K3": [ "Z39328" ], "Z46673K4": { "Z1K1": "Z60", "Z60K1": "fr" } }, "Z46809K2": [ "Z39328" ] }, "Z46811K2": { "Z1K1": "Z60", "Z60K1": "fr" } } }, "Z889K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, { "Z1K1": "Z6091", "Z6091K1": "Q179080" } ], "Z889K3": "Z18683" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z844", "Z844K2": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence argument assignment: French France is a country, no qualifier: subject and predicate" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the grammatical roles, without surface strings." } ] } } sa9amlu5jyy6umozz8yrdxmgv91l34m Z46822 0 100407 330961 2026-10-22T20:48:08Z Jsamwrites 938 Create native test (es) 330961 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46822" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46811", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z10938", "Z10938K1": { "Z1K1": "Z7", "Z7K1": "Z40459", "Z40459K1": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q164573" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z46811", "Z46811K1": { "Z1K1": "Z7", "Z7K1": "Z46809", "Z46809K1": { "Z1K1": "Z7", "Z7K1": "Z46673", "Z46673K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } } }, "K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q979" } ], "K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } }, "K1": { "Z1K1": "Z6092", "Z6092K1": "P61" }, "K2": [ "Z1", { "Z1K1": "Z6091", "Z6091K1": "Q7186" } ] } }, "Z46673K2": [ "Z6007" ], "Z46673K3": [ "Z39328" ], "Z46673K4": { "Z1K1": "Z60", "Z60K1": "es" } }, "Z46809K2": [ "Z39328" ] }, "Z46811K2": { "Z1K1": "Z60", "Z60K1": "es" } } } } }, "Z42101K2": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q128234" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q131105" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } } ] } } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "Marie Curie" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence argument assignment: Spanish discovery: the subject role holds the agent, Marie Curie" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the grammatical roles, without surface strings." } ] } } 1jq8zkq9o6blqwl36vi2f4f0peqe0za Z46823 0 100408 330962 2026-10-22T20:48:10Z Jsamwrites 938 Create native test (la) 330962 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46823" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46811", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z10938", "Z10938K1": { "Z1K1": "Z7", "Z7K1": "Z40459", "Z40459K1": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q164573" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z46811", "Z46811K1": { "Z1K1": "Z7", "Z7K1": "Z46809", "Z46809K1": { "Z1K1": "Z7", "Z7K1": "Z46673", "Z46673K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } } }, "K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q142" } ], "K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } }, "K1": { "Z1K1": "Z6092", "Z6092K1": "P463" }, "K2": [ "Z1", { "Z1K1": "Z6091", "Z6091K1": "Q1065" } ] } }, "Z46673K2": [ "Z6007" ], "Z46673K3": [ "Z39328" ], "Z46673K4": { "Z1K1": "Z60", "Z60K1": "la" } }, "Z46809K2": [ "Z39328" ] }, "Z46811K2": { "Z1K1": "Z60", "Z60K1": "la" } } } } }, "Z42101K2": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q128234" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q131105" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } } ] } } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "Gallia" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence argument assignment: Latin France member of the United Nations: the subject role holds Gallia" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the grammatical roles, without surface strings." } ] } } r11v5vpdradv7x5ehjyc3w5wqcn7od3 Z46824 0 100409 330963 2026-10-22T20:48:13Z Jsamwrites 938 Create native test (ml) 330963 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46824" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46811", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q2403061" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z46811", "Z46811K1": { "Z1K1": "Z7", "Z7K1": "Z46809", "Z46809K1": { "Z1K1": "Z7", "Z7K1": "Z46673", "Z46673K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } } }, "K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q142" } ], "K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } }, "K1": { "Z1K1": "Z6092", "Z6092K1": "P463" }, "K2": [ "Z1", { "Z1K1": "Z6091", "Z6091K1": "Q1065" } ] } }, "Z46673K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K5" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6003", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z18683", "Z18683K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6003K3" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z18683K2": { "Z1K1": "Z6091", "Z6091K1": "Q1065" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6001K5" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z30120", "Z30120K1": { "Z1K1": "Z6091", "Z6091K1": "Q142" }, "Z30120K2": [ "Z6030", "Z6036" ], "Z30120K3": [ "Z60" ], "Z30120K4": [ "Z6092", { "Z1K1": "Z6092", "Z6092K1": "P463" } ] } } } } }, "Z46673K3": [ "Z39328" ], "Z46673K4": { "Z1K1": "Z60", "Z60K1": "ml" } }, "Z46809K2": [ "Z39328" ] }, "Z46811K2": { "Z1K1": "Z60", "Z60K1": "ml" } } } } } } }, "Z866K2": "P580" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z844", "Z844K2": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence argument assignment: Malayalam membership since 1945: the temporal adverbial holds the start-time qualifier" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the grammatical roles, without surface strings." } ] } } cotqr5tzqyahyvdt00k89135g9nm629 Z46825 0 100410 330964 2026-10-22T20:48:16Z Jsamwrites 938 Create native test (ig) 330964 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46825" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46811", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z889", "Z889K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6091", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z46811", "Z46811K1": { "Z1K1": "Z7", "Z7K1": "Z46809", "Z46809K1": { "Z1K1": "Z7", "Z7K1": "Z46673", "Z46673K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } } }, "K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q142" } ], "K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } }, "K1": { "Z1K1": "Z6092", "Z6092K1": "P463" }, "K2": [ "Z1", { "Z1K1": "Z6091", "Z6091K1": "Q1065" } ] } }, "Z46673K2": [ "Z6007", { "Z1K1": "Z6007", "Z6007K1": { "Z1K1": "Z6092", "Z6092K1": "P805" }, "Z6007K2": { "Z1K1": "Z6091", "Z6091K1": "Q1065" }, "Z6007K3": { "Z1K1": "Z6020", "Z6020K1": "Z6021" } } ], "Z46673K3": [ "Z39328" ], "Z46673K4": { "Z1K1": "Z60", "Z60K1": "ig" } }, "Z46809K2": [ "Z39328" ] }, "Z46811K2": { "Z1K1": "Z60", "Z60K1": "ig" } } }, "Z889K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, { "Z1K1": "Z6091", "Z6091K1": "Q179080" } ], "Z889K3": "Z18683" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z844", "Z844K2": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence argument assignment: Igbo, a qualifier that is not a time (P805) is not a sentence constituent" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the grammatical roles, without surface strings." } ] } } 3ocktfmjxympffhu7m2rqi0cnv2h1ur Z46826 0 100411 330965 2026-10-22T20:48:19Z Jsamwrites 938 Create native test (dag) 330965 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46826" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46811", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z46395", "Z46395K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q179080" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z46811", "Z46811K1": { "Z1K1": "Z7", "Z7K1": "Z46809", "Z46809K1": { "Z1K1": "Z7", "Z7K1": "Z46673", "Z46673K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } } }, "K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q142" } ], "K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } }, "K1": { "Z1K1": "Z6092", "Z6092K1": "P31" }, "K2": [ "Z1", { "Z1K1": "Z6091", "Z6091K1": "Q6256" } ] } }, "Z46673K2": [ "Z6007" ], "Z46673K3": [ "Z39328" ], "Z46673K4": { "Z1K1": "Z60", "Z60K1": "dag" } }, "Z46809K2": [ "Z39328" ] }, "Z46811K2": { "Z1K1": "Z60", "Z60K1": "dag" } } } } }, "Z46395K2": [ "Z39328" ], "Z46395K3": [ "Z39328" ] }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "nyɛla tingbani" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence argument assignment: Dagbani France is a country: the predicate role holds the predicate phrase" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the grammatical roles, without surface strings." } ] } } frn67hlca68ldi9c58gnwdubk0la40q Z46827 0 100412 330984 2026-10-23T00:35:11Z Jsamwrites 938 Create Temporal adverbial language options 330984 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46827" }, "Z2K2": { "Z1K1": "Z14294", "Z14294K1": [ "Z14293", { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6007", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P580" }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "since ", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z13518K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20159K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20420K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6061K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6064K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } } } } }, "Z10000K2": "" }, "K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P582" }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "until ", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z13518K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20159K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20420K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6061K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6064K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } } } } }, "Z10000K2": "" }, "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P585" }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "in ", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z13518K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20159K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20420K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6061K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6064K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } } } } }, "Z10000K2": "" }, "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "No temporal adverbial is defined for this qualifier in this language", "Temporal adverbial language options" ] } } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1002" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6007", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P580" }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "depuis ", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z13518K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20159K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20420K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6061K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6064K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } } } } }, "Z10000K2": "" }, "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P582" }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "jusqu'en ", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z13518K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20159K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20420K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6061K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6064K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } } } } }, "Z10000K2": "" }, "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P585" }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "en ", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z13518K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20159K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20420K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6061K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6064K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } } } } }, "Z10000K2": "" }, "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "No temporal adverbial is defined for this qualifier in this language", "Temporal adverbial language options" ] } } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1004" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6007", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P580" }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "desde ", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z13518K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20159K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20420K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6061K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6064K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } } } } }, "Z10000K2": "" }, "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P582" }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "hasta ", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z13518K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20159K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20420K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6061K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6064K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } } } } }, "Z10000K2": "" }, "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P585" }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "en ", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z13518K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20159K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20420K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6061K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6064K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } } } } }, "Z10000K2": "" }, "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "No temporal adverbial is defined for this qualifier in this language", "Temporal adverbial language options" ] } } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1003" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6007", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P580" }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "ab anno ", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z11022", "Z11022K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20159K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20420K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6061K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6064K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } } } } }, "Z10000K2": "" }, "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P582" }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "usque ad annum ", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z11022", "Z11022K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20159K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20420K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6061K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6064K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } } } } }, "Z10000K2": "" }, "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P585" }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "anno ", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z11022", "Z11022K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20159K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20420K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6061K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6064K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } } } } }, "Z10000K2": "" }, "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "No temporal adverbial is defined for this qualifier in this language", "Temporal adverbial language options" ] } } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1403" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6007", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P580" }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z13518K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20159K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20420K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6061K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6064K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } } } } }, "Z10000K2": " മുതൽ" }, "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P582" }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z13518K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20159K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20420K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6061K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6064K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } } } } }, "Z10000K2": " വരെ" }, "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P585" }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z13518K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20159K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20420K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6061K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6064K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } } } } }, "Z10000K2": "-ൽ" }, "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "No temporal adverbial is defined for this qualifier in this language", "Temporal adverbial language options" ] } } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1012" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6007", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P580" }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "kemgbe ", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z13518K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20159K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20420K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6061K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6064K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } } } } }, "Z10000K2": "" }, "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P582" }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "ruo afọ ", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z13518K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20159K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20420K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6061K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6064K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } } } } }, "Z10000K2": "" }, "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P585" }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "na ", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z13518K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20159K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20420K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6061K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6064K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } } } } }, "Z10000K2": "" }, "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "No temporal adverbial is defined for this qualifier in this language", "Temporal adverbial language options" ] } } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1014" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6007", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P580" }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "binshɛli ", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z13518K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20159K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20420K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6061K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6064K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } } } } }, "Z10000K2": "" }, "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P582" }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "hal yuuni ", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z13518K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20159K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20420K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6061K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6064K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } } } } }, "Z10000K2": "" }, "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P585" }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": "yuuni ", "Z10000K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z13518K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20159K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z20420K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6061K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6064K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } } } } }, "Z10000K2": " ni" }, "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "No temporal adverbial is defined for this qualifier in this language", "Temporal adverbial language options" ] } } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1015" ] } ], "Z14294K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6007", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "No temporal adverbial is defined for this qualifier in this language", "Temporal adverbial language options" ] } } ], "Z8K5": "Z8" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Temporal adverbial language options" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Adverbial text and predicate requests for a start time, end time or point-in-time qualifier: en since / until / in, fr depuis / jusqu'en / en, es desde / hasta / en, la ab anno / usque ad annum / anno (Roman year), ml മുതൽ / വരെ / -ൽ, ig kemgbe / ruo afọ / na, dag binshɛli / hal yuuni / yuuni … ni." } ] } } avtfwy30bjsfjtd7dfdvgeyizvjq3b8 Z46828 0 100413 330985 2026-10-23T00:35:15Z Jsamwrites 938 Create Sentence tense language options 330985 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46828" }, "Z2K2": { "Z1K1": "Z14294", "Z14294K1": [ "Z14293", { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q192613" } }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q3910936" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q690940" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } } ], "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1562262" } }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1392475" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q690940" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } } ], "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1392475" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q690940" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } } ], "K2": [ "Z6091" ] } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "No grammar is defined for this tense in this language", "Sentence tense language options" ] } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1002" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q192613" } }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q192613" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q184932" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q682111" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q690940" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } } ], "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1562262" } }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q108524486" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q184932" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q682111" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q690940" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } } ], "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q192613" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q184932" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q682111" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q690940" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } } ], "K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } ] } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "No grammar is defined for this tense in this language", "Sentence tense language options" ] } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1004" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q192613" } }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q192613" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q184932" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q682111" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q690940" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } } ], "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1562262" } }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q12547192" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q690940" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } } ], "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q442485" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q184932" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q682111" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q690940" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } } ], "K2": [ "Z6091" ] } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "No grammar is defined for this tense in this language", "Sentence tense language options" ] } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1003" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q192613" } }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q211101" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1317831" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q192613" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q184932" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q682111" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q690940" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } } ], "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1562262" } }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q211101" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1317831" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q12547192" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q184932" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q682111" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q690940" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } } ], "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q211101" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1317831" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q192613" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q184932" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q682111" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q690940" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q51929074" } } ], "K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q1240211" } ] } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "No grammar is defined for this tense in this language", "Sentence tense language options" ] } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1403" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q192613" } }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": [ "Z39328" ], "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1562262" } }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1392475" } } ], "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1392475" } } ], "K2": [ "Z6091" ] } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "No grammar is defined for this tense in this language", "Sentence tense language options" ] } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1012" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q192613" } }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": [ "Z39328" ], "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1562262" } }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": [ "Z39328" ], "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } } ], "K2": [ "Z6091" ] } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "No grammar is defined for this tense in this language", "Sentence tense language options" ] } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1014" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q192613" } }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": [ "Z39328" ], "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1562262" } }, "Z802K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } } ], "K2": [ "Z6091" ] }, "Z802K3": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "K1": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } } ], "K2": [ "Z6091" ] } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "No grammar is defined for this tense in this language", "Sentence tense language options" ] } } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1015" ] } ], "Z14294K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "No grammar is defined for this tense in this language", "Sentence tense language options" ] } } ], "Z8K5": "Z8" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence tense language options" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Predicate grammar for the sentence tense and the predicate's lexical aspect: present; past of a state (imperfect: comptait, tenía, habebat) or of an event (a découvert, descubrió, invenit)." } ] } } ly2khlpdnitoqfs736dp969qc9vgjop Z46829 0 100414 330986 2026-10-23T01:12:49Z Jsamwrites 938 Create Sentence phrase assembly 330986 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46829" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" } }, "Z17K2": "Z46829K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "roles" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46829K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z46829K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "sentence features" } ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z46829" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence phrase assembly" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Predicate with negation and the requests of the tense and of the temporal adverbials; grammar from the sentence tense (given, else past for an end time or a point in time) and the predicate's lexical aspect; temporal adverbials as text. Role order kept." } ] } } s0py995evorqrt725ec80p58nlgudmw 331006 330986 2026-10-23T02:11:25Z Jsamwrites 938 Added Z46830 to the approved list of implementations 331006 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46829" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" } }, "Z17K2": "Z46829K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "roles" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46829K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z46829K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "sentence features" } ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z46830" ], "Z8K5": "Z46829" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence phrase assembly" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Predicate with negation and the requests of the tense and of the temporal adverbials; grammar from the sentence tense (given, else past for an end time or a point in time) and the predicate's lexical aspect; temporal adverbials as text. Role order kept." } ] } } g0g4xf37hg2fs5vm7n52ccszvifgtj3 331007 331006 2026-10-23T02:11:29Z Jsamwrites 938 Added Z46833, Z46834, Z46835, Z46836, Z46837, Z46838 and Z46839 to the approved list of test cases 331007 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46829" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" } }, "Z17K2": "Z46829K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "roles" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46829K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z46829K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "sentence features" } ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" } }, "Z8K3": [ "Z20", "Z46833", "Z46834", "Z46835", "Z46836", "Z46837", "Z46838", "Z46839" ], "Z8K4": [ "Z14", "Z46830" ], "Z8K5": "Z46829" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence phrase assembly" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Predicate with negation and the requests of the tense and of the temporal adverbials; grammar from the sentence tense (given, else past for an end time or a point in time) and the predicate's lexical aspect; temporal adverbials as text. Role order kept." } ] } } ouzktsdtr98mg6suwf4h5jgrfezfqh1 Z46830 0 100415 330987 2026-10-23T01:12:52Z Jsamwrites 938 Create the implementation of Sentence phrase assembly 330987 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46830" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z46829", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K24", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" }, "Z17K2": "Z8K25", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39358", "Z17K2": "Z8K21", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" }, "Z17K2": "Z8K22", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z1", "Z17K2": "Z8K23", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" }, "K1": { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, "K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z1", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q164573" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46829K1" } } } } }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z810", "Z810K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" }, "K1": { "Z1K1": "Z6091", "Z6091K1": "Q179080" }, "K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z39358", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" } }, "K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z39346", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q130192655" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46829K3" } } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46392", "Z46392K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z876", "Z876K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z12767", "Z12767K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z12767K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } ], "Z8K5": "Z8" }, "Z876K2": { "Z1K1": "Z18", "Z18K1": "Z8K22" }, "Z876K3": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K23" } } } }, "Z802K2": { "Z1K1": "Z18", "Z18K1": "Z8K21" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z39360", "Z39360K1": { "Z1K1": "Z7", "Z7K1": "Z39362", "Z39362K1": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z18", "Z18K1": "Z8K21" }, "Z42101K2": [ "Z39328" ] } }, "Z39360K2": { "Z1K1": "Z7", "Z7K1": "Z39368", "Z39368K1": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z18", "Z18K1": "Z8K21" }, "Z42101K2": [ "Z39328" ] } }, "Z39360K3": { "Z1K1": "Z7", "Z7K1": "Z39371", "Z39371K1": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z18", "Z18K1": "Z8K21" }, "Z42101K2": [ "Z39328" ] } }, "Z39360K4": { "Z1K1": "Z7", "Z7K1": "Z38860", "Z38860K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z18", "Z18K1": "Z8K21" }, "Z42101K2": [ "Z39328" ] } }, "Z38860K2": { "Z1K1": "Z6091", "Z6091K1": "Q4147654" }, "Z38860K3": [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z12767" } }, { "Z1K1": "Z38548", "Z38548K1": { "Z1K1": "Z7", "Z7K1": "Z38672", "Z38672K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z18", "Z18K1": "Z8K21" }, "Z42101K2": [ "Z39328" ] } }, "Z38672K2": { "Z1K1": "Z6091", "Z6091K1": "Q4147654" } } }, { "Z1K1": "Z7", "Z7K1": "Z12767", "Z12767K1": { "Z1K1": "Z7", "Z7K1": "Z876", "Z876K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z12767", "Z12767K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z12767K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } ], "Z8K5": "Z8" }, "Z876K2": { "Z1K1": "Z18", "Z18K1": "Z8K22" }, "Z876K3": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K23" } } }, "Z12767K2": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z39346", "Z873K2": [ "Z39328" ] } } ] } } }, "Z46392K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" }, "Z46392K3": [ "Z39328" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z876", "Z876K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z12767", "Z12767K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z12767K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } ], "Z8K5": "Z8" }, "Z876K2": { "Z1K1": "Z18", "Z18K1": "Z8K22" }, "Z876K3": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K23" } } } }, "Z802K2": { "Z1K1": "Z18", "Z18K1": "Z8K21" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z39360", "Z39360K1": { "Z1K1": "Z7", "Z7K1": "Z39362", "Z39362K1": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z18", "Z18K1": "Z8K21" }, "Z42101K2": [ "Z39328" ] } }, "Z39360K2": { "Z1K1": "Z7", "Z7K1": "Z39368", "Z39368K1": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z18", "Z18K1": "Z8K21" }, "Z42101K2": [ "Z39328" ] } }, "Z39360K3": { "Z1K1": "Z7", "Z7K1": "Z39371", "Z39371K1": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z18", "Z18K1": "Z8K21" }, "Z42101K2": [ "Z39328" ] } }, "Z39360K4": { "Z1K1": "Z7", "Z7K1": "Z38860", "Z38860K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z18", "Z18K1": "Z8K21" }, "Z42101K2": [ "Z39328" ] } }, "Z38860K2": { "Z1K1": "Z6091", "Z6091K1": "Q4147654" }, "Z38860K3": [ "Z1", { "Z1K1": "Z96", "Z96K1": { "Z1K1": "Z6", "Z6K1": "Z12767" } }, { "Z1K1": "Z38548", "Z38548K1": { "Z1K1": "Z7", "Z7K1": "Z38672", "Z38672K1": { "Z1K1": "Z7", "Z7K1": "Z39375", "Z39375K1": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z18", "Z18K1": "Z8K21" }, "Z42101K2": [ "Z39328" ] } }, "Z38672K2": { "Z1K1": "Z6091", "Z6091K1": "Q4147654" } } }, { "Z1K1": "Z7", "Z7K1": "Z12767", "Z12767K1": { "Z1K1": "Z7", "Z7K1": "Z876", "Z876K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z12767", "Z12767K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z12767K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } ], "Z8K5": "Z8" }, "Z876K2": { "Z1K1": "Z18", "Z18K1": "Z8K22" }, "Z876K3": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K23" } } }, "Z12767K2": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z39346", "Z873K2": [ "Z39328" ] } } ] } } } }, "K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K23" } } } }, "Z810K2": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" } }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" }, "K1": { "Z1K1": "Z6091", "Z6091K1": "Q2403061" }, "K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z18", "Z18K1": "Z8K22" } } } } } ], "Z8K5": "Z8" }, "Z8K21": { "Z1K1": "Z18", "Z18K1": "Z8K24" }, "Z8K22": { "Z1K1": "Z18", "Z18K1": "Z8K25" }, "Z8K23": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z7", "Z7K1": "Z14310", "Z14310K1": "Z46828", "Z14310K2": { "Z1K1": "Z18", "Z18K1": "Z46829K2" } }, "K1": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q177691" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46829K3" } } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6007", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P582" }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6092K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z6007K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z866K2": "P585" }, "Z802K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z802K3": { "Z1K1": "Z40", "Z40K1": "Z42" } } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z1", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q2403061" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46829K1" } } } } }, "Z802K2": { "Z1K1": "Z6091", "Z6091K1": "Q192613" }, "Z802K3": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q177691" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46829K3" } } } } }, "K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z813", "Z813K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1975539" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z39371", "Z39371K1": { "Z1K1": "Z18", "Z18K1": "Z8K24" } } } }, "Z802K2": { "Z1K1": "Z6091", "Z6091K1": "Q935221" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z39346", "Z39346K1": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z39328", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z39342", "Z39342K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q1975539" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z7", "Z7K1": "Z39371", "Z39371K1": { "Z1K1": "Z18", "Z18K1": "Z8K24" } } } } } } } } } ], "Z8K5": "Z8" }, "Z8K24": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z1", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q179080" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46829K1" } } } }, "Z8K25": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6007", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z1", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z7", "Z7K1": "Z14310", "Z14310K1": "Z46827", "Z14310K2": { "Z1K1": "Z18", "Z18K1": "Z46829K2" } }, "K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z1", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z872", "Z872K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q2403061" } } } ], "Z8K5": "Z8" }, "Z872K2": { "Z1K1": "Z18", "Z18K1": "Z46829K1" } } } } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence phrase assembly, composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Predicate with negation and the requests of the tense and of the temporal adverbials; grammar from the sentence tense (given, else past for an end time or a point in time) and the predicate's lexical aspect; temporal adverbials as text. Role order kept." } ] } } k0yyofvy4zq58awbsqas0vudckndnl6 Z46831 0 100416 330988 2026-10-23T01:12:55Z Jsamwrites 938 Create Sentence agreement and morphology 330988 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46831" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" } }, "Z17K2": "Z46831K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "roles" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46831K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z46831K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "sentence features" } ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z46831" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence agreement and morphology" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "One string per role, in the given order: subject nominative singular, predicate realized with its grammar, temporal adverbial as given." } ] } } a05nhf76sy3f3kddsto672ahnoso3pi 331008 330988 2026-10-23T02:12:03Z Jsamwrites 938 Added Z46832 to the approved list of implementations 331008 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46831" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" } }, "Z17K2": "Z46831K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "roles" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46831K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z46831K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "sentence features" } ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z46832" ], "Z8K5": "Z46831" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence agreement and morphology" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "One string per role, in the given order: subject nominative singular, predicate realized with its grammar, temporal adverbial as given." } ] } } 158okf1ujnzhckr1bk6ufn8qrun4hk4 331009 331008 2026-10-23T02:12:06Z Jsamwrites 938 Added Z46840, Z46841, Z46842, Z46843, Z46844, Z46845 and Z46846 to the approved list of test cases 331009 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46831" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" } }, "Z17K2": "Z46831K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "roles" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46831K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z39328" }, "Z17K2": "Z46831K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "sentence features" } ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6" }, "Z8K3": [ "Z20", "Z46840", "Z46841", "Z46842", "Z46843", "Z46844", "Z46845", "Z46846" ], "Z8K4": [ "Z14", "Z46832" ], "Z8K5": "Z46831" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence agreement and morphology" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "One string per role, in the given order: subject nominative singular, predicate realized with its grammar, temporal adverbial as given." } ] } } 0l4be1hduh21r6n6m6l6n6f66jn0g4s Z46832 0 100417 330989 2026-10-23T01:12:58Z Jsamwrites 938 Create the implementation of Sentence agreement and morphology 330989 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46832" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z46831", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q164573" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z10938", "Z10938K1": { "Z1K1": "Z7", "Z7K1": "Z40459", "Z40459K1": { "Z1K1": "Z7", "Z7K1": "Z42101", "Z42101K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z42101K2": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q128234" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q131105" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q104083" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q110786" } } ] } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q179080" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z46395", "Z46395K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z46395K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } }, "Z46395K3": [ "Z39328" ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q2403061" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "The role is not subject, predicate or temporal adverbial", "Sentence agreement and morphology" ] } } } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z18", "Z18K1": "Z46831K1" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence agreement and morphology, composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "One string per role, in the given order: subject nominative singular, predicate realized with its grammar, temporal adverbial as given." } ] } } s3ptf0dmtc44caktpdykl3v5l4lbbkf Z46833 0 100418 330990 2026-10-23T01:13:01Z Jsamwrites 938 Create native test (fr) 330990 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46833" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46829", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z812", "Z812K1": { "Z1K1": "Z7", "Z7K1": "Z812", "Z812K1": { "Z1K1": "Z7", "Z7K1": "Z46829", "Z46829K1": { "Z1K1": "Z7", "Z7K1": "Z46811", "Z46811K1": { "Z1K1": "Z7", "Z7K1": "Z46809", "Z46809K1": { "Z1K1": "Z7", "Z7K1": "Z46673", "Z46673K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } } }, "K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q142" } ], "K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } }, "K1": { "Z1K1": "Z6092", "Z6092K1": "P463" }, "K2": [ "Z1", { "Z1K1": "Z6091", "Z6091K1": "Q1065" } ] } }, "Z46673K2": [ "Z6007", { "Z1K1": "Z6007", "Z6007K1": { "Z1K1": "Z6092", "Z6092K1": "P580" }, "Z6007K2": { "Z1K1": "Z6064", "Z6064K1": { "Z1K1": "Z6061", "Z6061K1": { "Z1K1": "Z20420", "Z20420K1": { "Z1K1": "Z20159", "Z20159K1": "Z17814", "Z20159K2": { "Z1K1": "Z13518", "Z13518K1": "1945" } }, "Z20420K2": { "Z1K1": "Z20342", "Z20342K1": { "Z1K1": "Z16098", "Z16098K1": "Z16110" }, "Z20342K2": { "Z1K1": "Z13518", "Z13518K1": "24" } } }, "Z6061K2": { "Z1K1": "Z6060", "Z6060K1": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6060K2": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6060K3": { "Z1K1": "Z13518", "Z13518K1": "0" } } }, "Z6064K2": { "Z1K1": "Z6062", "Z6062K1": { "Z1K1": "Z6091", "Z6091K1": "Q573" } }, "Z6064K3": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6064K4": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6064K5": { "Z1K1": "Z16683", "Z16683K1": "Z16661", "Z16683K2": { "Z1K1": "Z13518", "Z13518K1": "0" } }, "Z6064K6": { "Z1K1": "Z6063", "Z6063K1": { "Z1K1": "Z6091", "Z6091K1": "Q1985727" } } }, "Z6007K3": { "Z1K1": "Z6020", "Z6020K1": "Z6021" } }, { "Z1K1": "Z6007", "Z6007K1": { "Z1K1": "Z6092", "Z6092K1": "P805" }, "Z6007K2": { "Z1K1": "Z6091", "Z6091K1": "Q5478323" }, "Z6007K3": { "Z1K1": "Z6020", "Z6020K1": "Z6021" } } ], "Z46673K3": [ "Z39328" ], "Z46673K4": { "Z1K1": "Z60", "Z60K1": "fr" } }, "Z46809K2": [ "Z39328" ] }, "Z46811K2": { "Z1K1": "Z60", "Z60K1": "fr" } }, "Z46829K2": { "Z1K1": "Z60", "Z60K1": "fr" }, "Z46829K3": [ "Z39328" ] } } } } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "depuis 1945" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence phrase assembly: French member since 1945: the start time gives depuis 1945" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the assembled roles, before realization." } ] } } o0vy2rn4vymfa4evx0rlj50m3mv1hl4 Z46834 0 100419 330991 2026-10-23T01:13:04Z Jsamwrites 938 Create native test (la) 330991 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46834" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46829", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z812", "Z812K1": { "Z1K1": "Z7", "Z7K1": "Z812", "Z812K1": { "Z1K1": "Z7", "Z7K1": "Z46829", "Z46829K1": { "Z1K1": "Z7", "Z7K1": "Z46811", "Z46811K1": { "Z1K1": "Z7", "Z7K1": "Z46809", "Z46809K1": { "Z1K1": "Z7", "Z7K1": "Z46673", "Z46673K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } } }, "K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q142" } ], "K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } }, "K1": { "Z1K1": "Z6092", "Z6092K1": "P463" }, "K2": [ "Z1", { "Z1K1": "Z6091", "Z6091K1": "Q1065" } ] } }, "Z46673K2": [ "Z6007", { "Z1K1": "Z6007", "Z6007K1": { "Z1K1": "Z6092", "Z6092K1": "P580" }, "Z6007K2": { "Z1K1": "Z6064", "Z6064K1": { "Z1K1": "Z6061", "Z6061K1": { "Z1K1": "Z20420", "Z20420K1": { "Z1K1": "Z20159", "Z20159K1": "Z17814", "Z20159K2": { "Z1K1": "Z13518", "Z13518K1": "1945" } }, "Z20420K2": { "Z1K1": "Z20342", "Z20342K1": { "Z1K1": "Z16098", "Z16098K1": "Z16110" }, "Z20342K2": { "Z1K1": "Z13518", "Z13518K1": "24" } } }, "Z6061K2": { "Z1K1": "Z6060", "Z6060K1": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6060K2": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6060K3": { "Z1K1": "Z13518", "Z13518K1": "0" } } }, "Z6064K2": { "Z1K1": "Z6062", "Z6062K1": { "Z1K1": "Z6091", "Z6091K1": "Q573" } }, "Z6064K3": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6064K4": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6064K5": { "Z1K1": "Z16683", "Z16683K1": "Z16661", "Z16683K2": { "Z1K1": "Z13518", "Z13518K1": "0" } }, "Z6064K6": { "Z1K1": "Z6063", "Z6063K1": { "Z1K1": "Z6091", "Z6091K1": "Q1985727" } } }, "Z6007K3": { "Z1K1": "Z6020", "Z6020K1": "Z6021" } }, { "Z1K1": "Z6007", "Z6007K1": { "Z1K1": "Z6092", "Z6092K1": "P805" }, "Z6007K2": { "Z1K1": "Z6091", "Z6091K1": "Q5478323" }, "Z6007K3": { "Z1K1": "Z6020", "Z6020K1": "Z6021" } } ], "Z46673K3": [ "Z39328" ], "Z46673K4": { "Z1K1": "Z60", "Z60K1": "la" } }, "Z46809K2": [ "Z39328" ] }, "Z46811K2": { "Z1K1": "Z60", "Z60K1": "la" } }, "Z46829K2": { "Z1K1": "Z60", "Z60K1": "la" }, "Z46829K3": [ "Z39328" ] } } } } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "ab anno MCMXLV" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence phrase assembly: Latin member since 1945: ab anno with the year in Roman numerals" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the assembled roles, before realization." } ] } } bb5au9h1y0f2ogv7oh0jes2nos5rzp6 Z46835 0 100420 330992 2026-10-23T01:13:08Z Jsamwrites 938 Create native test (ml) 330992 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46835" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46829", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z812", "Z812K1": { "Z1K1": "Z7", "Z7K1": "Z812", "Z812K1": { "Z1K1": "Z7", "Z7K1": "Z46829", "Z46829K1": { "Z1K1": "Z7", "Z7K1": "Z46811", "Z46811K1": { "Z1K1": "Z7", "Z7K1": "Z46809", "Z46809K1": { "Z1K1": "Z7", "Z7K1": "Z46673", "Z46673K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } } }, "K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q90" } ], "K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } }, "K1": { "Z1K1": "Z6092", "Z6092K1": "P1082" }, "K2": [ "Z1", { "Z1K1": "Z6010", "Z6010K1": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "2103778" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "1" } }, "Z6010K2": "Z24", "Z6010K3": "Z24", "Z6010K4": { "Z1K1": "Z6091", "Z6091K1": "Q199" } } ] } }, "Z46673K2": [ "Z6007", { "Z1K1": "Z6007", "Z6007K1": { "Z1K1": "Z6092", "Z6092K1": "P585" }, "Z6007K2": { "Z1K1": "Z6064", "Z6064K1": { "Z1K1": "Z6061", "Z6061K1": { "Z1K1": "Z20420", "Z20420K1": { "Z1K1": "Z20159", "Z20159K1": "Z17814", "Z20159K2": { "Z1K1": "Z13518", "Z13518K1": "2023" } }, "Z20420K2": { "Z1K1": "Z20342", "Z20342K1": { "Z1K1": "Z16098", "Z16098K1": "Z16101" }, "Z20342K2": { "Z1K1": "Z13518", "Z13518K1": "1" } } }, "Z6061K2": { "Z1K1": "Z6060", "Z6060K1": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6060K2": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6060K3": { "Z1K1": "Z13518", "Z13518K1": "0" } } }, "Z6064K2": { "Z1K1": "Z6062", "Z6062K1": { "Z1K1": "Z6091", "Z6091K1": "Q577" } }, "Z6064K3": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6064K4": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6064K5": { "Z1K1": "Z16683", "Z16683K1": "Z16661", "Z16683K2": { "Z1K1": "Z13518", "Z13518K1": "0" } }, "Z6064K6": { "Z1K1": "Z6063", "Z6063K1": { "Z1K1": "Z6091", "Z6091K1": "Q1985727" } } }, "Z6007K3": { "Z1K1": "Z6020", "Z6020K1": "Z6021" } } ], "Z46673K3": [ "Z39328" ], "Z46673K4": { "Z1K1": "Z60", "Z60K1": "ml" } }, "Z46809K2": [ "Z39328" ] }, "Z46811K2": { "Z1K1": "Z60", "Z60K1": "ml" } }, "Z46829K2": { "Z1K1": "Z60", "Z60K1": "ml" }, "Z46829K3": [ "Z39328" ] } } } } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "2023-ൽ" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence phrase assembly: Malayalam population in 2023: the point in time gives 2023-ൽ" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the assembled roles, before realization." } ] } } bavlbx61myo3wrqictkgdih09laer3z Z46836 0 100421 330993 2026-10-23T01:13:11Z Jsamwrites 938 Create native test (dag) 330993 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46836" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46829", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z39346", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z812", "Z812K1": { "Z1K1": "Z7", "Z7K1": "Z46829", "Z46829K1": { "Z1K1": "Z7", "Z7K1": "Z46811", "Z46811K1": { "Z1K1": "Z7", "Z7K1": "Z46809", "Z46809K1": { "Z1K1": "Z7", "Z7K1": "Z46673", "Z46673K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } } }, "K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q90" } ], "K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } }, "K1": { "Z1K1": "Z6092", "Z6092K1": "P1082" }, "K2": [ "Z1", { "Z1K1": "Z6010", "Z6010K1": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "2103778" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "1" } }, "Z6010K2": "Z24", "Z6010K3": "Z24", "Z6010K4": { "Z1K1": "Z6091", "Z6091K1": "Q199" } } ] } }, "Z46673K2": [ "Z6007", { "Z1K1": "Z6007", "Z6007K1": { "Z1K1": "Z6092", "Z6092K1": "P585" }, "Z6007K2": { "Z1K1": "Z6064", "Z6064K1": { "Z1K1": "Z6061", "Z6061K1": { "Z1K1": "Z20420", "Z20420K1": { "Z1K1": "Z20159", "Z20159K1": "Z17814", "Z20159K2": { "Z1K1": "Z13518", "Z13518K1": "2023" } }, "Z20420K2": { "Z1K1": "Z20342", "Z20342K1": { "Z1K1": "Z16098", "Z16098K1": "Z16101" }, "Z20342K2": { "Z1K1": "Z13518", "Z13518K1": "1" } } }, "Z6061K2": { "Z1K1": "Z6060", "Z6060K1": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6060K2": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6060K3": { "Z1K1": "Z13518", "Z13518K1": "0" } } }, "Z6064K2": { "Z1K1": "Z6062", "Z6062K1": { "Z1K1": "Z6091", "Z6091K1": "Q577" } }, "Z6064K3": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6064K4": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6064K5": { "Z1K1": "Z16683", "Z16683K1": "Z16661", "Z16683K2": { "Z1K1": "Z13518", "Z13518K1": "0" } }, "Z6064K6": { "Z1K1": "Z6063", "Z6063K1": { "Z1K1": "Z6091", "Z6091K1": "Q1985727" } } }, "Z6007K3": { "Z1K1": "Z6020", "Z6020K1": "Z6021" } } ], "Z46673K3": [ "Z39328" ], "Z46673K4": { "Z1K1": "Z60", "Z60K1": "dag" } }, "Z46809K2": [ "Z39328" ] }, "Z46811K2": { "Z1K1": "Z60", "Z60K1": "dag" } }, "Z46829K2": { "Z1K1": "Z60", "Z60K1": "dag" }, "Z46829K3": [ "Z39328" ] } } } } } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z844", "Z844K2": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence phrase assembly: Dagbani population in 2023: a point in time puts the sentence in the past" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the assembled roles, before realization." } ] } } bwgxbxv9zxaho6g5nafd44i35krt4np Z46837 0 100422 330994 2026-10-23T01:13:14Z Jsamwrites 938 Create native test (fr) 330994 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46837" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46829", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z39346", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z812", "Z812K1": { "Z1K1": "Z7", "Z7K1": "Z46829", "Z46829K1": { "Z1K1": "Z7", "Z7K1": "Z46811", "Z46811K1": { "Z1K1": "Z7", "Z7K1": "Z46809", "Z46809K1": { "Z1K1": "Z7", "Z7K1": "Z46673", "Z46673K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } } }, "K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q90" } ], "K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } }, "K1": { "Z1K1": "Z6092", "Z6092K1": "P1082" }, "K2": [ "Z1", { "Z1K1": "Z6010", "Z6010K1": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "2103778" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "1" } }, "Z6010K2": "Z24", "Z6010K3": "Z24", "Z6010K4": { "Z1K1": "Z6091", "Z6091K1": "Q199" } } ] } }, "Z46673K2": [ "Z6007", { "Z1K1": "Z6007", "Z6007K1": { "Z1K1": "Z6092", "Z6092K1": "P585" }, "Z6007K2": { "Z1K1": "Z6064", "Z6064K1": { "Z1K1": "Z6061", "Z6061K1": { "Z1K1": "Z20420", "Z20420K1": { "Z1K1": "Z20159", "Z20159K1": "Z17814", "Z20159K2": { "Z1K1": "Z13518", "Z13518K1": "2023" } }, "Z20420K2": { "Z1K1": "Z20342", "Z20342K1": { "Z1K1": "Z16098", "Z16098K1": "Z16101" }, "Z20342K2": { "Z1K1": "Z13518", "Z13518K1": "1" } } }, "Z6061K2": { "Z1K1": "Z6060", "Z6060K1": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6060K2": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6060K3": { "Z1K1": "Z13518", "Z13518K1": "0" } } }, "Z6064K2": { "Z1K1": "Z6062", "Z6062K1": { "Z1K1": "Z6091", "Z6091K1": "Q577" } }, "Z6064K3": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6064K4": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6064K5": { "Z1K1": "Z16683", "Z16683K1": "Z16661", "Z16683K2": { "Z1K1": "Z13518", "Z13518K1": "0" } }, "Z6064K6": { "Z1K1": "Z6063", "Z6063K1": { "Z1K1": "Z6091", "Z6091K1": "Q1985727" } } }, "Z6007K3": { "Z1K1": "Z6020", "Z6020K1": "Z6021" } } ], "Z46673K3": [ "Z39328" ], "Z46673K4": { "Z1K1": "Z60", "Z60K1": "fr" } }, "Z46809K2": [ "Z39328" ] }, "Z46811K2": { "Z1K1": "Z60", "Z60K1": "fr" } }, "Z46829K2": { "Z1K1": "Z60", "Z60K1": "fr" }, "Z46829K3": [ "Z39328" ] } } } } } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q108524486" } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z844", "Z844K2": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence phrase assembly: French population in 2023: the past of a state is the imperfect" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the assembled roles, before realization." } ] } } sqcnc8yukh2cl3q3zrmk0qqxjham6i0 Z46838 0 100423 330995 2026-10-23T01:13:17Z Jsamwrites 938 Create native test (es) 330995 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46838" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46829", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z12696", "Z12696K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": "Z39346", "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z811", "Z811K1": { "Z1K1": "Z7", "Z7K1": "Z812", "Z812K1": { "Z1K1": "Z7", "Z7K1": "Z46829", "Z46829K1": { "Z1K1": "Z7", "Z7K1": "Z46811", "Z46811K1": { "Z1K1": "Z7", "Z7K1": "Z46809", "Z46809K1": { "Z1K1": "Z7", "Z7K1": "Z46673", "Z46673K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } } }, "K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q979" } ], "K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } }, "K1": { "Z1K1": "Z6092", "Z6092K1": "P61" }, "K2": [ "Z1", { "Z1K1": "Z6091", "Z6091K1": "Q7186" } ] } }, "Z46673K2": [ "Z6007" ], "Z46673K3": [ "Z39328" ], "Z46673K4": { "Z1K1": "Z60", "Z60K1": "es" } }, "Z46809K2": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } } ] }, "Z46811K2": { "Z1K1": "Z60", "Z60K1": "es" } }, "Z46829K2": { "Z1K1": "Z60", "Z60K1": "es" }, "Z46829K3": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } } ] } } } } } }, "Z12696K2": { "Z1K1": "Z6091", "Z6091K1": "Q442485" } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z844", "Z844K2": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence phrase assembly: Spanish discovery in the past: the past of an event is the preterite" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the assembled roles, before realization." } ] } } ghgub4hm2yx4cafj3u6sslfph1ad8fl Z46839 0 100424 330996 2026-10-23T01:13:20Z Jsamwrites 938 Create native test (ig) 330996 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46839" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46829", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z889", "Z889K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6091", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z46829", "Z46829K1": { "Z1K1": "Z7", "Z7K1": "Z46811", "Z46811K1": { "Z1K1": "Z7", "Z7K1": "Z46809", "Z46809K1": { "Z1K1": "Z7", "Z7K1": "Z46673", "Z46673K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } } }, "K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q90" } ], "K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } }, "K1": { "Z1K1": "Z6092", "Z6092K1": "P17" }, "K2": [ "Z1", { "Z1K1": "Z6091", "Z6091K1": "Q29" } ] } }, "Z46673K2": [ "Z6007" ], "Z46673K3": [ "Z39328" ], "Z46673K4": { "Z1K1": "Z60", "Z60K1": "ig" } }, "Z46809K2": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q130192655" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } } ] }, "Z46811K2": { "Z1K1": "Z60", "Z60K1": "ig" } }, "Z46829K2": { "Z1K1": "Z60", "Z60K1": "ig" }, "Z46829K3": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q130192655" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } } ] } }, "Z889K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, { "Z1K1": "Z6091", "Z6091K1": "Q179080" } ], "Z889K3": "Z18683" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z844", "Z844K2": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence phrase assembly: Igbo, no qualifier: subject and predicate only" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the assembled roles, before realization." } ] } } 6gfd9b3odbd42s7oza78jzva8od9h1t Z46840 0 100425 330997 2026-10-23T01:13:23Z Jsamwrites 938 Create native test (en) 330997 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46840" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46831", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z889", "Z889K1": { "Z1K1": "Z7", "Z7K1": "Z46831", "Z46831K1": { "Z1K1": "Z7", "Z7K1": "Z46829", "Z46829K1": { "Z1K1": "Z7", "Z7K1": "Z46811", "Z46811K1": { "Z1K1": "Z7", "Z7K1": "Z46809", "Z46809K1": { "Z1K1": "Z7", "Z7K1": "Z46673", "Z46673K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } } }, "K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q90" } ], "K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } }, "K1": { "Z1K1": "Z6092", "Z6092K1": "P17" }, "K2": [ "Z1", { "Z1K1": "Z6091", "Z6091K1": "Q29" } ] } }, "Z46673K2": [ "Z6007" ], "Z46673K3": [ "Z39328" ], "Z46673K4": { "Z1K1": "Z60", "Z60K1": "en" } }, "Z46809K2": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q130192655" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } } ] }, "Z46811K2": { "Z1K1": "Z60", "Z60K1": "en" } }, "Z46829K2": { "Z1K1": "Z60", "Z60K1": "en" }, "Z46829K3": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q130192655" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } } ] }, "Z46831K2": { "Z1K1": "Z60", "Z60K1": "en" }, "Z46831K3": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q130192655" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } } ] }, "Z889K2": [ "Z6", "Paris", "is not in Spain" ], "Z889K3": "Z18683" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z844", "Z844K2": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence agreement and morphology: English Paris is not in Spain" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compares the realized strings, in role order." } ] } } 56t7riai4aq5jpeb3f4v6vj9ij5n1n9 Z46841 0 100426 330998 2026-10-23T01:13:26Z Jsamwrites 938 Create native test (fr) 330998 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46841" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46831", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z889", "Z889K1": { "Z1K1": "Z7", "Z7K1": "Z46831", "Z46831K1": { "Z1K1": "Z7", "Z7K1": "Z46829", "Z46829K1": { "Z1K1": "Z7", "Z7K1": "Z46811", "Z46811K1": { "Z1K1": "Z7", "Z7K1": "Z46809", "Z46809K1": { "Z1K1": "Z7", "Z7K1": "Z46673", "Z46673K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } } }, "K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q560" } ], "K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } }, "K1": { "Z1K1": "Z6092", "Z6092K1": "P61" }, "K2": [ "Z1", { "Z1K1": "Z6091", "Z6091K1": "Q7186" } ] } }, "Z46673K2": [ "Z6007" ], "Z46673K3": [ "Z39328" ], "Z46673K4": { "Z1K1": "Z60", "Z60K1": "fr" } }, "Z46809K2": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q130192655" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } } ] }, "Z46811K2": { "Z1K1": "Z60", "Z60K1": "fr" } }, "Z46829K2": { "Z1K1": "Z60", "Z60K1": "fr" }, "Z46829K3": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q130192655" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } } ] }, "Z46831K2": { "Z1K1": "Z60", "Z60K1": "fr" }, "Z46831K3": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q130192655" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } } ] }, "Z889K2": [ "Z6", "Marie Curie", "n'a pas découvert l'hélium" ], "Z889K3": "Z18683" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z844", "Z844K2": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence agreement and morphology: French Marie Curie did not discover helium" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compares the realized strings, in role order." } ] } } br9kkrnbjflxgblexw5h8k29xh7cc16 Z46842 0 100427 330999 2026-10-23T01:13:29Z Jsamwrites 938 Create native test (la) 330999 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46842" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46831", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z889", "Z889K1": { "Z1K1": "Z7", "Z7K1": "Z46831", "Z46831K1": { "Z1K1": "Z7", "Z7K1": "Z46829", "Z46829K1": { "Z1K1": "Z7", "Z7K1": "Z46811", "Z46811K1": { "Z1K1": "Z7", "Z7K1": "Z46809", "Z46809K1": { "Z1K1": "Z7", "Z7K1": "Z46673", "Z46673K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } } }, "K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q90" } ], "K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } }, "K1": { "Z1K1": "Z6092", "Z6092K1": "P1082" }, "K2": [ "Z1", { "Z1K1": "Z6010", "Z6010K1": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "2103778" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "1" } }, "Z6010K2": "Z24", "Z6010K3": "Z24", "Z6010K4": { "Z1K1": "Z6091", "Z6091K1": "Q199" } } ] } }, "Z46673K2": [ "Z6007", { "Z1K1": "Z6007", "Z6007K1": { "Z1K1": "Z6092", "Z6092K1": "P585" }, "Z6007K2": { "Z1K1": "Z6064", "Z6064K1": { "Z1K1": "Z6061", "Z6061K1": { "Z1K1": "Z20420", "Z20420K1": { "Z1K1": "Z20159", "Z20159K1": "Z17814", "Z20159K2": { "Z1K1": "Z13518", "Z13518K1": "2023" } }, "Z20420K2": { "Z1K1": "Z20342", "Z20342K1": { "Z1K1": "Z16098", "Z16098K1": "Z16101" }, "Z20342K2": { "Z1K1": "Z13518", "Z13518K1": "1" } } }, "Z6061K2": { "Z1K1": "Z6060", "Z6060K1": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6060K2": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6060K3": { "Z1K1": "Z13518", "Z13518K1": "0" } } }, "Z6064K2": { "Z1K1": "Z6062", "Z6062K1": { "Z1K1": "Z6091", "Z6091K1": "Q577" } }, "Z6064K3": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6064K4": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6064K5": { "Z1K1": "Z16683", "Z16683K1": "Z16661", "Z16683K2": { "Z1K1": "Z13518", "Z13518K1": "0" } }, "Z6064K6": { "Z1K1": "Z6063", "Z6063K1": { "Z1K1": "Z6091", "Z6091K1": "Q1985727" } } }, "Z6007K3": { "Z1K1": "Z6020", "Z6020K1": "Z6021" } } ], "Z46673K3": [ "Z39328" ], "Z46673K4": { "Z1K1": "Z60", "Z60K1": "la" } }, "Z46809K2": [ "Z39328" ] }, "Z46811K2": { "Z1K1": "Z60", "Z60K1": "la" } }, "Z46829K2": { "Z1K1": "Z60", "Z60K1": "la" }, "Z46829K3": [ "Z39328" ] }, "Z46831K2": { "Z1K1": "Z60", "Z60K1": "la" }, "Z46831K3": [ "Z39328" ] }, "Z889K2": [ "Z6", "Lutetia", "2 103 778 incolas habebat", "anno MMXXIII" ], "Z889K3": "Z18683" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z844", "Z844K2": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence agreement and morphology: Latin Paris had 2,103,778 inhabitants in 2023" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compares the realized strings, in role order." } ] } } kn1uchifzjgxif8t32xpnwr3gzvknl8 Z46843 0 100428 331000 2026-10-23T01:13:32Z Jsamwrites 938 Create native test (ml) 331000 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46843" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46831", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z889", "Z889K1": { "Z1K1": "Z7", "Z7K1": "Z46831", "Z46831K1": { "Z1K1": "Z7", "Z7K1": "Z46829", "Z46829K1": { "Z1K1": "Z7", "Z7K1": "Z46811", "Z46811K1": { "Z1K1": "Z7", "Z7K1": "Z46809", "Z46809K1": { "Z1K1": "Z7", "Z7K1": "Z46673", "Z46673K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } } }, "K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q90" } ], "K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } }, "K1": { "Z1K1": "Z6092", "Z6092K1": "P17" }, "K2": [ "Z1", { "Z1K1": "Z6091", "Z6091K1": "Q29" } ] } }, "Z46673K2": [ "Z6007" ], "Z46673K3": [ "Z39328" ], "Z46673K4": { "Z1K1": "Z60", "Z60K1": "ml" } }, "Z46809K2": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q130192655" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } } ] }, "Z46811K2": { "Z1K1": "Z60", "Z60K1": "ml" } }, "Z46829K2": { "Z1K1": "Z60", "Z60K1": "ml" }, "Z46829K3": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q130192655" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } } ] }, "Z46831K2": { "Z1K1": "Z60", "Z60K1": "ml" }, "Z46831K3": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q130192655" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } } ] }, "Z889K2": [ "Z6", "പാരിസ്", "സ്പെയിനിലല്ല" ], "Z889K3": "Z18683" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z844", "Z844K2": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence agreement and morphology: Malayalam Paris is not in Spain" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compares the realized strings, in role order." } ] } } 4vkw5uauan06ap7tm3mfng28mkl6nc0 Z46844 0 100429 331001 2026-10-23T01:13:35Z Jsamwrites 938 Create native test (ig) 331001 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46844" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46831", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z889", "Z889K1": { "Z1K1": "Z7", "Z7K1": "Z46831", "Z46831K1": { "Z1K1": "Z7", "Z7K1": "Z46829", "Z46829K1": { "Z1K1": "Z7", "Z7K1": "Z46811", "Z46811K1": { "Z1K1": "Z7", "Z7K1": "Z46809", "Z46809K1": { "Z1K1": "Z7", "Z7K1": "Z46673", "Z46673K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } } }, "K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q560" } ], "K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } }, "K1": { "Z1K1": "Z6092", "Z6092K1": "P61" }, "K2": [ "Z1", { "Z1K1": "Z6091", "Z6091K1": "Q7186" } ] } }, "Z46673K2": [ "Z6007" ], "Z46673K3": [ "Z39328" ], "Z46673K4": { "Z1K1": "Z60", "Z60K1": "ig" } }, "Z46809K2": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q130192655" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } } ] }, "Z46811K2": { "Z1K1": "Z60", "Z60K1": "ig" } }, "Z46829K2": { "Z1K1": "Z60", "Z60K1": "ig" }, "Z46829K3": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q130192655" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } } ] }, "Z46831K2": { "Z1K1": "Z60", "Z60K1": "ig" }, "Z46831K3": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q130192655" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } }, { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q177691" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1994301" } } ] }, "Z889K2": [ "Z6", "Marie Curie", "achọpụtaghị helium" ], "Z889K3": "Z18683" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z844", "Z844K2": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence agreement and morphology: Igbo Marie Curie did not discover helium" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compares the realized strings, in role order." } ] } } 7j7vvz715bpro5kw9dkrbu9vzwrpw77 Z46845 0 100430 331002 2026-10-23T01:13:38Z Jsamwrites 938 Create native test (dag) 331002 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46845" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46831", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z889", "Z889K1": { "Z1K1": "Z7", "Z7K1": "Z46831", "Z46831K1": { "Z1K1": "Z7", "Z7K1": "Z46829", "Z46829K1": { "Z1K1": "Z7", "Z7K1": "Z46811", "Z46811K1": { "Z1K1": "Z7", "Z7K1": "Z46809", "Z46809K1": { "Z1K1": "Z7", "Z7K1": "Z46673", "Z46673K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } } }, "K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q90" } ], "K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } }, "K1": { "Z1K1": "Z6092", "Z6092K1": "P1082" }, "K2": [ "Z1", { "Z1K1": "Z6010", "Z6010K1": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "2103778" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "1" } }, "Z6010K2": "Z24", "Z6010K3": "Z24", "Z6010K4": { "Z1K1": "Z6091", "Z6091K1": "Q199" } } ] } }, "Z46673K2": [ "Z6007", { "Z1K1": "Z6007", "Z6007K1": { "Z1K1": "Z6092", "Z6092K1": "P585" }, "Z6007K2": { "Z1K1": "Z6064", "Z6064K1": { "Z1K1": "Z6061", "Z6061K1": { "Z1K1": "Z20420", "Z20420K1": { "Z1K1": "Z20159", "Z20159K1": "Z17814", "Z20159K2": { "Z1K1": "Z13518", "Z13518K1": "2023" } }, "Z20420K2": { "Z1K1": "Z20342", "Z20342K1": { "Z1K1": "Z16098", "Z16098K1": "Z16101" }, "Z20342K2": { "Z1K1": "Z13518", "Z13518K1": "1" } } }, "Z6061K2": { "Z1K1": "Z6060", "Z6060K1": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6060K2": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6060K3": { "Z1K1": "Z13518", "Z13518K1": "0" } } }, "Z6064K2": { "Z1K1": "Z6062", "Z6062K1": { "Z1K1": "Z6091", "Z6091K1": "Q577" } }, "Z6064K3": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6064K4": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6064K5": { "Z1K1": "Z16683", "Z16683K1": "Z16661", "Z16683K2": { "Z1K1": "Z13518", "Z13518K1": "0" } }, "Z6064K6": { "Z1K1": "Z6063", "Z6063K1": { "Z1K1": "Z6091", "Z6091K1": "Q1985727" } } }, "Z6007K3": { "Z1K1": "Z6020", "Z6020K1": "Z6021" } } ], "Z46673K3": [ "Z39328" ], "Z46673K4": { "Z1K1": "Z60", "Z60K1": "dag" } }, "Z46809K2": [ "Z39328" ] }, "Z46811K2": { "Z1K1": "Z60", "Z60K1": "dag" } }, "Z46829K2": { "Z1K1": "Z60", "Z60K1": "dag" }, "Z46829K3": [ "Z39328" ] }, "Z46831K2": { "Z1K1": "Z60", "Z60K1": "dag" }, "Z46831K3": [ "Z39328" ] }, "Z889K2": [ "Z6", "Paris", "daa mali niriba kalinli 2,103,778", "yuuni 2023 ni" ], "Z889K3": "Z18683" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z844", "Z844K2": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence agreement and morphology: Dagbani Paris had 2,103,778 inhabitants in 2023" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compares the realized strings, in role order." } ] } } tgfhp4venjcovgrylffreygiqzooz4s Z46846 0 100431 331003 2026-10-23T01:13:41Z Jsamwrites 938 Create native test (es) 331003 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46846" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46831", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z889", "Z889K1": { "Z1K1": "Z7", "Z7K1": "Z46831", "Z46831K1": { "Z1K1": "Z7", "Z7K1": "Z46829", "Z46829K1": { "Z1K1": "Z7", "Z7K1": "Z46811", "Z46811K1": { "Z1K1": "Z7", "Z7K1": "Z46809", "Z46809K1": { "Z1K1": "Z7", "Z7K1": "Z46673", "Z46673K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } } }, "K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q142" } ], "K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } }, "K1": { "Z1K1": "Z6092", "Z6092K1": "P463" }, "K2": [ "Z1", { "Z1K1": "Z6091", "Z6091K1": "Q1065" } ] } }, "Z46673K2": [ "Z6007", { "Z1K1": "Z6007", "Z6007K1": { "Z1K1": "Z6092", "Z6092K1": "P580" }, "Z6007K2": { "Z1K1": "Z6064", "Z6064K1": { "Z1K1": "Z6061", "Z6061K1": { "Z1K1": "Z20420", "Z20420K1": { "Z1K1": "Z20159", "Z20159K1": "Z17814", "Z20159K2": { "Z1K1": "Z13518", "Z13518K1": "1945" } }, "Z20420K2": { "Z1K1": "Z20342", "Z20342K1": { "Z1K1": "Z16098", "Z16098K1": "Z16110" }, "Z20342K2": { "Z1K1": "Z13518", "Z13518K1": "24" } } }, "Z6061K2": { "Z1K1": "Z6060", "Z6060K1": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6060K2": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6060K3": { "Z1K1": "Z13518", "Z13518K1": "0" } } }, "Z6064K2": { "Z1K1": "Z6062", "Z6062K1": { "Z1K1": "Z6091", "Z6091K1": "Q573" } }, "Z6064K3": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6064K4": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6064K5": { "Z1K1": "Z16683", "Z16683K1": "Z16661", "Z16683K2": { "Z1K1": "Z13518", "Z13518K1": "0" } }, "Z6064K6": { "Z1K1": "Z6063", "Z6063K1": { "Z1K1": "Z6091", "Z6091K1": "Q1985727" } } }, "Z6007K3": { "Z1K1": "Z6020", "Z6020K1": "Z6021" } }, { "Z1K1": "Z6007", "Z6007K1": { "Z1K1": "Z6092", "Z6092K1": "P805" }, "Z6007K2": { "Z1K1": "Z6091", "Z6091K1": "Q5478323" }, "Z6007K3": { "Z1K1": "Z6020", "Z6020K1": "Z6021" } } ], "Z46673K3": [ "Z39328" ], "Z46673K4": { "Z1K1": "Z60", "Z60K1": "es" } }, "Z46809K2": [ "Z39328" ] }, "Z46811K2": { "Z1K1": "Z60", "Z60K1": "es" } }, "Z46829K2": { "Z1K1": "Z60", "Z60K1": "es" }, "Z46829K3": [ "Z39328" ] }, "Z46831K2": { "Z1K1": "Z60", "Z60K1": "es" }, "Z46831K3": [ "Z39328" ] }, "Z889K2": [ "Z6", "Francia", "es miembro de la Organización de las Naciones Unidas", "desde 1945" ], "Z889K3": "Z18683" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z844", "Z844K2": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence agreement and morphology: Spanish France has been a member of the United Nations since 1945" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compares the realized strings, in role order." } ] } } ofdpb958ktevahdck16o1tqucuxaw9y Z46847 0 100432 331010 2026-10-23T02:23:31Z 99of9 1622 331010 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46847" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z42093", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z42093", "Z42093K1": { "Z1K1": "Z6091", "Z6091K1": "Q727665" }, "Z42093K2": { "Z1K1": "Z40", "Z40K1": "Z41" }, "Z42093K3": [ "Z6092", { "Z1K1": "Z6092", "Z6092K1": "P6949" }, { "Z1K1": "Z6092", "Z6092K1": "P5204" }, { "Z1K1": "Z6092", "Z6092K1": "P2669" } ], "Z42093K4": "Z1002" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z877", "Z877K2": { "Z1K1": "Z89", "Z89K1": "It was announced on 23 September 2008, became commercially available on 22 October 2008 and was discontinued on 27 July 2010." } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "[en] announce-commercialize-discontinue" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } 17zzepxyisjx4855texohhjllyo9rz7 Z46848 0 100433 331014 2026-10-23T02:38:43Z Jsamwrites 938 Create Sentence constituent order language options 331014 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46848" }, "Z2K2": { "Z1K1": "Z14294", "Z14294K1": [ "Z14293", { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, { "Z1K1": "Z6091", "Z6091K1": "Q179080" }, { "Z1K1": "Z6091", "Z6091K1": "Q2403061" } ] } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1002" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, { "Z1K1": "Z6091", "Z6091K1": "Q179080" }, { "Z1K1": "Z6091", "Z6091K1": "Q2403061" } ] } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1004" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, { "Z1K1": "Z6091", "Z6091K1": "Q179080" }, { "Z1K1": "Z6091", "Z6091K1": "Q2403061" } ] } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1003" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, { "Z1K1": "Z6091", "Z6091K1": "Q179080" }, { "Z1K1": "Z6091", "Z6091K1": "Q2403061" } ] } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1014" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, { "Z1K1": "Z6091", "Z6091K1": "Q179080" }, { "Z1K1": "Z6091", "Z6091K1": "Q2403061" } ] } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1015" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, { "Z1K1": "Z6091", "Z6091K1": "Q2403061" }, { "Z1K1": "Z6091", "Z6091K1": "Q179080" } ] } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1403" ] }, { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q2403061" }, { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, { "Z1K1": "Z6091", "Z6091K1": "Q179080" } ] } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1012" ] } ], "Z14294K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "No constituent order is defined for this language", "Sentence constituent order language options" ] } } ], "Z8K5": "Z8" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence constituent order language options" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Grammatical roles in surface order: subject, predicate, temporal adverbial (en, fr, es, ig, dag); Latin subject, temporal adverbial, predicate; Malayalam temporal adverbial, subject, predicate." } ] } } dyclykusgodi6b8vu3y1xpnnrask0u5 Z46849 0 100434 331015 2026-10-23T02:38:47Z Jsamwrites 938 Create Sentence punctuation language options 331015 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46849" }, "Z2K2": { "Z1K1": "Z14294", "Z14294K1": [ "Z14293", { "Z1K1": "Z14293", "Z14293K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z22511", "Z22511K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z14293K2": [ "Z60", "Z1002", "Z1004", "Z1003", "Z1403", "Z1012", "Z1014", "Z1015" ] } ], "Z14294K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "No sentence punctuation is defined for this language", "Sentence punctuation language options" ] } } ], "Z8K5": "Z8" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence punctuation language options" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence punctuation: capital first letter (cased scripts) and full stop for English, French, Spanish, Latin, Malayalam, Igbo and Dagbani." } ] } } 76kx3dlqd5usn9kfdgsoq403n8tqbb6 Z46850 0 100435 331016 2026-10-23T02:38:50Z Jsamwrites 938 Create Language-specific sentence ordering 331016 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46850" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" } }, "Z17K2": "Z46850K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "roles" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46850K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z46850K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "clause type" } ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z46850" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Language-specific sentence ordering" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Roles of a sentence in the surface order of the language (order options); only declarative clauses so far." } ] } } k33nyi0up5pehuldt0mcie4d4pfc3iq 331037 331016 2026-10-23T05:32:08Z Jsamwrites 938 Added Z46851 to the approved list of implementations 331037 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46850" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" } }, "Z17K2": "Z46850K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "roles" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46850K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z46850K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "clause type" } ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" } }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z46851" ], "Z8K5": "Z46850" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Language-specific sentence ordering" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Roles of a sentence in the surface order of the language (order options); only declarative clauses so far." } ] } } 5q4lsafm9tg9oqpdgcz3bqbxsdpid01 331038 331037 2026-10-23T05:32:12Z Jsamwrites 938 Added Z46852, Z46853, Z46854, Z46855, Z46856, Z46857 and Z46858 to the approved list of test cases 331038 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46850" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" } }, "Z17K2": "Z46850K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "roles" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46850K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z46850K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "clause type" } ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" } }, "Z8K3": [ "Z20", "Z46852", "Z46853", "Z46854", "Z46855", "Z46856", "Z46857", "Z46858" ], "Z8K4": [ "Z14", "Z46851" ], "Z8K5": "Z46850" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Language-specific sentence ordering" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Roles of a sentence in the surface order of the language (order options); only declarative clauses so far." } ] } } pcqn7xg7l85dtgiqj3o8ug9usa2cdrj Z46851 0 100436 331017 2026-10-23T02:38:52Z Jsamwrites 938 Create the implementation of Language-specific sentence ordering 331017 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46851" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z46850", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z46850K3" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q474328" } }, "Z802K2": { "Z1K1": "Z7", "Z7K1": "Z876", "Z876K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" }, "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z12767", "Z12767K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z12767K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } ], "Z8K5": "Z8" }, "Z876K2": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" }, "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z28316", "Z28316K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z40", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } }, "Z19316K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } ], "Z8K5": "Z8" }, "Z28316K2": { "Z1K1": "Z18", "Z18K1": "Z46850K1" }, "Z28316K3": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z7", "Z7K1": "Z14310", "Z14310K1": "Z46848", "Z14310K2": { "Z1K1": "Z18", "Z18K1": "Z46850K2" } }, "K1": { "Z1K1": "Z18", "Z18K1": "Z46850K3" } } }, "Z876K3": [ { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" } ] }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "Only declarative sentences (Q474328) are supported so far", "Language-specific sentence ordering" ] } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Language-specific sentence ordering, composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Roles of a sentence in the surface order of the language (order options); only declarative clauses so far." } ] } } k8eqeh9grysvuvpfmevf87q21jq3gnz Z46852 0 100437 331018 2026-10-23T02:38:55Z Jsamwrites 938 Create native test (en) 331018 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46852" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46850", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z889", "Z889K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6091", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z46850", "Z46850K1": { "Z1K1": "Z7", "Z7K1": "Z46829", "Z46829K1": { "Z1K1": "Z7", "Z7K1": "Z46811", "Z46811K1": { "Z1K1": "Z7", "Z7K1": "Z46809", "Z46809K1": { "Z1K1": "Z7", "Z7K1": "Z46673", "Z46673K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } } }, "K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q142" } ], "K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } }, "K1": { "Z1K1": "Z6092", "Z6092K1": "P463" }, "K2": [ "Z1", { "Z1K1": "Z6091", "Z6091K1": "Q1065" } ] } }, "Z46673K2": [ "Z6007", { "Z1K1": "Z6007", "Z6007K1": { "Z1K1": "Z6092", "Z6092K1": "P580" }, "Z6007K2": { "Z1K1": "Z6064", "Z6064K1": { "Z1K1": "Z6061", "Z6061K1": { "Z1K1": "Z20420", "Z20420K1": { "Z1K1": "Z20159", "Z20159K1": "Z17814", "Z20159K2": { "Z1K1": "Z13518", "Z13518K1": "1945" } }, "Z20420K2": { "Z1K1": "Z20342", "Z20342K1": { "Z1K1": "Z16098", "Z16098K1": "Z16110" }, "Z20342K2": { "Z1K1": "Z13518", "Z13518K1": "24" } } }, "Z6061K2": { "Z1K1": "Z6060", "Z6060K1": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6060K2": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6060K3": { "Z1K1": "Z13518", "Z13518K1": "0" } } }, "Z6064K2": { "Z1K1": "Z6062", "Z6062K1": { "Z1K1": "Z6091", "Z6091K1": "Q573" } }, "Z6064K3": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6064K4": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6064K5": { "Z1K1": "Z16683", "Z16683K1": "Z16661", "Z16683K2": { "Z1K1": "Z13518", "Z13518K1": "0" } }, "Z6064K6": { "Z1K1": "Z6063", "Z6063K1": { "Z1K1": "Z6091", "Z6091K1": "Q1985727" } } }, "Z6007K3": { "Z1K1": "Z6020", "Z6020K1": "Z6021" } }, { "Z1K1": "Z6007", "Z6007K1": { "Z1K1": "Z6092", "Z6092K1": "P805" }, "Z6007K2": { "Z1K1": "Z6091", "Z6091K1": "Q5478323" }, "Z6007K3": { "Z1K1": "Z6020", "Z6020K1": "Z6021" } } ], "Z46673K3": [ "Z39328" ], "Z46673K4": { "Z1K1": "Z60", "Z60K1": "en" } }, "Z46809K2": [ "Z39328" ] }, "Z46811K2": { "Z1K1": "Z60", "Z60K1": "en" } }, "Z46829K2": { "Z1K1": "Z60", "Z60K1": "en" }, "Z46829K3": [ "Z39328" ] }, "Z46850K2": { "Z1K1": "Z60", "Z60K1": "en" }, "Z46850K3": { "Z1K1": "Z6091", "Z6091K1": "Q474328" } } }, "Z889K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, { "Z1K1": "Z6091", "Z6091K1": "Q179080" }, { "Z1K1": "Z6091", "Z6091K1": "Q2403061" } ], "Z889K3": "Z18683" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z844", "Z844K2": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Language-specific sentence ordering: English since 1945: subject, predicate, temporal adverbial" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the order of the roles." } ] } } icaqisq50capiikzw740k4gjing5cqc Z46853 0 100438 331019 2026-10-23T02:38:58Z Jsamwrites 938 Create native test (la) 331019 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46853" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46850", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z889", "Z889K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6091", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z46850", "Z46850K1": { "Z1K1": "Z7", "Z7K1": "Z46829", "Z46829K1": { "Z1K1": "Z7", "Z7K1": "Z46811", "Z46811K1": { "Z1K1": "Z7", "Z7K1": "Z46809", "Z46809K1": { "Z1K1": "Z7", "Z7K1": "Z46673", "Z46673K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } } }, "K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q142" } ], "K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } }, "K1": { "Z1K1": "Z6092", "Z6092K1": "P463" }, "K2": [ "Z1", { "Z1K1": "Z6091", "Z6091K1": "Q1065" } ] } }, "Z46673K2": [ "Z6007", { "Z1K1": "Z6007", "Z6007K1": { "Z1K1": "Z6092", "Z6092K1": "P580" }, "Z6007K2": { "Z1K1": "Z6064", "Z6064K1": { "Z1K1": "Z6061", "Z6061K1": { "Z1K1": "Z20420", "Z20420K1": { "Z1K1": "Z20159", "Z20159K1": "Z17814", "Z20159K2": { "Z1K1": "Z13518", "Z13518K1": "1945" } }, "Z20420K2": { "Z1K1": "Z20342", "Z20342K1": { "Z1K1": "Z16098", "Z16098K1": "Z16110" }, "Z20342K2": { "Z1K1": "Z13518", "Z13518K1": "24" } } }, "Z6061K2": { "Z1K1": "Z6060", "Z6060K1": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6060K2": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6060K3": { "Z1K1": "Z13518", "Z13518K1": "0" } } }, "Z6064K2": { "Z1K1": "Z6062", "Z6062K1": { "Z1K1": "Z6091", "Z6091K1": "Q573" } }, "Z6064K3": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6064K4": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6064K5": { "Z1K1": "Z16683", "Z16683K1": "Z16661", "Z16683K2": { "Z1K1": "Z13518", "Z13518K1": "0" } }, "Z6064K6": { "Z1K1": "Z6063", "Z6063K1": { "Z1K1": "Z6091", "Z6091K1": "Q1985727" } } }, "Z6007K3": { "Z1K1": "Z6020", "Z6020K1": "Z6021" } }, { "Z1K1": "Z6007", "Z6007K1": { "Z1K1": "Z6092", "Z6092K1": "P805" }, "Z6007K2": { "Z1K1": "Z6091", "Z6091K1": "Q5478323" }, "Z6007K3": { "Z1K1": "Z6020", "Z6020K1": "Z6021" } } ], "Z46673K3": [ "Z39328" ], "Z46673K4": { "Z1K1": "Z60", "Z60K1": "la" } }, "Z46809K2": [ "Z39328" ] }, "Z46811K2": { "Z1K1": "Z60", "Z60K1": "la" } }, "Z46829K2": { "Z1K1": "Z60", "Z60K1": "la" }, "Z46829K3": [ "Z39328" ] }, "Z46850K2": { "Z1K1": "Z60", "Z60K1": "la" }, "Z46850K3": { "Z1K1": "Z6091", "Z6091K1": "Q474328" } } }, "Z889K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, { "Z1K1": "Z6091", "Z6091K1": "Q2403061" }, { "Z1K1": "Z6091", "Z6091K1": "Q179080" } ], "Z889K3": "Z18683" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z844", "Z844K2": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Language-specific sentence ordering: Latin since 1945: the adverbial after the subject" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the order of the roles." } ] } } 7xv9x1111cwwf2iooxf2at161avllax Z46854 0 100439 331020 2026-10-23T02:39:02Z Jsamwrites 938 Create native test (ml) 331020 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46854" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46850", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z889", "Z889K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6091", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z46850", "Z46850K1": { "Z1K1": "Z7", "Z7K1": "Z46829", "Z46829K1": { "Z1K1": "Z7", "Z7K1": "Z46811", "Z46811K1": { "Z1K1": "Z7", "Z7K1": "Z46809", "Z46809K1": { "Z1K1": "Z7", "Z7K1": "Z46673", "Z46673K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } } }, "K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q90" } ], "K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } }, "K1": { "Z1K1": "Z6092", "Z6092K1": "P1082" }, "K2": [ "Z1", { "Z1K1": "Z6010", "Z6010K1": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "2103778" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "1" } }, "Z6010K2": "Z24", "Z6010K3": "Z24", "Z6010K4": { "Z1K1": "Z6091", "Z6091K1": "Q199" } } ] } }, "Z46673K2": [ "Z6007", { "Z1K1": "Z6007", "Z6007K1": { "Z1K1": "Z6092", "Z6092K1": "P585" }, "Z6007K2": { "Z1K1": "Z6064", "Z6064K1": { "Z1K1": "Z6061", "Z6061K1": { "Z1K1": "Z20420", "Z20420K1": { "Z1K1": "Z20159", "Z20159K1": "Z17814", "Z20159K2": { "Z1K1": "Z13518", "Z13518K1": "2023" } }, "Z20420K2": { "Z1K1": "Z20342", "Z20342K1": { "Z1K1": "Z16098", "Z16098K1": "Z16101" }, "Z20342K2": { "Z1K1": "Z13518", "Z13518K1": "1" } } }, "Z6061K2": { "Z1K1": "Z6060", "Z6060K1": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6060K2": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6060K3": { "Z1K1": "Z13518", "Z13518K1": "0" } } }, "Z6064K2": { "Z1K1": "Z6062", "Z6062K1": { "Z1K1": "Z6091", "Z6091K1": "Q577" } }, "Z6064K3": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6064K4": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6064K5": { "Z1K1": "Z16683", "Z16683K1": "Z16661", "Z16683K2": { "Z1K1": "Z13518", "Z13518K1": "0" } }, "Z6064K6": { "Z1K1": "Z6063", "Z6063K1": { "Z1K1": "Z6091", "Z6091K1": "Q1985727" } } }, "Z6007K3": { "Z1K1": "Z6020", "Z6020K1": "Z6021" } } ], "Z46673K3": [ "Z39328" ], "Z46673K4": { "Z1K1": "Z60", "Z60K1": "ml" } }, "Z46809K2": [ "Z39328" ] }, "Z46811K2": { "Z1K1": "Z60", "Z60K1": "ml" } }, "Z46829K2": { "Z1K1": "Z60", "Z60K1": "ml" }, "Z46829K3": [ "Z39328" ] }, "Z46850K2": { "Z1K1": "Z60", "Z60K1": "ml" }, "Z46850K3": { "Z1K1": "Z6091", "Z6091K1": "Q474328" } } }, "Z889K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q2403061" }, { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, { "Z1K1": "Z6091", "Z6091K1": "Q179080" } ], "Z889K3": "Z18683" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z844", "Z844K2": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Language-specific sentence ordering: Malayalam in 2023: the adverbial first" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the order of the roles." } ] } } ryipmq5es67bzg76tbsfg463r4jl3zf Z46855 0 100440 331021 2026-10-23T02:39:05Z Jsamwrites 938 Create native test (dag) 331021 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46855" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46850", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z889", "Z889K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6091", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z46850", "Z46850K1": { "Z1K1": "Z7", "Z7K1": "Z46829", "Z46829K1": { "Z1K1": "Z7", "Z7K1": "Z46811", "Z46811K1": { "Z1K1": "Z7", "Z7K1": "Z46809", "Z46809K1": { "Z1K1": "Z7", "Z7K1": "Z46673", "Z46673K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } } }, "K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q90" } ], "K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } }, "K1": { "Z1K1": "Z6092", "Z6092K1": "P1082" }, "K2": [ "Z1", { "Z1K1": "Z6010", "Z6010K1": { "Z1K1": "Z19677", "Z19677K1": "Z16660", "Z19677K2": { "Z1K1": "Z13518", "Z13518K1": "2103778" }, "Z19677K3": { "Z1K1": "Z13518", "Z13518K1": "1" } }, "Z6010K2": "Z24", "Z6010K3": "Z24", "Z6010K4": { "Z1K1": "Z6091", "Z6091K1": "Q199" } } ] } }, "Z46673K2": [ "Z6007", { "Z1K1": "Z6007", "Z6007K1": { "Z1K1": "Z6092", "Z6092K1": "P585" }, "Z6007K2": { "Z1K1": "Z6064", "Z6064K1": { "Z1K1": "Z6061", "Z6061K1": { "Z1K1": "Z20420", "Z20420K1": { "Z1K1": "Z20159", "Z20159K1": "Z17814", "Z20159K2": { "Z1K1": "Z13518", "Z13518K1": "2023" } }, "Z20420K2": { "Z1K1": "Z20342", "Z20342K1": { "Z1K1": "Z16098", "Z16098K1": "Z16101" }, "Z20342K2": { "Z1K1": "Z13518", "Z13518K1": "1" } } }, "Z6061K2": { "Z1K1": "Z6060", "Z6060K1": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6060K2": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6060K3": { "Z1K1": "Z13518", "Z13518K1": "0" } } }, "Z6064K2": { "Z1K1": "Z6062", "Z6062K1": { "Z1K1": "Z6091", "Z6091K1": "Q577" } }, "Z6064K3": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6064K4": { "Z1K1": "Z13518", "Z13518K1": "0" }, "Z6064K5": { "Z1K1": "Z16683", "Z16683K1": "Z16661", "Z16683K2": { "Z1K1": "Z13518", "Z13518K1": "0" } }, "Z6064K6": { "Z1K1": "Z6063", "Z6063K1": { "Z1K1": "Z6091", "Z6091K1": "Q1985727" } } }, "Z6007K3": { "Z1K1": "Z6020", "Z6020K1": "Z6021" } } ], "Z46673K3": [ "Z39328" ], "Z46673K4": { "Z1K1": "Z60", "Z60K1": "dag" } }, "Z46809K2": [ "Z39328" ] }, "Z46811K2": { "Z1K1": "Z60", "Z60K1": "dag" } }, "Z46829K2": { "Z1K1": "Z60", "Z60K1": "dag" }, "Z46829K3": [ "Z39328" ] }, "Z46850K2": { "Z1K1": "Z60", "Z60K1": "dag" }, "Z46850K3": { "Z1K1": "Z6091", "Z6091K1": "Q474328" } } }, "Z889K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, { "Z1K1": "Z6091", "Z6091K1": "Q179080" }, { "Z1K1": "Z6091", "Z6091K1": "Q2403061" } ], "Z889K3": "Z18683" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z844", "Z844K2": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Language-specific sentence ordering: Dagbani in 2023: the adverbial last" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the order of the roles." } ] } } j8iwmh7915eqkgcb0izofvf7lyxpiok Z46856 0 100441 331022 2026-10-23T02:39:08Z Jsamwrites 938 Create native test (ig) 331022 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46856" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46850", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z889", "Z889K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6091", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z46850", "Z46850K1": { "Z1K1": "Z7", "Z7K1": "Z46829", "Z46829K1": { "Z1K1": "Z7", "Z7K1": "Z46811", "Z46811K1": { "Z1K1": "Z7", "Z7K1": "Z46809", "Z46809K1": { "Z1K1": "Z7", "Z7K1": "Z46673", "Z46673K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } } }, "K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q90" } ], "K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } }, "K1": { "Z1K1": "Z6092", "Z6092K1": "P17" }, "K2": [ "Z1", { "Z1K1": "Z6091", "Z6091K1": "Q29" } ] } }, "Z46673K2": [ "Z6007" ], "Z46673K3": [ "Z39328" ], "Z46673K4": { "Z1K1": "Z60", "Z60K1": "ig" } }, "Z46809K2": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q130192655" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } } ] }, "Z46811K2": { "Z1K1": "Z60", "Z60K1": "ig" } }, "Z46829K2": { "Z1K1": "Z60", "Z60K1": "ig" }, "Z46829K3": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q130192655" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } } ] }, "Z46850K2": { "Z1K1": "Z60", "Z60K1": "ig" }, "Z46850K3": { "Z1K1": "Z6091", "Z6091K1": "Q474328" } } }, "Z889K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, { "Z1K1": "Z6091", "Z6091K1": "Q179080" } ], "Z889K3": "Z18683" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z844", "Z844K2": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Language-specific sentence ordering: Igbo, no adverbial: subject and predicate" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the order of the roles." } ] } } maraq7rs9k3l2yersu5lxpasna5acvl Z46857 0 100442 331023 2026-10-23T02:39:11Z Jsamwrites 938 Create native test (ml) 331023 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46857" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46850", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z889", "Z889K1": { "Z1K1": "Z7", "Z7K1": "Z873", "Z873K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6091", "Z882K2": "Z1" }, "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6091", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "K1" }, "Z803K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" } } } ], "Z8K5": "Z8" }, "Z873K2": { "Z1K1": "Z7", "Z7K1": "Z46850", "Z46850K1": { "Z1K1": "Z7", "Z7K1": "Z46829", "Z46829K1": { "Z1K1": "Z7", "Z7K1": "Z46811", "Z46811K1": { "Z1K1": "Z7", "Z7K1": "Z46809", "Z46809K1": { "Z1K1": "Z7", "Z7K1": "Z46673", "Z46673K1": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6091" }, "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } } }, "K1": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q90" } ], "K2": { "Z1K1": { "Z1K1": "Z7", "Z7K1": "Z882", "Z882K1": "Z6092", "Z882K2": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z1" } }, "K1": { "Z1K1": "Z6092", "Z6092K1": "P17" }, "K2": [ "Z1", { "Z1K1": "Z6091", "Z6091K1": "Q29" } ] } }, "Z46673K2": [ "Z6007" ], "Z46673K3": [ "Z39328" ], "Z46673K4": { "Z1K1": "Z60", "Z60K1": "ml" } }, "Z46809K2": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q130192655" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } } ] }, "Z46811K2": { "Z1K1": "Z60", "Z60K1": "ml" } }, "Z46829K2": { "Z1K1": "Z60", "Z60K1": "ml" }, "Z46829K3": [ "Z39328", { "Z1K1": "Z39328", "Z39328K1": { "Z1K1": "Z6091", "Z6091K1": "Q130192655" }, "Z39328K2": { "Z1K1": "Z6091", "Z6091K1": "Q1478451" } } ] }, "Z46850K2": { "Z1K1": "Z60", "Z60K1": "ml" }, "Z46850K3": { "Z1K1": "Z6091", "Z6091K1": "Q474328" } } }, "Z889K2": [ "Z6091", { "Z1K1": "Z6091", "Z6091K1": "Q164573" }, { "Z1K1": "Z6091", "Z6091K1": "Q179080" } ], "Z889K3": "Z18683" }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z844", "Z844K2": { "Z1K1": "Z40", "Z40K1": "Z41" } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Language-specific sentence ordering: Malayalam, no adverbial: subject and predicate" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the order of the roles." } ] } } nzda4kv22p5urp5og7uxh0euwnezyob Z46858 0 100443 331024 2026-10-23T02:39:14Z Jsamwrites 938 Create native test (fr) 331024 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46858" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46850", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z501K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z5K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z24606", "Z24606K1": { "Z1K1": "Z7", "Z7K1": "Z822", "Z822K1": { "Z1K1": "Z7", "Z7K1": "Z823", "Z823K1": { "Z1K1": "Z99", "Z99K1": { "Z1K1": "Z7", "Z7K1": "Z46850", "Z46850K1": [ "Z1" ], "Z46850K2": { "Z1K1": "Z60", "Z60K1": "fr" }, "Z46850K3": { "Z1K1": "Z6091", "Z6091K1": "Q1122094" } } } } }, "Z24606K2": "errors" } } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "Only declarative sentences (Q474328) are supported so far" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Language-specific sentence ordering: French, a clause type other than declarative is an explicit error" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Checks the order of the roles." } ] } } 5atshrboxg1jstbhmtbymi0f9oojdda Z46859 0 100444 331025 2026-10-23T02:39:17Z Jsamwrites 938 Create Sentence orthographic realization 331025 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46859" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6" }, "Z17K2": "Z46859K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "strings" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46859K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z46859K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "clause type" } ] } } ], "Z8K2": "Z11", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14" ], "Z8K5": "Z46859" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence orthographic realization" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Strings of a sentence joined by spaces (empty strings left out), then the language's punctuation (capital first letter, full stop). Monolingual text." } ] } } dia4jdkbiil2vy8oggna9v17t34w3m2 331039 331025 2026-10-23T05:32:27Z Jsamwrites 938 Added Z46860 to the approved list of implementations 331039 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46859" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6" }, "Z17K2": "Z46859K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "strings" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46859K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z46859K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "clause type" } ] } } ], "Z8K2": "Z11", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", "Z46860" ], "Z8K5": "Z46859" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence orthographic realization" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Strings of a sentence joined by spaces (empty strings left out), then the language's punctuation (capital first letter, full stop). Monolingual text." } ] } } l8atidw3w7hqenwfkcuy9lw82gr7y20 331040 331039 2026-10-23T05:32:30Z Jsamwrites 938 Added Z46861, Z46862, Z46863, Z46864, Z46865, Z46866 and Z46867 to the approved list of test cases 331040 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46859" }, "Z2K2": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": { "Z1K1": "Z7", "Z7K1": "Z881", "Z881K1": "Z6" }, "Z17K2": "Z46859K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "strings" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z60", "Z17K2": "Z46859K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "language" } ] } }, { "Z1K1": "Z17", "Z17K1": "Z6091", "Z17K2": "Z46859K3", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "clause type" } ] } } ], "Z8K2": "Z11", "Z8K3": [ "Z20", "Z46861", "Z46862", "Z46863", "Z46864", "Z46865", "Z46866", "Z46867" ], "Z8K4": [ "Z14", "Z46860" ], "Z8K5": "Z46859" }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence orthographic realization" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Strings of a sentence joined by spaces (empty strings left out), then the language's punctuation (capital first letter, full stop). Monolingual text." } ] } } g249w47kgx00nz9qk0c37i1s2rkr73t Z46860 0 100445 331026 2026-10-23T02:39:19Z Jsamwrites 938 Create the implementation of Sentence orthographic realization 331026 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46860" }, "Z2K2": { "Z1K1": "Z14", "Z14K1": "Z46859", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z19316", "Z19316K1": { "Z1K1": "Z18", "Z18K1": "Z46859K3" }, "Z19316K2": { "Z1K1": "Z6091", "Z6091K1": "Q474328" } }, "Z802K2": { "Z1K1": "Z11", "Z11K1": { "Z1K1": "Z18", "Z18K1": "Z46859K2" }, "Z11K2": { "Z1K1": "Z7", "Z7K1": { "Z1K1": "Z7", "Z7K1": "Z14310", "Z14310K1": "Z46849", "Z14310K2": { "Z1K1": "Z18", "Z18K1": "Z46859K2" } }, "K1": { "Z1K1": "Z7", "Z7K1": "Z876", "Z876K1": { "Z1K1": "Z8", "Z8K1": [ "Z17", { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K1", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } }, { "Z1K1": "Z17", "Z17K1": "Z6", "Z17K2": "Z8K2", "Z17K3": { "Z1K1": "Z12", "Z12K1": [ "Z11" ] } } ], "Z8K2": "Z6", "Z8K3": [ "Z20" ], "Z8K4": [ "Z14", { "Z1K1": "Z14", "Z14K1": "Z8", "Z14K2": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z866K2": "" }, "Z802K2": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z802", "Z802K1": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z866K2": "" }, "Z802K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z7", "Z7K1": "Z10000", "Z10000K1": { "Z1K1": "Z18", "Z18K1": "Z8K1" }, "Z10000K2": " " }, "Z10000K2": { "Z1K1": "Z18", "Z18K1": "Z8K2" } } } } } ], "Z8K5": "Z8" }, "Z876K2": { "Z1K1": "Z18", "Z18K1": "Z46859K1" }, "Z876K3": "" } } }, "Z802K3": { "Z1K1": "Z7", "Z7K1": "Z851", "Z851K1": "Z501", "Z851K2": [ "Z1", "Only declarative sentences (Q474328) are supported so far", "Sentence orthographic realization" ] } } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence orthographic realization, composition" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Strings of a sentence joined by spaces (empty strings left out), then the language's punctuation (capital first letter, full stop). Monolingual text." } ] } } 09a1v9zruwfakhmy457vjn6ykom9f8s Z46861 0 100446 331027 2026-10-23T02:39:22Z Jsamwrites 938 Create native test (en) 331027 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46861" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46859", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z11K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z46859", "Z46859K1": [ "Z6", "paris", "is not in Spain" ], "Z46859K2": { "Z1K1": "Z60", "Z60K1": "en" }, "Z46859K3": { "Z1K1": "Z6091", "Z6091K1": "Q474328" } } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "Paris is not in Spain." } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence orthographic realization: English: joined by spaces, capital letter and full stop" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compares the sentence text." } ] } } 1pxkx2khkndge52ysidwumgd6yowm05 Z46862 0 100447 331028 2026-10-23T02:39:25Z Jsamwrites 938 Create native test (fr) 331028 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46862" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46859", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z11K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z46859", "Z46859K1": [ "Z6", "la France", "", "est un pays" ], "Z46859K2": { "Z1K1": "Z60", "Z60K1": "fr" }, "Z46859K3": { "Z1K1": "Z6091", "Z6091K1": "Q474328" } } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "La France est un pays." } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence orthographic realization: French: an empty string adds no space" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compares the sentence text." } ] } } hfiu6k4fe13c74o52wwrzluk4hfg9l8 Z46863 0 100448 331029 2026-10-23T02:39:28Z Jsamwrites 938 Create native test (la) 331029 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46863" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46859", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z11K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z46859", "Z46859K1": [ "Z6", "Gallia", "ab anno MCMXLV", "socius est" ], "Z46859K2": { "Z1K1": "Z60", "Z60K1": "la" }, "Z46859K3": { "Z1K1": "Z6091", "Z6091K1": "Q474328" } } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "Gallia ab anno MCMXLV socius est." } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence orthographic realization: Latin: three constituents" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compares the sentence text." } ] } } l9ikjjpz2teh5xe6yhiuinqxizidwsc Z46864 0 100449 331030 2026-10-23T02:39:31Z Jsamwrites 938 Create native test (ml) 331030 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46864" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46859", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z11K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z46859", "Z46859K1": [ "Z6", "2023-ൽ", "പാരിസിൽ", "നിവാസികളുണ്ടായിരുന്നു" ], "Z46859K2": { "Z1K1": "Z60", "Z60K1": "ml" }, "Z46859K3": { "Z1K1": "Z6091", "Z6091K1": "Q474328" } } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "2023-ൽ പാരിസിൽ നിവാസികളുണ്ടായിരുന്നു." } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence orthographic realization: Malayalam: no case, full stop" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compares the sentence text." } ] } } iqct3f483z7gosj8v5b4wsa8f94g7g3 Z46865 0 100450 331031 2026-10-23T02:39:34Z Jsamwrites 938 Create native test (ig) 331031 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46865" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46859", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z11K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z46859", "Z46859K1": [ "Z6", "ụlọ", "na-acha uhie uhie" ], "Z46859K2": { "Z1K1": "Z60", "Z60K1": "ig" }, "Z46859K3": { "Z1K1": "Z6091", "Z6091K1": "Q474328" } } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "Ụlọ na-acha uhie uhie." } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence orthographic realization: Igbo: capital on the first letter only" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compares the sentence text." } ] } } by9ich67m0f5s1zixrn4hyqtbt28gci Z46866 0 100451 331032 2026-10-23T02:39:36Z Jsamwrites 938 Create native test (dag) 331032 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46866" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46859", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z60K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z11K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z46859", "Z46859K1": [ "Z6", "yili", "mɔhiya" ], "Z46859K2": { "Z1K1": "Z60", "Z60K1": "dag" }, "Z46859K3": { "Z1K1": "Z6091", "Z6091K1": "Q474328" } } } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "dag" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence orthographic realization: Dagbani: the text keeps its language" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compares the sentence text." } ] } } lszg8ah7ij8uga5xqaitvgg576iu9fh Z46867 0 100452 331033 2026-10-23T02:39:39Z Jsamwrites 938 Create native test (es) 331033 zobject text/plain { "Z1K1": "Z2", "Z2K1": { "Z1K1": "Z6", "Z6K1": "Z46867" }, "Z2K2": { "Z1K1": "Z20", "Z20K1": "Z46859", "Z20K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z501K1" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z803", "Z803K1": { "Z1K1": "Z39", "Z39K1": "Z5K2" }, "Z803K2": { "Z1K1": "Z7", "Z7K1": "Z24606", "Z24606K1": { "Z1K1": "Z7", "Z7K1": "Z822", "Z822K1": { "Z1K1": "Z7", "Z7K1": "Z823", "Z823K1": { "Z1K1": "Z99", "Z99K1": { "Z1K1": "Z7", "Z7K1": "Z46859", "Z46859K1": [ "Z6", "París" ], "Z46859K2": { "Z1K1": "Z60", "Z60K1": "es" }, "Z46859K3": { "Z1K1": "Z6091", "Z6091K1": "Q1122094" } } } } }, "Z24606K2": "errors" } } }, "Z20K3": { "Z1K1": "Z7", "Z7K1": "Z866", "Z866K2": "Only declarative sentences (Q474328) are supported so far" } }, "Z2K3": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Sentence orthographic realization: Spanish, a clause type other than declarative is an explicit error" } ] }, "Z2K4": { "Z1K1": "Z32", "Z32K1": [ "Z31" ] }, "Z2K5": { "Z1K1": "Z12", "Z12K1": [ "Z11", { "Z1K1": "Z11", "Z11K1": "Z1002", "Z11K2": "Compares the sentence text." } ] } } 79v2v2vupe6qz9rmjjixcr9lolmjqtc Translations:Wikifunctions:What Wikifunctions is not/28/en 1198 100453 331050 2026-10-23T08:06:02Z FuzzyBot 207 Importing a new version from external source 331050 wikitext text/x-wiki == Wikifunctions is not (only) the boiler room for Abstract Wikipedia == t8vjy2bvmz713161qj2hpii7xs7mvs0 Translations:Wikifunctions:What Wikifunctions is not/29/en 1198 100454 331051 2026-10-23T08:06:03Z FuzzyBot 207 Importing a new version from external source 331051 wikitext text/x-wiki A '[[$1|boiler room]]', where unsightly-but-vital machinery is hidden 9bikhln7ua1bwp1596ea4mbb9q1vrfo Translations:Wikifunctions:What Wikifunctions is not/30/en 1198 100455 331052 2026-10-23T08:06:03Z FuzzyBot 207 Importing a new version from external source 331052 wikitext text/x-wiki Natural language generation (NLG) is the focus of $1 as of 2026, and the site began as part of the wider [[$2|Abstract Wikipedia project]], but NLG is far from the only field in which functions are being developed. That is to say, WF is necessary for AW, but AW is not necessary for WF. 5dow46fx74jnhq5j042a2qkpxsow842 Translations:Wikifunctions:What Wikifunctions is not/31/en 1198 100456 331053 2026-10-23T08:06:03Z FuzzyBot 207 Importing a new version from external source 331053 wikitext text/x-wiki On top of the computer science staples of Boolean logic, arithmetic, and list manipulation, we have useful functions relating to disciplines such as [[$1|chemistry]], [[$2|dimensional analysis]], [[$3|electrical engineering]], [[$4|genomics]], [[$5|information theory]], [[$6|meteorology]], [[$7|number theory]], [[$8|physiology]], [[$9|probability]], [[$10|quantum mechanics]], [[$11|railroad engineering]], [[$12|timekeeping/chronometry]], and [[$13|trigonometry]]. 1a85rfh8vkbjwc8520yg22cwq3cjwwy Translations:Wikifunctions:How to create implementations/318/en 1198 100457 331076 2026-10-23T08:23:08Z FuzzyBot 207 Importing a new version from external source 331076 wikitext text/x-wiki === Calling another Wikifunctions function === nuw200zitj69u4dpalkmpvldaiqdt8o Translations:Wikifunctions:How to create implementations/319/en 1198 100458 331077 2026-10-23T08:23:08Z FuzzyBot 207 Importing a new version from external source 331077 wikitext text/x-wiki A code implementation can call certain other Wikifunctions functions, receive the output of the call, and use that output in further processing. We refer to such calls as callbacks. At present, due to security and performance concerns, only the following built-in Wikidata fetch and search functions can be called in this way: $1, $2, $3, $4, $5, $6, $7, and $8. This capability is in an initial stage of deployment; we hope to allow calls to a broader range of functions in the future. 2rxsetofq5yabgw9ok6kzhwb8d0qgyz Translations:Wikifunctions:How to create implementations/320/en 1198 100459 331078 2026-10-23T08:23:08Z FuzzyBot 207 Importing a new version from external source 331078 wikitext text/x-wiki Let’s look at a JavaScript implementation containing a callback. This implementation fetches an item from Wikidata, extracts the label of that item in a given language, and returns the label string. The item to fetch is given by argument $1, and the language is given by $2. orp5l68d80bc6qyzqr1gj89wv8876sq Translations:Wikifunctions:How to create implementations/321/en 1198 100460 331079 2026-10-23T08:23:08Z FuzzyBot 207 Importing a new version from external source 331079 wikitext text/x-wiki A callback is made by calling $1, as shown in the example. The first argument to $1 is always the ZID of the function to be called – in this case, $2, which takes a single argument. Following that, the arguments to be passed to that function are listed, separated by commas. Here, that argument, $3, is the same value that was passed to the function $4. This is a common pattern of argument passing to callbacks, but their arguments can also be built using the $5 constructor (as explained above), or obtained in other ways. 9mlsvaqh4vm8nyy7ns00bx8cogqepmx Translations:Wikifunctions:How to create implementations/322/en 1198 100461 331080 2026-10-23T08:23:08Z FuzzyBot 207 Importing a new version from external source 331080 wikitext text/x-wiki The value of $1 would be an instance of $2, containing the QID of the item to be fetched. Line 2 of the example calls $3 to fetch that item from Wikidata and assigns the resulting ZObject to the const $4. The remaining code iterates over the item’s labels until it finds the one matching the language given by $5. d7z8wz0ly2p52pljep40kur98zdzrqm Translations:Wikifunctions:How to create implementations/323/en 1198 100462 331081 2026-10-23T08:23:08Z FuzzyBot 207 Importing a new version from external source 331081 wikitext text/x-wiki For the first example above, we have used $1 for simplicity. However - unless an entire entity is needed by the implementation, it is strongly recommended to use $2 to retrieve Wikidata items, which can be quite large. Although a call to $2 is a bit more complex, its parameters allow for fetching selected portions of a Wikidata item, which can greatly improve performance and avoid some errors, by reducing the network bandwidth and processing time that are needed. ($2 can also be used in place of $3, $4, $5, and $6, to get similar bandwidth-reduction benefits.) 28nt0qbcyshx7ka0d0u6nhv36tr6jqt Translations:Wikifunctions:How to create implementations/324/en 1198 100463 331082 2026-10-23T08:23:08Z FuzzyBot 207 Importing a new version from external source 331082 wikitext text/x-wiki Just below we show how $1 can be used, in $2, to implement the same behavior as above. Note that we use the second argument passed to $1, $3, to say “Just return the item’s labels”, and we use the third argument, $4, to say “Just return labels in the given language”. (This argument would also apply to aliases and descriptions, if they were included in the result.) 81ie595dzls9d1v489o6ylbi4wyri3p Translations:Wikifunctions:How to create implementations/325/en 1198 100464 331083 2026-10-23T08:23:08Z FuzzyBot 207 Importing a new version from external source 331083 wikitext text/x-wiki Other things to note: jdwuft3meyae8smyvficomuttr969it Translations:Wikifunctions:How to create implementations/326/en 1198 100465 331084 2026-10-23T08:23:08Z FuzzyBot 207 Importing a new version from external source 331084 wikitext text/x-wiki Even though code implementations are now able to fetch Wikidata entities, it is recommended that they not be written to return ''entire'' entities. This is because of current limitations on the size of the value returned from a code implementation. To fetch and return an entire large entity, it’s better to call the fetch function from a composition. fce9laajeflmb4fuk91x7zh4t7havpr Translations:Wikifunctions:How to create implementations/327/en 1198 100466 331085 2026-10-23T08:23:08Z FuzzyBot 207 Importing a new version from external source 331085 wikitext text/x-wiki Only one callback can execute at a time. For security reasons, it is not possible to use the concurrency features of JavaScript or Python to execute multiple callbacks in parallel. mzzhelgosyu2tvy4t24ffx6aobhbt04 Translations:Wikifunctions:How to create implementations/328/en 1198 100467 331086 2026-10-23T08:23:08Z FuzzyBot 207 Importing a new version from external source 331086 wikitext text/x-wiki Keep in mind, however, that you can fetch multiple entities at once using Z6820. k3kuoi4h2e9ujq4ibqv8jxq3gr2h0r8 Translations:Wikifunctions:How to create implementations/329/en 1198 100468 331087 2026-10-23T08:23:08Z FuzzyBot 207 Importing a new version from external source 331087 wikitext text/x-wiki There is currently a 3 MiB limit on the size of Wikidata content that can be returned to a code implementation, by a single callback. The same limit applies to the size of the result returned from a code implementation. tjaeafy5zohvav92khzqn4vl8gt3q2r Translations:Wikifunctions:How to create implementations/330/en 1198 100469 331088 2026-10-23T08:23:09Z FuzzyBot 207 Importing a new version from external source 331088 wikitext text/x-wiki '''Error message''' – Error types can contain a multilingual array of HTML parametrized error messages. The parameter notation is $1, $2, etc., where the digit corresponds to the error type key. For example, when creating an error type with one string key "current input", the error message can use the positional parameter "$1", which will be replaced with the value of the "current input" key at the time of rendering the error. To add HTML messages, click on the "[+]" icon below "html fragments", select a language and input the HTML string. 3jpzvr3awwc83hl6e79uugjy0vcthrx Translations:Wikifunctions:How to create implementations/331/en 1198 100470 331089 2026-10-23T08:23:12Z FuzzyBot 207 Importing a new version from external source 331089 wikitext text/x-wiki === Creating actionable error messages === 1abx7eivf0ub7dnq2queglanxkw1pcy Translations:Wikifunctions:How to create implementations/332/en 1198 100471 331090 2026-10-23T08:23:12Z FuzzyBot 207 Importing a new version from external source 331090 wikitext text/x-wiki As described above, Error Types have an optional key $1 which contains a multilingual list of HTML strings. When rendering information about an error, the messages stored in the error type can help create a clear, precise, informative, translatable and actionable error message. 0bgfgbd20t4ld3yypjygu2ys3wlcf6z Translations:Wikifunctions:How to create implementations/333/en 1198 100472 331091 2026-10-23T08:23:12Z FuzzyBot 207 Importing a new version from external source 331091 wikitext text/x-wiki For that purpose, error messages can contain parameters like $1, $2, etc., where the digit corresponds to the error type argument and its value in the error instance. These error messages are rendered in Wikifunctions inside the "Details" dialog window after executing a function call. Additionally, these error messages are surfaced in other client interfaces, like Abstract Wikipedia, to provide better guidance to Abstract Content editors. olbm9ttr478h18xrmn933tmhap87j9b Translations:Wikifunctions:How to create implementations/334/en 1198 100473 331092 2026-10-23T08:23:12Z FuzzyBot 207 Importing a new version from external source 331092 wikitext text/x-wiki The error message is rendered using the HTML message of the error type and the error argument values. 5135bmqlvwwkwnbqxgzxe0rvs1g008j Translations:Wikifunctions:How to create implementations/335/en 1198 100474 331093 2026-10-23T08:23:12Z FuzzyBot 207 Importing a new version from external source 331093 wikitext text/x-wiki When available, the HTML error message is rendered in the Abstract Wikipedia preview section. f290sbcydf7fw15qccu393ripgjn982 Translations:Wikifunctions:How to create implementations/336/en 1198 100475 331094 2026-10-23T08:23:12Z FuzzyBot 207 Importing a new version from external source 331094 wikitext text/x-wiki Let's use a real example to understand the benefits of HTML error messages: qoinv0jste4ffxevn0we9xuxgmdknla Translations:Wikifunctions:How to create implementations/337/en 1198 100476 331095 2026-10-23T08:23:12Z FuzzyBot 207 Importing a new version from external source 331095 wikitext text/x-wiki The function $1 returns the first Lexeme reference given a Wikidata Item reference and a language. When there is no Lexeme for this Item-Language combination, it throws an error of type $2, which has three keys: 79twhb7fu3szn87xtw015ocmdf1faga Translations:Wikifunctions:How to create implementations/338/en 1198 100477 331096 2026-10-23T08:23:12Z FuzzyBot 207 Importing a new version from external source 331096 wikitext text/x-wiki '''$1''' is the input Wikidata item QID fyuicfbwkrpnqxj7i78drp9l1ixzti9 Translations:Wikifunctions:How to create implementations/339/en 1198 100478 331097 2026-10-23T08:23:12Z FuzzyBot 207 Importing a new version from external source 331097 wikitext text/x-wiki '''$1''' is the connecting property, in this case <code>P5137/item for this sense</code> ttzfek5i7uf4npx5t15fcris5dgxbyx Translations:Wikifunctions:How to create implementations/340/en 1198 100479 331098 2026-10-23T08:23:13Z FuzzyBot 207 Importing a new version from external source 331098 wikitext text/x-wiki '''$1''' is the language code 3bx69mjtcs0jcfewu13ufw3b1ou0vkw Translations:Wikifunctions:How to create implementations/341/en 1198 100480 331099 2026-10-23T08:23:13Z FuzzyBot 207 Importing a new version from external source 331099 wikitext text/x-wiki When calling this function for a Wikidata lexeme that doesn't exist, the call will throw an error instance like this: f3o1cxnwydh7wbk58cxkl2fot782bfp Translations:Wikifunctions:How to create implementations/342/en 1198 100481 331100 2026-10-23T08:23:13Z FuzzyBot 207 Importing a new version from external source 331100 wikitext text/x-wiki While the error type label indicates: <code>No matching lexeme for item in language</code>, a better error message should indicate: gt3veglqamhymwv82qh0hyadp2ekg0j Translations:Wikifunctions:How to create implementations/343/en 1198 100482 331101 2026-10-23T08:23:13Z FuzzyBot 207 Importing a new version from external source 331101 wikitext text/x-wiki which is the failing item, kfxixnvhc0ut6w19wrrrxg7esgjqnrb Translations:Wikifunctions:How to create implementations/344/en 1198 100483 331102 2026-10-23T08:23:13Z FuzzyBot 207 Importing a new version from external source 331102 wikitext text/x-wiki which is the language missing, and 22s3tjfeien8jfjlmleof0fb6ydrzkc Translations:Wikifunctions:How to create implementations/345/en 1198 100484 331103 2026-10-23T08:23:13Z FuzzyBot 207 Importing a new version from external source 331103 wikitext text/x-wiki what are the possible ways to fix it. d5dm6w2vue7zdqytnfl3omaghmn61ca Translations:Wikifunctions:How to create implementations/346/en 1198 100485 331104 2026-10-23T08:23:13Z FuzzyBot 207 Importing a new version from external source 331104 wikitext text/x-wiki The error message $1 field can provide this functionality. Whenever an Error Type has an error message for the user language (or any of its fallbacks), the error message shown will be rendered by: 9fhiwfl4h3awuexoknrzym85x2qdmf4 Translations:Wikifunctions:How to create implementations/347/en 1198 100486 331105 2026-10-23T08:23:13Z FuzzyBot 207 Importing a new version from external source 331105 wikitext text/x-wiki First, replacing the message parameters with the values of the keys. In our example, any $1 will be replaced with the value of $2 ("Q319"), $3 with "P5137", and $4 with "ast", pxmot43xl1qrxpe25qyu9gu0x8ndx9s Translations:Wikifunctions:How to create implementations/348/en 1198 100487 331106 2026-10-23T08:23:13Z FuzzyBot 207 Importing a new version from external source 331106 wikitext text/x-wiki Last, sanitizing and rendering the HTML message. 96c6hhs5rke4vmxgq9k6f8h7ftk6v7m Translations:Wikifunctions:How to create implementations/349/en 1198 100488 331107 2026-10-23T08:23:13Z FuzzyBot 207 Importing a new version from external source 331107 wikitext text/x-wiki So a HTML message like: j9y0tvalbpwd8lmarbyh6wzarzb5z45 Translations:Wikifunctions:How to create implementations/350/en 1198 100489 331108 2026-10-23T08:23:13Z FuzzyBot 207 Importing a new version from external source 331108 wikitext text/x-wiki Will become: 34lnqmevsvubj1bbwku0txnwr8sst1r Translations:Wikifunctions:Reserved ZIDs/277/de 1198 100490 331129 2026-10-23T08:24:40Z Ameisenigel 44 Created page with "(Siehe [[$1|§ Wikidata-Typen]] unten.)" 331129 wikitext text/x-wiki (Siehe [[$1|§ Wikidata-Typen]] unten.) ocijyts10qme2qyfl8gjszbalvwp35c Translations:Wikifunctions:Reserved ZIDs/278/de 1198 100491 331131 2026-10-23T08:25:19Z Ameisenigel 44 Created page with "(Siehe [[$1|§ Wikidata-Funktionen]] unten.)" 331131 wikitext text/x-wiki (Siehe [[$1|§ Wikidata-Funktionen]] unten.) pdzkkk6m7g1v4p1im8833gqmie9sk40 Translations:Wikifunctions:Reserved ZIDs/279/de 1198 100492 331133 2026-10-23T08:26:12Z Ameisenigel 44 Created page with "$1 (Typ): da es eine Z9 ist, aber als Z6" 331133 wikitext text/x-wiki $1 (Typ): da es eine Z9 ist, aber als Z6 son74slwh13oblsqgtkgiw819ndmwoq Translations:Wikifunctions:Naming conventions/24/de 1198 100493 331137 2026-10-23T08:27:17Z Ameisenigel 44 Created page with "== Sprachspezifische lokale Namenskonventionen ==" 331137 wikitext text/x-wiki == Sprachspezifische lokale Namenskonventionen == 2kqheapejzonsvik6so4hzd7ec8zdeh Translations:Wikifunctions:Naming conventions/25/de 1198 100494 331139 2026-10-23T08:28:48Z Ameisenigel 44 Created page with "Einige Sprachen haben möglicherweise eigene, sprachspezifische Namenskonventionen (diese sollten idealerweise durch Diskussionen innerhalb der jeweiligen Community, die die Sprache spricht, festgelegt werden, wobei viele vermutlich noch Entwürfe sind)." 331139 wikitext text/x-wiki Einige Sprachen haben möglicherweise eigene, sprachspezifische Namenskonventionen (diese sollten idealerweise durch Diskussionen innerhalb der jeweiligen Community, die die Sprache spricht, festgelegt werden, wobei viele vermutlich noch Entwürfe sind). 24zbqsdecm6wpnca1gaq1ucg0s56mj2