Меня интересует оператор «swap-arg», который принимает в качестве входного сигнала 1) функцию f из n переменных и 2) индекс k, а затем возвращает ту же функцию, кроме первая и k-я входные переменные заменены. например, (в математической нотации):Аргументы функции порядка порядка в Lisp
(swap-arg(f,2))(x,y,z,w) = f(z,y,x,w)
Теперь моя первая идея заключается в том, чтобы осуществить это, используя rotatef следующим образом,
(defun swap-args (f k) (lambda (L) (f (rotatef (nth k L) (car L)))))
Однако, это, кажется, безвкусный, так как он использует rotatef на входе. Кроме того, это O (n) и может быть O (n^2) на практике, если применить повторно, чтобы переиндексировать все.
Это похоже на общую проблему, о которой люди уже подумали, но я ничего не смог найти. Каков хороший способ обменивать входы таким образом? Существует ли стандартный метод, который люди используют?
Ваша функция f не имеет n переменных. Он вызывается в вашем примере как одна функция аргумента. –
То, как я его настраиваю, думаю, что вы правы, он принимает список в качестве аргумента. Можно было бы назвать это следующим образом: (f (x y z w)) Я не зацикливаюсь на том, чтобы называть его таким образом, что бы заменяло литеральные аргументы, например (f x y z w) -> (f z y x w) было бы хорошо. –
, если X является функцией, вы можете назвать это так. Если нет, вы получите сообщение об ошибке. –