2016-04-11 11 views
1

In vielen anderen Programmiersprachen können Sie eine Funktion als Argument an eine andere Funktion übergeben und von der Funktion aus aufrufen.Übergeben Sie eine Funktion als Parameter in Netlogo

Gibt es sowieso in Netlogo dies zu tun?

wie die folgenden:

;; x,y,z are all ints 
to-report f [x y z] 
    report x + y + z 
end 

;; some-function is a function 
;; x y and z are ints 
to-report g [some-function x y z] 
    report (some-function x y z) + 2 
end 

to go 
    show g f 1 2 3 
end 

Dies wäre ein nettes Feature sein. Ich versuche, einen abstrakten lokalen Suchalgorithmus zu implementieren, der für die Weitergabe von Zielfunktionen und dergleichen geeignet wäre.

Antwort

4

Sie können Funktionen als Parameter übergeben, indem Sie eine Aufgabe erstellen und das runresult zum Ausführen der Aufgabe verwenden.

;; x,y,z are all ints 
to-report f [x y z] 
    report x + y + z 
end 

;; some-function is a function 
;; x y and z are ints 
to-report g [some-function x y z] 
    report (runresult some-function x y (z + 2)) 
end 

to go 
    show g (task f) 1 2 3 
end 
+2

yup. Weitere Informationen zu Aufgaben finden Sie unter http://ccl.northwestern.edu/netlogo/docs/programming.html#tasks –

1

Sie können die Funktion nicht als Funktion übergeben (ich glaube), aber Sie können sicherlich den Funktionsnamen als Text übergeben und dann verwenden Sie die runresult Primitive, um die Funktion auszuführen. Unordentlich, aber machbar.

+0

Danke für Ihren Vorschlag; Mit Ihrer Hilfe habe ich jedoch die Lösung gefunden. Sie sollten das Ergebnis nicht in einer Zeichenfolge ausführen, sondern stattdessen die Funktion in eine Aufgabe umwandeln und das Ergebnis für die Aufgabe mit der entsprechenden Eingabe ausführen, die viel besser funktioniert. – mattsap

2

Ab Netlogo 6.0.1 ersetzt die Pfeilsyntax Tasks. Das Folgende tut dasselbe wie die angenommene Antwort, aber mit der aktualisierten Syntax.

to-report f [x y z] 
    report x + y + z 
end 

;; some-function is a function 
;; x y and z are ints 
to-report g [some-function x y z] 
    report (runresult some-function x y (z + 2)) 
end 


to go 
    show g [[x y z] -> (f x y z)] 1 2 3 
end 
Verwandte Themen