You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@thrift.apache.org by "ASF GitHub Bot (JIRA)" <ji...@apache.org> on 2017/07/29 00:41:00 UTC

[jira] [Commented] (THRIFT-4270) Generate Erlang mapping functions for const maps and lists

    [ https://issues.apache.org/jira/browse/THRIFT-4270?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16105921#comment-16105921 ] 

ASF GitHub Bot commented on THRIFT-4270:
----------------------------------------

GitHub user dhull opened a pull request:

    https://github.com/apache/thrift/pull/1320

    THRIFT-4270: Generate Erlang mapping functions for const maps and lists

    The Erlang generator now creates a new constants module containing two functions for each const map and list.
    
    The first function takes a single argument, the key for a const map or the index for a const list, and returns the corresponding value for that key or index; it throws an exception if the key does not exist or the index is out of range.
    
    The second function is similar to the first but takes a default second element, and returns this default instead of throwing an exception if the key does not exist or the index is out of range.
    
    For example, if example.thrift contains the following Thrift definitions:
    
    ```thrift
    const map<string, string> ALPHABET = { "a" : "apple", "b" : "banana" }
    const list<string> NUMBER = [ "one", "two", "three" ]
    ```
    
    then these calls will succeed:
    
    ```erlang
    "apple" = example_constants:alphabet("a"),
    "three" = example_constants:number(3),
    ```


You can merge this pull request into a Git repository by running:

    $ git pull https://github.com/dhull/thrift thrift-4270-erlang-mapping-functions

Alternatively you can review and apply these changes as the patch at:

    https://github.com/apache/thrift/pull/1320.patch

To close this pull request, make a commit to your master/trunk branch
with (at least) the following in the commit message:

    This closes #1320
    
----
commit 3ec8e6a542c1f59908deabafd7ce94f459dfa038
Author: David Hull <da...@openx.com>
Date:   2017-07-28T21:13:23Z

    Remove unused t_erl_generator::export_types_function function.

commit 3d1ec6131268a803c701f02480ac758c4cbcb5f2
Author: David Hull <da...@openx.com>
Date:   2017-07-28T18:52:21Z

    THRIFT-4270: Generate Erlang mapping functions for const maps and lists.
    
    The Erlang generator now creates a new constants module containing two
    functions for each const map and list.
    
    The first function takes a single argument, the key for a const map or
    the index for a const list, and returns the corresponding value for
    that key or index; it throws an exception if the key does not exist or
    the index is out of range.
    
    The second function is similar to the first but takes a default second
    element, and returns this default instead of throwing an exception if
    the key does not exist or the index is out of range.
    
    For example, if example.thrift contains the following Thrift definitions:
    
        const map<string, string> ALPHABET = { "a" : "apple", "b" : "banana" }
        const list<string> NUMBER = [ "one", "two", "three" ]
    
    these calls will succeed:
    
        "apple" = example_constants:alphabet("a"),
        "three" = example_constants:number(3),

----


> Generate Erlang mapping functions for const maps and lists
> ----------------------------------------------------------
>
>                 Key: THRIFT-4270
>                 URL: https://issues.apache.org/jira/browse/THRIFT-4270
>             Project: Thrift
>          Issue Type: Improvement
>          Components: Erlang - Compiler
>    Affects Versions: 0.10.0
>            Reporter: David Hull
>            Priority: Minor
>
> The Thrift Erlang compiler generates macros for consts. This is great for scalar types and structs. However the macro that is generated for a map is something like
> {code:none}
> -define(CONSTANTS_DEMO_GEN_MAP, dict:from_list([{35532,233},{43523,853}])).
> {code}
> This is not as useful as the other macros, because any use of this macro will generate the dict at run time. (It is possible to work around this issue by using the ct_expand parse transform.)
> It would be better to generate a function directly to do the transform. The function for the previous example would be
> {code:none}
> gen_map(35532) -> 233;
> gen_map(43523) -> 853.
> {code}
> Similarly, the macro that is generated for a list is something like:
> {code:none}
> -define(CONSTANTS_DEMO_GEN_LIST, [235235,23598352,3253523]).
> {code}
> This representation is fine if you want to iterate over the elements of the list, but is not efficient if you need to look an element because lists in Erlang are implemented as singly-linked lists. For lookups, it would be better to generate a tuple and then use {{element(N, Tuple)}} to extract the nth element.
> The thrift generator could generate a function to do the lookup:
> {code:none}
> gen_list(N) -> element(N, {235235,23598352,3253523}).
> {code}



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)