Sha256: 468fcaf864f750b2701e9c3801d9ef922e7878d0afedf9798f237b2a4ffafd8a

Contents?: true

Size: 1.07 KB

Versions: 2

Compression:

Stored size: 1.07 KB

Contents

# frozen_string_literal: true

require_relative 'composite_term'

module MiniKraken
  module Core
    class ConsCell < CompositeTerm
      attr_reader :car
      attr_reader :cdr

      def initialize(obj1, obj2 = nil)
        @car = obj1
        @cdr = obj2
      end

      def children
        [car, cdr]
      end

      # Return true if it is an empty list, otherwise false.
      # A list is empty, when both car and cdr fields are nil.
      def null?
        car.nil? && cdr.nil?
      end

      def ==(other)
        return false unless other.respond_to?(:car)

        (car == other.car) && (cdr == other.cdr)
      end

      def eql?(other)
        (self.class == other.class) && car.eql?(other.car) && cdr.eql?(other.cdr)
      end

      def quote(anEnv)
        return self if null?

        new_car = car.nil? ? nil : car.quote(anEnv)
        new_cdr = cdr.nil? ? nil : cdr.quote(anEnv)
        ConsCell.new(new_car, new_cdr)
      end
    end # class

    # Constant representing the null (empty) list.
    NullList = ConsCell.new(nil, nil).freeze
  end # module
end # module

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
mini_kraken-0.1.06 lib/mini_kraken/core/cons_cell.rb
mini_kraken-0.1.05 lib/mini_kraken/core/cons_cell.rb