All pastes #535748 Raw Edit

Betterave

public ruby v1 · immutable
#535748 ·published 2007-06-04 05:02 UTC
rendered paste body
#!/usr/bin/ruby## Betterave -- Programmation fonctionnelle obscure#class Source	attr_reader :index, :stuff	def initialize(stuff)		@stuff = stuff		@index = -1		@vars = Hash.new(0)		@strings = []		@tacks = []	end	def oops(mess)		print mess		exit 1	end	def parse()		@index += 1		if @index >= @stuff.length then			exit		end		case @stuff[@index,1]		# Commentaires		when "~"			temp = @stuff.index("~",@index + 1)			if temp == nil then				oops "Unmatched comment!\n"			end			@index = temp		# Opérations mathématiques de base		when /\d/			return @stuff[@index,1].to_i		when "+"			return parse() + parse()		when "-"			return parse() - parse()		when "*"			return parse() * parse()		when "/"			return parse() / parse()		when "%"			return parse() % parse()		when "="			return parse() == parse() ? 1 : 0		when "<"			return parse() < parse() ? 1 : 0		when ">"			return parse() > parse() ? 1 : 0		# Manipulation de strings (léopard)		when "\""			temp = @stuff.index("\"", @index + 1)			if temp == nil then				oops "Unmatched string!\n"			end			@strings << @stuff[ (@index + 1) ... temp ]			@index = temp			return @strings.length		when "#"			temp = parse()			if temp < 0 or temp >= @strings.length then				return -1			else				@strings[temp] << parse().to_s			end		when "&"			temp = parse()			if temp < 0 or temp >= @strings.length then				return -1			else				char = parse()				unless char < 0 or char > 255 then					@strings[temp] << char.chr				end				return char			end		when "\\"			temp = parse()			if temp < 0 or temp >= @strings.length then				return -1			else				if @strings[temp].empty? then					return -1				else					char = @strings[temp][0]					@strings[temp] = @strings[temp][1..-1]					return char				end			end		when "_"			temp = parse()			if temp < 0 or temp >= @strings.length then				return -1			else				@strings.delete_at(temp)				return temp			end		# Structure		when "["			@tacks << @index		when "|"			temp = parse()			if temp != 0 then				if @tacks.length == 0 then					@index = -1				else					@index = @tacks.last				end			else				endtack = @stuff.index("]", @index)				if endtack == nil then					oops "Unmatched tack!\n"				end				@tacks.pop				@index = endtack			end		when "?"			if parse() == 0 then				ifelse = @stuff.index("!", @index)				if ifelse == nil then					oops "Unmatched if!\n"				end				@index = ifelse			end		when "@"			exit		# Input		when ":"			return gets.to_i		when ";"			temp = @strings.length			@strings << gets			return temp		# Output		when "."			temp = parse()			print temp			return temp		when ","			temp = parse()			if temp < 0 or temp > 255 then				return 0			end			print temp.chr			return temp		when "$"			temp = parse()			if temp < 0 or temp >= @strings.length then				return -1			else				string = @strings[temp]				unless string == nil then					print string				end				return temp			end		# Manipulation de variables		when /[A-Z]/			@vars[@stuff[@index,1]] = parse()		when /[a-z]/			return @vars[@stuff[@index,1].upcase]		else			return parse()		end	endendsource = Source.new(readlines.join)while source.index < (source.stuff.length - 1)	source.parse()end