Если вы запускаете оболочку в интерактивном режиме, а целевой каталог статичен, вы можете просто поместить псевдоним в ваш файл ~/.bashrc
:
alias cdfoo='cd theFooDir'
При работе с неинтерактивными сценариями оболочки, вы можете создать протокол между родительским скриптом Bash и скриптом child Bash. Один из способов реализации этого заключается в том, чтобы позволить дочернему скрипту сохранять путь в файл (например, ~/.new-work-dir
). После завершения дочернего процесса родительский процесс должен будет прочитать этот файл (например, cd `cat ~/.new-work-dir`
).
Если вы планируете часто использовать правило, упомянутое в предыдущем абзаце, я бы предложил вам скачать Bash и исправить его так, чтобы он автоматически менял рабочий каталог на содержимое ~/.new-work-dir
после каждого запуска команды. В патче вы можете даже реализовать полностью новую встроенную команду Bash, которая соответствует вашим потребностям и реализует протокол, который вы хотите реализовать (эта новая команда, вероятно, не будет принята разработчиками Bash). Но исправление работает для личного использования и для использования в меньшем сообществе.
Обычно вы просто используете лямбда:
fun x y z -> f x y 42
- это функция, подобная 'f', но с третьим параметром, привязанным к 42.
Вы также можете использовать комбинаторы (например, кто-то упомянул Haskell's " flip "в комментарии), которые меняют порядок аргументов, но я иногда нахожу это запутанным.
Обратите внимание, что большинство каррированных функций написаны так, что сначала идет аргумент, который, скорее всего, будет частично применен.
В F # есть именованные параметры для методов (а не значения функции, привязанные к let), но имена применяются к «кортежным» параметрам. Именованные параметры каррирования не имеют особого смысла; если у меня есть каррированная функция с двумя аргументами 'f', я бы ожидал, что с учетом
let g = f
let h x y = f x y
, тогда 'g' или 'h' будут заменены на 'f', но 'именованные' параметры делают это не обязательно истинным. То есть '
OCaml, язык, на котором основан F #, имеет помеченные (и необязательные) аргументы, которые можно указывать в любом порядке, и вы можете частично применить функцию на основе имен этих аргументов. Я не верю, что в F # есть такая возможность.
Вы можете попробовать создать что-то вроде функции Haskell flip
. Создание вариантов, которые перемещают аргумент дальше в списке аргументов, не должно быть слишком сложным.
let flip f a b = f b a
let flip2 f a b c = f b c a
let flip3 f a b c d = f b c d a
В Python вы можете использовать functools.partial
или лямбду. Python имеет именованные аргументы.
functools.partial
может использоваться для указания первых позиционных аргументов, а также любого именованного аргумента.
from functools import partial
def foo(a, b, bar=None):
...
f = partial(foo, bar='wzzz') # f(1, 2) ~ foo(1, 2, bar='wzzz')
f2 = partial(foo, 3) # f2(5) ~ foo(3, 5)
f3 = lambda a: foo(a, 7) # f3(9) ~ foo(9, 7)