julio d'escrivan Posted April 12, 2016 Share Posted April 12, 2016 Hi, Sorry if this is too basic!! I'm trying really to understand details in the order of evaluation. In a recursive line, does the inner nest always produce ALL of its elements before passing the list to the outer nest? in the example below I think this is what happens: 1. randomize-octaves in the list x, the randomise operates on each element of the list in turn and thus creates a new list 2. evaluate that 5 times, thus creating five list with different octave randomisation because the seed is nil 3. the 5 lists are modified where each sequential element in a list may be repeated three times for each element that is not repeated... ratio 1:3 (so it is 3 times as likely to stutter a value than not, correct?) thank you, Julio ;;here is a simple list of pitches (setf x '(a3 b3 c3 d3 e3)) ;; what I want is for a random octave to be evaluated for each individual note of the list... ;; so I did this and it seems to work... (setf exp1 (gen-repeat-seq '(5) 1 3 (gen-eval 5 '(randomize-octaves '(c0 g6) x :seed nil)))) Quote Link to comment Share on other sites More sharing options...
opmo Posted April 12, 2016 Share Posted April 12, 2016 Sorry Julio but I don't understand what you are looking for. Could you show we the output you are looking for. Quote Link to comment Share on other sites More sharing options...
julio d'escrivan Posted April 12, 2016 Author Share Posted April 12, 2016 Hi J, I think I obtained the result I wanted, but I am not entirely sure I understand the process... I wanted 5 versions of the original list where each element had its 8ve randomised, as opposed to each sub-list being transposed, and I obtained that. I just want to be sure I understand the order of execution of operations upon a list when they are nested. It seems each function is executed completely before moving to the next outer function, thus passing a list to the next function (as opposed to each element in turn, which I think is what happens with a stream). I guess I am confused between streams and lists (which is what I work with in SC and lists here). This is proving to be a hard learning curve, so thanks for your help. Julio Quote Link to comment Share on other sites More sharing options...
Rangarajan Posted April 15, 2016 Share Posted April 15, 2016 Hi Julio, In my understanding, the order of evaluation of forms is left to right. When we write Macros, we are expected to adhere to this convention. If there is a need to be different, it should be noted clearly. In your example, at the top level, "gen-repeat-seq" will be evaluated after "expl". Within "gen-repeat-seq", after evaluating its first 3 args, evaluation of "gen-eval" will start. Within that "randomize-octaves" takes place, and so on. In other words, "gen-eval"will finish only AFTER "randomize-octaves" finishes; "gen-repeat-seq" will complete only AFTER "gen-eval" completes. Hope this is clear? In some languages, this order is not guaranteed, for example in C++. Regards, Rangarajan opmo 1 Quote Link to comment Share on other sites More sharing options...
Rangarajan Posted April 16, 2016 Share Posted April 16, 2016 In continuation of the above reply, try to evaluate the following in your Listener: (and (print 1) (print 2) (print (+ (print 3) (print 4))) "Done") You should see this: 1 2 3 4 7 "Done" This shows left-to-right evaluation. More importantly, because of nested evaluation, 7 is printed only after 3 and 4 Regards, Rangarajan Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.