Каррирование в GNU APL

Я пытался "каррировать" функцию в GNU APL, но, похоже, это не работает?

Например:

      (1∘+) 1
SYNTAX ERROR
      (1∘+)1
      ^   ^

Что я делаю неправильно? Не тот глиф использовать?

1 ответ

Решение

GNU APL не имеет значения привязки, найденный в Dyalog и связанных реализациях. Вместо этого глиф используется исключительно для обозначения внешнего продукта, ∘.f.

Однако вы можете сами определить разумную замену:

∇ r←(a o b)z
  →3⌊⎕NC'b'
  r←z a b ⋄ →0
  r←a b z
∇

Его можно использовать почти как примитив, за исключением того, что требуется пробел рядом с именем слева или не-глиф справа:

      (1o+) 1
2
      (+o 1) 1
2
      1o+ 1
2

Обратите внимание, что указанная выше замена не обеспечивает композицию функций. Чтобы также включить это, мы должны пойти на более сложное определение:

∇ r←x(a o b)y  ⍝ ∘
  →2⌈¯5+2⊥3⌊⎕NC⍪'ab'
  r←a b y ⋄ →0 ⍝ A∘f
  r←y a b ⋄ →0 ⍝ f∘B
  ⍎'x←{⍵}'/⍨0=⎕NC'x'
  r←x a b y    ⍝ f∘g
∇

Теперь все работает:

      (1o+) 1
2
      (+o 1) 1
2
      1o+ 1
2
      1+o|¯1
2
Другие вопросы по тегам