From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.1.3 (2006-06-01) on yquem.inria.fr X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=AWL,SPF_NEUTRAL autolearn=disabled version=3.1.3 X-Original-To: caml-list@yquem.inria.fr Delivered-To: caml-list@yquem.inria.fr Received: from discorde.inria.fr (discorde.inria.fr [192.93.2.38]) by yquem.inria.fr (Postfix) with ESMTP id 733FFBC69 for ; Wed, 28 Mar 2007 19:09:55 +0200 (CEST) Received: from an-out-0708.google.com (an-out-0708.google.com [209.85.132.247]) by discorde.inria.fr (8.13.6/8.13.6) with ESMTP id l2SH9p6N009897 for ; Wed, 28 Mar 2007 19:09:54 +0200 Received: by an-out-0708.google.com with SMTP id c24so2756462ana for ; Wed, 28 Mar 2007 10:09:51 -0700 (PDT) DKIM-Signature: a=rsa-sha1; c=relaxed/relaxed; d=gmail.com; s=beta; h=domainkey-signature:received:received:message-id:date:from:to:subject:in-reply-to:mime-version:content-type:content-transfer-encoding:content-disposition:references; b=BhqlJ6NSnmklQMIewm4zxXjb3qHoOMjE3zp/KCjJltmbeLerPFgZvZKA7HQZmnP0ilQflK8noVgejqWWjNnOKMfotl0SgWDDNC+/8cO8nfM9XEvK9ikRV8MN3pPl2HkPGmmBWSOw8Bimw0gMO2aKWPWzUuCRMtIWw6pdkgpg8LA= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=beta; h=received:message-id:date:from:to:subject:in-reply-to:mime-version:content-type:content-transfer-encoding:content-disposition:references; b=cCmktkZtmoMOq9ZiRCJVZAD5zm+Kg6Jmw+eyyGLQnKsa/6/+egw08jnjx2+51KRe7wrMWpJ/JzsFIPV6peDEkqn7czSdmQX9nSR/aaKKedPHxyXaRiGmORmOXcmBos3e/KNpg8P5pKmGHeTfnWZGcyq3ZGxwUiW0Si99TI3DhZ4= Received: by 10.100.165.9 with SMTP id n9mr484672ane.1175101791369; Wed, 28 Mar 2007 10:09:51 -0700 (PDT) Received: by 10.100.111.13 with HTTP; Wed, 28 Mar 2007 10:09:51 -0700 (PDT) Message-ID: <6f9f8f4a0703281009i74927505hba3e04227f61e357@mail.gmail.com> Date: Wed, 28 Mar 2007 19:09:51 +0200 From: "Loup Vaillant" To: caml-list@yquem.inria.fr Subject: Re: [Caml-list] How must we teach lexical scope? In-Reply-To: MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline References: <6f9f8f4a0703280059m5b9af3a1t3a9541b772af98bb@mail.gmail.com> <20070328084955.GA21199@yquem.inria.fr> <6f9f8f4a0703280734p49ed0b7fk48787a8ba3a76e9e@mail.gmail.com> X-j-chkmail-Score: MSGID : 460AA15F.000 on discorde : j-chkmail score : X : 0/20 1 0.000 -> 1 X-Miltered: at discorde with ID 460AA15F.000 by Joe's j-chkmail (http://j-chkmail . ensmp . fr)! X-Spam: no; 0.00; abstraction:01 verbose:01 repetitive:01 redefined:01 redefined:01 mutable:01 28,:98 blog:98 lexical:01 lexical:01 caml-list:01 writes:01 lisp:01 precisely:01 int:01 2007/3/28, ls-ocaml-developer-2006@m-e-leypold.de : > > "Loup Vaillant" writes: > > > Personally, I think environments are about the implementation of > > lexical scope, not its specifications. Therefore, teaching them in > > the first year of a programming course is premature. I may be wrong, > > so I am trying to verify that. > > Personally I think you're wrong here. Environments (as mapping from > identifier to values) represent the context in which a given > expression must be read and interpreted (in both senses). I cannot > imagine a way to do so precisely without using a similar > abstraction. With horror I remember some learn-to-program books I read > in my youth and which tried to talk about scope by talking about > wether a identifier is "valid" or something like this: Err, I didn't receive your quotation... > horrible. Talking about free variables and environments on the other > side makes it very easy to see which parts of an expression must get > "meaning" by being interpreted in some context (environment). I find > that rather useful. > > Grasping the idea of a free variable (perhaps in an informal way) and > applying the ideas of environment(s) should take a reasonably bright > student hardly more than an hour (but I might be wrong). > > Concerning your > > > I don't understand the way were are taught lexical scope. Our > > professors used "environments", where free variable would suffice. > > (An environment is the set of defined values at a given time. The > > environment of a value is the environment of when this value is > > defined.) > > -- I'd say that environment and free variables are "dual" or > complementary concepts. One is not useful without the other. I find the concept of free variable a bit more natural, and far less verbose. > From what you write, I'm not sure, the course (at Toulouse 3) you've > been talking about is just badly structured, whether the problem is at > yours or your brothers side or whether (I suggest to consider that) not > all students are as bright as you or your brother and therefore things > can get a bit repetitive. In my second year, I took a rather special course (IUP SI, for those who know it). We students therefore came from different horizons, and the vast majority has not been exposed to any functional language yet (although many has been exposed to Pascal or C already). In less than two weeks, we almost covered the hole first semester of my first year (not a single word about environments, however). It felt reasonably fast, and no one was lagging behind. > On the other side > > > -> Where does this idea come from? I have not read a single book, as > > single article nor blog talking about environments. > > I wonder that you have not heard about environments before. Perhaps > it's not your part yet to improve teaching in that area > :-). Nonetheless: If you have a suggestion how to talk about lexical > scope or the "meaning" of an expression without resorting to > environments, I'd be interested to hear more about it. > Actually, I have. The first thing we see when learning Caml is the interactive loop (Which I believe is a good thing). So we define values one after the other. While we stick to a pure functional style, a value (be it a function or not) never, ever change. The worse we can do to it is to render it unaccessible, by defining a new value of the same name. So, to explain this session: #let a = 3;; a: int = 3 #let f x = x + a;; f: int -> int = #f 5;; -: int = 8 # let a = 451;; a: int = 451 #f 5;; -: int = 8 we just have to say: "As long as we do not redefine a value, it does not change. The function 'f' didn't change, because it has not been redefined. All happened as if the 'a' was replaced by its value at that moment, '3', in the definition of 'f'." Pretty harsh, I admit, but you get the idea. One can even explain that the value is not redefined, just covered, if needed. Better (I think) is to teach the notion of binding from the very beginning, and draw a sharp distinction between values and symbols (even if these notions are less crucial in ML than in Lisp). Then: "Values never change, but symbols can be reassigned new values. So, the function known as 'f' has not changed, even if the value know as 'a' in no longer '3'." The notion of lexical scope become critical when we begin to have free mutable variables. From that point, I think one have no choice (well, it is easier if students can understand the difference between binding and assignment). I just hope that any student can distinguish the name and the thing. Regards, Loup