Я понимаю синтаксис Haskell.
Я хочу карри (частично применить) функцию с именем «play-note» и передать один аргумент «вручную», а второй - с картой.
Если бы я мог написать это на Хаскеле, я бы сказал:
playNote :: Time -> Instrument -> Int -> Int -> Int -> Int -> Music -- made up, but just to give you an idea
notes = [46, 47, 35, 74]
loopGo = True
loop time = do mapM_ (playNote' time) notes
if loopGo then (loop (time+(second/2))) else return () -- time element removed
playNote' time pitch = playNote time drums pitch 80 11025 9 -- ignore extra args
На схеме вот лучшее, что у меня есть:
(define notes '(46 47 35 74))
(define *loop-go* #t)
(define play-note-prime
(lambda (time2)
(lambda (pitch)
(play-note time2 drums pitch 80 11025 9)))) ; drums is another variable
(define loop
(lambda (time)
(map (play-note-prime time) notes)
(if *loop-go*
(callback (+ time (/ *second* 2)) 'loop (+ time (/ second 2)))))) ; time element is more sophisticated here
Схемаверсия "компилируется", но не делает то, что я ожидаю (карри 1-й аргумент, затем 2-й).Помогите?Спасибо!
Редактировать:
Суть моей проблемы в том, что я не могу определить функцию, которая принимает два аргумента, таким образом, что следующий код дает правильный результат:
map ({some function} {some value; argument 1}) {some list; each element will be an argument 2}