LINUX.ORG.RU

[lisp] Внутри функции с аргументом сделать лямбду с вызовом функии с передачей ей значения аргумента

 


0

2

Что-то наподобие:

(defun HighFunc (string_arg)
    (lambda () (somelowfunc "value_of_string_arg")))
Возможно?

★★★★★

Последнее исправление: Bad_ptr (всего исправлений: 2)

Ответ на: комментарий от Legioner

Дык потом, когда эта лямбда вызывается, то оно пытается обратиться к переменной string_arg, которой, ясное дело нету в пределах видимости, а если и есть, то это уже другая переменная. :)
Вот, а надо чтобы в лямбду как-то эта строка захардкодилась.

Bad_ptr ★★★★★
() автор топика
Ответ на: комментарий от Bad_ptr

Дык потом, когда эта лямбда вызывается, то оно пытается обратиться к переменной string_arg, которой, ясное дело нету в пределах видимости

Простите, что?

korvin_ ★★★★★
()
Ответ на: комментарий от Bad_ptr

Это не паскаль, всё будет работать как надо.

Legioner ★★★★★
()

lexical-scoping вроде называется, archimag уже привел пример

на всякий случай: если это недолисп вроде elisp, то нужно lexical-let из cl (или макросом).

anonymous
()

Всем спасибо.

Bad_ptr ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Ну это понятно, но для иллюстрации захвата энвайронмента оно не нужно.

mv ★★★★★
()
Ответ на: комментарий от anonymous

На мой взгляд правильнее вызывать COPY-SEQ до вызова HIGH-FUNC. Копирование может и не понадобиться. Пусть вызывающий решает.

dave ★★★★★
()
Ответ на: комментарий от Bad_ptr

Дык потом, когда эта лямбда вызывается, то оно пытается обратиться к переменной string_arg, которой, ясное дело нету в пределах видимости, а если и есть, то это уже другая переменная. :)

Когда вызывается лямбда, она обратится именно к этой переменной. Просто надо понимать, что строка, на которую указывает переменная, может измениться.

dmitry_vk ★★★
()

Если copy-seq внутри не нужен, то и let тоже не нужен. Просто string_arg захватится

(defun HighFunc (string_arg) (lambda () (somelowfunc string_arg)))

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.