#!/usr/bin/perl use strict; use warnings; package LispTree; use Moose; use overload '""' => \&to_s; has 'op' => ( is => 'ro' ); has 'l' => ( is => 'rw' ); has 'r' => ( is => 'rw' ); sub to_s { my $self = shift; my $o = '(' . $self->op . ' '; $o .= ref $self->l ? $self->{l}->to_s : $self->l; $o .= ' '; $o .= ref $self->r ? $self->{r}->to_s : $self->r; $o .= ')'; return $o; } sub to_rpn { my $self = shift; my $o = ref $self->l ? $self->{l}->to_rpn : $self->l; $o .= ' '; $o .= ref $self->r ? $self->{r}->to_rpn : $self->r; $o .= ' ' . $self->op; return $o; } package main; my $root = LispTree->new( op => '+' ); $root->l(LispTree->new( op => '+', l => 6, r => 6 )); my $leaf = LispTree->new( op => '*', l => 15, r => 2 ); $root->r($leaf); print $root->to_rpn . "\n";