2015-10-16 3 views
0

Следующая helloworld функция просто выводит Привет, мирCommon Lisp: функция А передает функцию B, которая передает его С, который вызывает функцию

(defun helloworld() 
    (format t "Hello, world")) 

Я создал функцию A, которая проходит helloworld функционировать B:

(defun A() 
    (B #'helloworld)) 

Функция B затем передает функцию, чтобы функционировать C:

(defun B (fn) 
    (C#'fn)) 

Функция C затем вызывает функцию (то есть, он вызывает helloworld):

(defun C (fn) 
    (funcall fn)) 

Когда я запускаю программу:

(A) 

я получаю сообщение об ошибке:

Error in FUNCTION [or a callee]: The function FN is undefined. 

Почему?

Как исправить это?

ответ

3

Ах, я только что обнаружил ошибку моего пути.

Функция A проходит функцию helloworld к B:

(defun A() 
    (B #'helloworld)) 

Так Bимеет функцию и поэтому B нет необходимости использовать #' (или function), чтобы получить функция. Таким образом, B просто необходимо передать функцию C:

(defun B (fn) 
    (C fn)) 

Аналогично, C имеет функцию и поэтому просто необходимо вызвать функцию:

(defun C (fn) 
    (funcall fn)) 

TaDa! Это работает!

+0

Вероятно, вам следует принять один из ответов (либо ваш, либо другой). –

7
(C#'fn) 

Это выглядит для функции называется fn созданной с вещами, как defun, labels, flet и т.д. Вы переменный, которая содержит функцию, поэтому вы должны просто направить его на C, а не отрываясь своим названием:

(defun B (fn) 
    (C fn)) 
;  ^^ no #' 

Live Demo

+1

идеон, похоже, использует Flash. Убедитесь, что вы удалили Flash. С Flash постоянно возникают проблемы с безопасностью, и теперь известна незащищенная проблема безопасности: http://arstechnica.com/security/2015/10/new-zero-day-exploit-hits-fully-patched-adobe-flash/ –

Смежные вопросы