view code/dotScanner.lm @ 23:5ded24518dc5

Add library functions from mike00.lm to dotScanner.lm. Add some code to process map state into a "grid" structure and make a version for visited state.
author Michael Pavone <pavone@retrodev.com>
date Fri, 25 Jul 2014 22:37:53 -0700
parents 1c6d4f2642d0
children ec0b74f4f2d9
line wrap: on
line source

#{
	length <- :lst {
		len <- []
		while: { not: (lst isInteger?)} do: {
			lst <- lst tail
			len <- len + 1
		}
		len
	}
	
	reverse <- :lst {
		new <- []
		while: { not: (lst isInteger?)} do: {
			new <- (lst value) | new
			lst <- lst tail
		}
		new
	}

	split:at <- :lst :pos {
		first <- []
		i <- 0
		while: { i < pos } do: {
			first <- (lst value) | first
			lst <- lst tail
			i <- i + 1
		}
		#[(reverse: first) lst]
	}
	
	map <- :lst fun {
		new <- []
		while: { not: (lst isInteger?) } do: {
			new <- (fun: (lst value)) | new
			lst <- lst tail
		}
		reverse: new
	}
	
	fold:with <- :lst acc :fun {
		while: { not: (lst isInteger?) } do: {
			acc <- fun: acc (lst value)
			lst <- lst tail
		}
		acc
	}
	
	filter <- :lst pred {
		new <- []
		while: { not: (lst isInteger?) } do: {
			if: (pred: (lst value)) {
				new <- (lst value) | new
			} else: {}
			lst <- lst tail
		}
		reverse: new
	}
	
	makeTree:size <- :lst :size {
		ret <- 0
		sub <- 0
		half <- size / 2
		if: size = 2 {
			ret <- #[(lst value) ((lst tail) value)]
		} else: {
			if: size = 1 {
				ret <- lst
			} else: {
				sub <- split: lst at: half
				ret <- #[
					(makeTree: (sub value) size: half)
					(makeTree: (sub tail) size: size-half)
				]
			}
		}
		ret
	}
	
	makeTree <- :lst {
		size <- lst length
		#[size (makeTree: lst size: size)]
	}
	
	get:fromTree:size <- :idx :tree :size {
		print: #[1 tree size]
		ret <- 0
		half <- size / 2
		if: size <= 2 {
			if: idx = 0 {
				ret <- tree value
			} else: {	
				ret <- tree tail
			}
		} else: {
			if: idx < half {
				ret <- get: idx fromTree: (tree value) size: half
			} else: {
				ret <- get: idx-half fromTree: (tree tail) size: size-half
			}
		}
		ret
	}
	
	get:fromTree <- :idx :tree {
		size <- tree value
		print: #[0 size]
		get: idx fromTree: (tree tail) size: size
	}
	
	treeMap:size <- :tree fun :size {
		ret <- 0
		half <- size / 2
		if: size = 2 {
			ret <- #[(fun: (tree value)) (fun: (tree tail))]
		} else: {
			if: size = 1 {
				ret <- #[(fun: (tree value)) 0]
			} else: {
				ret <- #[
					(treeMap: (tree value) fun size: half)
					(treeMap: (tree tail) fun size: size-half)
				]
			}
		}
		ret
	}
	
	treeMap <- :tree fun {	
		#[(tree value) (treeMap: (tree tail) fun size: (tree value))]
	}
	
	tree:size:update:with <- :tree :size :idx :fun {
		ret <- 0
		half <- size / 2
		if: size = 2 {
			if: idx = 0 {
				ret <- #[(fun: (tree value)) (tree tail)]
			} else: {
				ret <- #[(tree value) (fun: (tree tail))]
			}
		} else: {
			if: size = 1 {
				ret <- #[(fun: (tree value)) 0]
			} else: {
				if: (idx < half) {
					ret <- #[
						(tree: (tree value) size: half update: idx with: fun)
						(tree tail)
					]
				} else: {
					ret <- #[
						(tree value)
						(tree: (tree tail) size: size-half update: idx-half with: fun)
					]
				}
			}
		}
		ret
	}
	
	tree:update:with <- :tree :idx :fun {
		#[(tree value) (tree: (tree tail) size: (tree value) update: idx with: fun)]
	}
	
	tree:set:to <- :tree :idx :val {
		tree: tree update: idx with: :el { val }
	}
	
	grid:update:with <- :grid :pos :fun {
		x <- pos value
		y <- pos tail
		tree: grid update: y with: :row {
			tree: row update: x with: fun
		}
	}
	
	grid:set:to <- :grid :pos :val {
		grid: grid update: pox with: :el { val }
	}
	
    /*
	ListGet <- :cell idx {
		if: idx = 0 {cell value} else: {
        ListGet: (cell tail) (idx - 1)
		}
	}
	TupGet <- :cell depth size {
		if: idx = 0 {cell value} else: { 
        if: size = 1 {cell tail} else: {  // warning, out-of-bounds idx will return a value!
		TupGet: (cell tail) (idx - 1) (size - 1)
		}}
	}

	// rowmajor lists
	GridGet <- :x y w h{
		ListGet
		...
	}
    */
	//scanFor <- :target depth visited{
	//}
	counterLoad <- 4
	step <- :myState world {
		grid <- makeTree: (map: (world value) :row { makeTree: row })
		lmState <- (world value) tail
		myLoc <- (lmState tail) value
		
		
		visited <- treeMap: grid :el { 0 }
		visited <- tree: visited set: myLoc to: 1
		
		
		
		//myPos <- 
		path <- [3 1 3 1] //scanFor: 2 3 [myPos]
		move <- myState value
		counter <- (myState tail) - 1
		if: counter = 0 {
			move <- move + 1
			counter <- counterLoad
			if: move = 4 {
				move <- 0
			} else: {}
		} else: {}
		#[0 ((path tail) value)]
	}
	
	main <- :initWorld mystery {
		#[0 step]
	}
}

//does not work: 
//someListOrTup get: 0
//lambdaman program (step function) faulted TagMismatch