#NOT really very lazy..

#pipealias lazy .=>. {inspect "$h|$t"} |> {list $h [list lazy $name $t]} |r,fn/1> {upvar $name nm; pipeset nm .= {*}$fn} |> {lindex $r 0} <h/1/anyhead,t/1/anytail,name@0|
pipealias lazy .=>. {list $h [list lazy $name $t]} |r,fn/1> {upvar $name nm; pipeset nm .= {*}$fn} |> {lindex $r 0} <h/1/anyhead,t/1/anytail,name@0|

pipealias lazyfun =infun>0 |a/0/0,b/0/1,c/0/2> {list $a $b [list init {*}$c]} |> .=*  |> inspect  |h> {pipealias $name .= eval \$$name} |>  {set name} <infun/0,name/0/1,'lazy'/@0/0|


lazyfun {lazy j {a b c d e}}

#pipealias listgen =  |h/0,fn/1> {upvar $name nm; pipeset nm .= {*}$fn} |> {set h}  <l@1,name@0| 


#NOTE that not all functional languages seem to make use of cons cells - and they are arguably not required and/or not the right approach for Tcl(?)
#standard lists are likely to be more efficient. 
#
proc cons {a b} {list $a $b}
proc car {p} {lindex $p 0}
proc cdr {p} {lindex $p 1}
# "cons cell" structure (a specific type of linked-list)
proc LIST args {
    if {![llength $args]} {
        return {}
    } else {
        return [cons [lindex $args 0] [LIST {*}[lrange $args 1 end]]]
    }
}