Patch title: Release 84 bulk changes
Abstract:
File: /pliant/language/basic/setfield.pli
Key:
    Removed line
    Added line
# Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License version 2
# as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# version 2 along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

abstract
  [This module introduces the ability to replace a field by a couple of reading/writing functions.] ; eol
  [If the field is named 'f', the reading function is called] ; fixed [ '. f' ] ; [and the writing function is called] ; fixed [ '. f :='] ; eol
  [Please remind that a function named] ; fixed [ '. f' ] ; [is the same as a method named] ; fixed [ 'f'] ; [.]
doc
  [Let's take an example:]
  listing
    var Array:Int a
    a size := 2
  [is compiled as:]
  listing
    var Array:Int a
    a 'size :=' 2
  [which is the same as:]
  listing
    var Array:Int a
    '. size :=' a 2


scope "/pliant/language/" "/pliant/install/"
module "/pliant/install/ring2.pli"


function try_field e extra
  arg_rw Expression e ; arg Str extra
  if e:size<>2
    return
  var Link:Expression var :> e 0
  var Link:Expression value :> e 1
  if var:size>=1 and var:0:is_pure_ident and var:0:ident<>"()"
    e might_compile_as (expression duplicate var subexpressions (expression ident var:0:ident+extra) (var 1 var:size-1) value)
    var Link:Expression ee :> expression duplicate var subexpressions (expression ident var:0:ident+extra) (var 1 var:size-1) value
    if (e might_compile_as ee)
      e:properties := ee:0:properties
      var:0:properties := ee:0:properties
  if var:ident="()" and var:size>=2 and var:1:is_pure_ident
    e might_compile_as (expression duplicate var subexpressions var:0 (expression duplicate var:1 ident var:1:ident+extra) (var 2 var:size-2) value)
    ee :> expression duplicate var subexpressions var:0 (expression duplicate var:1 ident var:1:ident+extra) (var 2 var:size-2) value
    if (e might_compile_as ee)
      e:properties := ee:1:properties
      var:1:properties := ee:1:properties


public

  meta ':=' e
    strong_definition
    try_field e " :="

  meta ':>' e
    strong_definition
    try_field e " :>"