辅助函数

以下是一些并不是适合任何情境中的辅助功能。看看您是否可以猜出它们的预期功能。

  1. (fun {flip f a b} {f b a})
  2. (fun {ghost & xs} {eval xs})
  3. (fun {comp f g x} {f (g x)})

flip函数接受一个函数f和两个参数ab。然后它使得f先处理b而后再处理a,这是相反的顺序。当我们想要函数仅部分计算时,这可能很有用。在我们想要通过进传递第二个参数就能够部分计算一个函数的时候,我们能够使用flip来给我们一个新的函数,能够将最初的两个参数以相反的顺序输入。

这意味着如果要应用函数的第二个参数,只需将第一个参数应用于此函数的flip即可。

  1. lispy> (flip def) 1 {x}
  2. ()
  3. lispy> x
  4. 1
  5. lispy> def {define-one} ((flip def) 1)
  6. ()
  7. lispy> define-one {y}
  8. ()
  9. lispy> y
  10. 1
  11. lispy>

我想不出这个ghost函数的用途,但它看起来很有趣。它接受任意数量的参数并将它们作为表达式本身进行计算。所以它只是位于像鬼一样的表达式的前面,根本不与程序进行交互或改变程序的行为。如果您能想到它的用途,我很乐意倾听您的想法。

  1. lispy> ghost + 2 2
  2. 4

comp函数用于组合两个函数。它的输入为fg以及一个传递到g的参数。然后它将此参数应用到g后,再把结果应用到f当中去。这可以用于将两个函数组合成一个新函数,串联地应用两个函数。像以前一样,我们可以将它与部分计算结合起来,从简单的函数中构建复杂的函数。

例如,我们可以组合两个函数。一个否定一个数字,另一个解包一个数字列表,并用*进行相乘。

  1. lispy> (unpack *) {2 2}
  2. 4
  3. lispy> - ((unpack *) {2 2})
  4. -4
  5. lispy> comp - (unpack *)
  6. (\ {x} {f (g x)})
  7. lispy> def {mul-neg} (comp - (unpack *))
  8. ()
  9. lispy> mul-neg {2 8}
  10. -16
  11. lispy>