February 2010
1 post
January 2010
2 posts
2 tags
New proc syntax in 1.9
BEGIN {
puts "Ruby Version : #{RUBY_VERSION}"
}
succ = ->(x=0) { x + 1 }
p succ.call
p succ.call(2)
successor = Proc.new {|x=0| x + 1}
p successor.call
p successor.call(10)
Output
Ruby Version : 1.9.1
1
3
1
11
But thanks, I will stick with the old syntax!
2 tags
Fibers in Ruby 1.9
class Fib
include Enumerable
def initialize(stop_at)
@count = 0
@stop_at = stop_at
@first, @second = 0, 1
@fiber = Fiber.new do
loop do
@first, @second = @second, @first + @second
@count += 1
Fiber.yield @first
end
end
end
def next
@fiber.resume
end
def rewind
@first, @second = 0, 1
end
def each
loop...
December 2009
3 posts
2 tags
tap method in Ruby 1.9
str = "Hello GG"
str.tap {|x| puts "str : #{x}"}
.each_char.tap {|x| puts "each_char : #{x}"}
.sort.tap {|x| puts "sort : #{x}"}
Output
str : Hello GG
each_char : #
sort : [" ", "G", "G", "H", "e", "l", "l", "o"]
October 2009
2 posts
September 2009
2 posts
August 2009
25 posts
1 tag
Poor man's website downloader
alias wgetr="wget -rSNpk -np --execute
robots=off -U \"Mozilla/5.001 (windows; U; NT4.0; en-us)
Gecko/25250101\" $@"
1 tag
Mixins in Scheme
#lang scheme
(define person% (class object%
(init name)
(super-new)
(define current-name name)
(define/public (set-name name)
(set! current-name name))
(define/public (get-name)
current-name)))
(define (talkable-person %)
(class % (super-new)
(define/public (talk)
"blah blah")))
(define talking-person% (talkable-person...
1 tag
Interfaces in Scheme
#lang scheme
(define person-interface (interface() get-name set-name))
(define person% (class* object% (person-interface)
(init name)
(define current-name name)
(super-new)
(define/public (get-name)
current-name)
(define/public (set-name name)
(set! current-name name))
))
(define gg (new person% [name "GG"]))
(send gg get-name)
(send gg set-name "Ganesh...
1 tag
1 tag
1 tag
1 tag
Easy comment/uncomment selection in emacs
Add this to .emacs
;; Comment/Uncomment region
(global-set-key (kbd "s-/") 'comment-dwim)
Toggle comment of the selected region by pressing Apple + /
1 tag
OOP in Scheme
#lang scheme
(define student% (class object%
(init name age)
(define this-name name)
(define this-age age)
(super-new)
(define/public (get-name)
this-name)
(define/public...
1 tag
parameterized procedures in Scheme
(define fav-color (make-parameter 'blue))
(define whats-ur-fav-color?
(lambda ()
(fav-color)))
> (whats-ur-fav-color?)
blue
> (parameterize ((fav-color 'red))
(whats-ur-fav-color?))
red
1 tag
quasiquote & unquote in scheme
> (define day-of-week 'Sunday)
> (define greet
(lambda ()
(quasiquote (Today is (unquote day-of-week)))))
> (greet)
(Today is Sunday)
> (set! day-of-week 'Monday)
> (greet)
(Today is Monday)
1 tag
Enabling auto-pairs in Emacs
;; Enable auto-pair
(setq skeleton-pair t)
(global-set-key "(" 'skeleton-pair-insert-maybe)
(global-set-key "[" 'skeleton-pair-insert-maybe)
(global-set-key "{" 'skeleton-pair-insert-maybe)
(global-set-key "\"" 'skeleton-pair-insert-maybe)
(global-set-key "'" 'skeleton-pair-insert-maybe)
1 tag
Textmate like duplicate line shortcut in Emacs
;; Custom keybinding
(defun duplicate-line()
(interactive)
(move-beginning-of-line 1)
(kill-line)
(yank)
(open-line 1)
(next-line 1)
(yank)
(next-line 1))
(global-set-key (kbd "C-d") 'duplicate-line)
Now you quickly duplicate a line my pressing Ctrl+d.
Emacs - Git minor mode (Magit) →
1 tag
Continuation Passing Style in Scheme
#lang scheme
(require
(lib "trace.ss"))
(define (length list)
(if (null? list)
0
(+ (length (cdr list)) 1)))
(trace length)
(define (length-cps list)
(define (length-cps list continuation)
(if (null? list)
(continuation 0)
(length-cps (cdr list)
(lambda (v)
(continuation (+ v 1))))))
(length-cps list (lambda (v)...
1 tag
Non preemptive fibers in scheme
#lang scheme
(define fiber-list empty)
(define fiber
(lambda (fib)
(set! fiber-list (append fiber-list (list fib)))))
(define start
(lambda ()
(let ([p (car fiber-list)])
(set! fiber-list (cdr fiber-list))
(p))))
(define pause
(lambda ()
(call/cc (lambda (k)
(fiber (lambda () (k false)))
(start)))))
> (fiber (lambda () (let f ()...
1 tag
First Class continuation in Scheme
(define continuation #f)
(define (hello)
(let ([i 0])
(display "Counter initialized")
(newline)
(call/cc (lambda (k) (set! continuation k)))
(set! i (+ 1 i))
i))
> (hello)
Counter initialized
1
> (continuation)
2
> (continuation)
3
> (continuation)
4
> (continuation)
5
1 tag
Tracing stack usage/time in Scheme
(require
(lib "trace.ss"))
(define (len-iter list)
(define (len-iter list acc)
(cond
[(null? list) acc]
[else (len-iter (cdr list) (+ 1 acc))]))
(len-iter list 0))
(trace len-iter)
(define (len list)
(cond
[(null? list) 0]
[else (+ 1 (len (cdr list)))]))
(trace len)
Iterative style outperforms linear recursive style.
> (time (len (list 1 2 3 4 5)))
|(len (1...
1 tag
Syntactic extension in Scheme
It is dead simple to add a syntactic extension to Scheme. The following is an if version without the else block.
(define-syntax iff
(syntax-rules ()
[(_ predicate arg)
(if predicate arg #f)]))
> (iff true "GG")
"GG"
> (iff false "GG")
#f
Of course, you can achieve the same effect using and syntactic core form
> (and true "GG")
"GG"
> (and false "GG")
#f
1 tag
Lazy evaluation in scheme
(define lazy
(lambda (t)
(let ([val false] [flag false])
(lambda ()
(cond
[(not flag)
(begin (set! val (t))
(set! flag true))])
val))))
(define lazy-dude
(lazy (lambda()
(display "I am awake")
(newline)
"Yippee")))
> (lazy-dude)
I am awake
"Yippee"
> (lazy-dude)
"Yippee"
Enabling emacs Keybinding in Gtk Apps
echo 'gtk-key-theme-name = "Emacs"' >>~/.gtkrc-2.0
gconftool -t string --set /desktop/gnome/interface/
gtk_key_theme Emacs
Trying out Aquamacs Emacs 2.0 pre1 with the latest Cocoa Emacs 23 backend. http://aquamacs.org/download.shtml
The learned foster learning more
On seeing the world enjoy their lore
– Thirukurral
Testing from tumblr desktop widget…
Hello World
(define (hello)
(display "Hello from GG"))
(hello)