# Order of evaluation and ratios

## Recommended Posts

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))))```
##### Share on other sites

Sorry Julio but I don't understand what you are looking for.

Could you show we the output you are looking for.

##### Share on other sites

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

##### Share on other sites

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

##### Share on other sites

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

## Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

×   Pasted as rich text.   Paste as plain text instead

Only 75 emoji are allowed.

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
• #### Browser

• Video Gallery

• Lessons