PR# 19494 Enable the ability to anchor on an agent's result type.

Problem Report Summary
Submitter: q2santos
Category: Compiler
Priority: Medium
Date: 2018/11/05
Class: Feature Request
Severity: Serious
Number: 19494
Release: 18.7
Confidential: No
Status: Open
Responsible:
Environment: any
Synopsis: Enable the ability to anchor on an agent's result type.

Description
A map function's signature can be as trivial as the following:

map (anchor: ANY; mapper: FUNCTION [G, like anchor]): ITERABLE [like anchor]

It would be perfect if one could anchor on the function's result like this:

map (mapper: FUNCTION [G, ANY]): ITERABLE [like mapper.last_result]

Alternatively, one would have generic functions:

map [T] (mapper: FUNCTION [G, T]): ITERABLE [T]

Or contextual types as suggested by Bertrand Meyer here:
https://www.eiffel.org/doc-file/eiffel/expression_language.pdf
To Reproduce
Here's an example where it would be useful:

note
	description: "map_testers application root class"
	date: "$Date$"
	revision: "$Revision$"

class
	APPLICATION

inherit
	ARGUMENTS_32

create
	make

feature {NONE} -- Initialization

	make
			-- Run application.
		do
			-- Mapping to string:
			across
            	map (<<1, 2, 3>>, "", agent to_string (?)) as cursor
            loop
                print (cursor.item + "%N")
            end

			-- No mapping:
			across
            	map (<<1, 2, 3>>, 0, agent identity (?)) as cursor
            loop
                print (cursor.item.out + "%N")
            end
		end

	to_string (n: INTEGER): STRING
		do
			Result := "(" + n.out + ")"
		end

	identity (n: INTEGER): INTEGER
		do
			Result := n
		end

feature {NONE} -- Mapping

	map (source: ITERABLE[INTEGER]; anchor: ANY; mapper: FUNCTION[INTEGER, like anchor]): ITERABLE[like anchor]
		local
			target: ARRAYED_LIST[like anchor]
		do
			create target.make (10)
			across
            	source as cursor
            loop
                target.extend (mapper (cursor.item))
            end

            Result := target
		end

end
Problem Report Interactions