代码之家  ›  专栏  ›  技术社区  ›  Daniel Lyons Paulo Moura

使用命名函数减少2

  •  1
  • Daniel Lyons Paulo Moura  · 技术社区  · 7 年前

    我正在使用GNU APL。此外,我不确定这是什么正确的名字,但基本的想法是,我有一个清单的事情,我想做的每一对。它很复杂,所以我为它做了一个函数。我注意到这是可行的:

          2+/1 2 3 4 5
    ┌→──────┐
    │3 5 7 9│
    └───────┘
    

          2{⍺+⍵}/1 2 3 4 5
    ┌→──────┐
    │3 5 7 9│
    └───────┘
    

    然而,如果我给这个函数起一个名字,它似乎不起作用:

          ∇R←X FOO Y
             R←X+Y
          ∇
    
          2FOO/1 2 3 4 5
    SYNTAX ERROR
    μ-Z__pA_LO_REDUCE_X4_B[3]  μ-T←⊂(⊃μ-B3[μ-H;μ-a-μ-M;μ-L])μ-LO⊃μ-T
                               ^    ^
    

    2 回复  |  直到 7 年前
        1
  •  2
  •   Adám    7 年前

    它适用于当前的GNU APL(1.7,svn 1013)。

          ∇r←x foo y
    [1] r←x + y
    [2] ∇
          2 foo / 1 2 3 4
    3 5 7
    
        2
  •  2
  •   Jürgen Sauermann    7 年前

    您看到的-前缀(一开始就不应该看到)将内置宏中的名称与用户定义的名称区分开来。如果删除y前缀,则您看到的错误消息会变得更可读:

    Z_upa_LO_REDUCE_X4_B[3]T(B3[H;a-M;L])批次

    (APL宏)Z_upa_LO_REDUCE_X4_B的第3行出现语法错误 在GNU APL资源中,然后告诉您完整的故事:

    /// reduce N-wise: Z←A LO/[X] B with positive A
    //
    mac_def(   Z__pA_LO_REDUCE_X4_B,
    " Z←A1 (LO Z__pA_LO_REDUCE_X4_B) [X4] B;rho_B3;B3;rho_Z;rho_Z3;T;H;M;L;a;N;I;I_max\n"
    " (X4 rho_Z rho_Z3 rho_B3)←X4 ◊ B3←rho_B3⍴B ◊ I_max←⎕IO+⍴I←,⍳⍴Z←(rho_Z3)⍴0 ◊ N←⎕IO\n"
    "LOOPN: (H a L)←⊃I[N] ◊ M←A1+1 ◊ T←B3[H;a-A1;L]\n"
    "LOOPM: T← ⊂(⊃B3[H;a-M;L]) LO ⊃T ◊ →(0≥M←M+1)⍴LOOPM\n"
    "       Z[H;a;L]←T               ◊ →(I_max>N←N+1)⍴LOOPN\n"
    " Z←rho_Z⍴Z\n")
    

    简而言之:mac_def()是一个C++宏,它建立了一个定义的APL系统函数,该函数使用“名称空间”,以避免名称与用户定义的名称冲突。

    推荐文章