Path: utzoo!attcan!uunet!rosevax!ernie.Rosemount.COM!merlyn From: merlyn@ernie.Rosemount.COM (Brian Westley) Newsgroups: comp.lang.c Subject: pure functions are tricky Message-ID: <7256@rosevax.Rosemount.COM> Date: 20 Feb 89 03:53:20 GMT Sender: news@rosevax.Rosemount.COM Reply-To: merlyn@ernie.rosemount.com Lines: 42 It's starting to look like pure functions are like noalias; everyone knows what it "means" until you look at it more closely. Simple repeat calls should be optimizable: y = sin(x) * sin(x) ; z = 1.0 / sin(x++) ; /* remember to preserve calling side effect */ It should be possible (and legal) to optimize-out the call completely: a = b ; ... x = fudge + (sin(a) - sin(b))/100 ; Now, should it be possible to fold pure functions with constant arguments? x = sin(sqrt(2.0)) ; /* turns into simple assignment to a constant? */ This seems reasonable and desirable, but what about user defined functions? What about pure functions that can only be evaluated at run time, such as a function that returns the name of the machine the program is running on? Can the compiler determine that one pure function can be evaluated completely at compile-time, and another cannot? Or should only the former be considered "pure"? What about functions that have a first-time-through flag that, e.g., precomputes a table of factorials? Does this destroy its purity? Somewhat related, is this a legal optimization? static int sqrs[10]; main() { int i; for (i=0; i<10; i++) sqrs[i] = i * i; /* no further assignments to sqrs[] */ ... static int sqrs[10] = { 0, 1, 4, 9, 16, 25, 36, 49, 64, 81 }; main() { int i; ... ----- Merlyn LeRoy