Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2008-04-01


ArcのzapとTAOの!!

| 19:07 | ArcのzapとTAOの!! - わだばLisperになる を含むブックマーク はてなブックマーク - ArcのzapとTAOの!! - わだばLisperになる

Arcのzapは、

(set x (+ x 1))

のような代入を

(zap + x 1)

のように書けるようにする。確かに代入においてこのパターンは多いかもしれない。

C等での、+=等に相当する様子。

この構文で思い出すのが、TAOの!!で、TAOでは、上記を

(!!+ !x 1)

と書ける。

!xというのがミソでどの変数に代入するかを!を付けることで指定できるので、

(let ((x nil)
      (y 42))
  (!!cons y !x))
y ;=> 42
x ;=> '(42)

ということもできる。

改めてTAOの自己代入式を検索してみたら、以前リードマクロとしてCLで作った自分のエントリが出てきてしまった。

自分の関心はなんか同じところをぐるぐる回っているような…。

QiでL-99 (P19 指定した位置でローテーションさせる)

| 18:06 | QiでL-99  (P19 指定した位置でローテーションさせる) - わだばLisperになる を含むブックマーク はてなブックマーク - QiでL-99  (P19 指定した位置でローテーションさせる) - わだばLisperになる

今迄、Qiに1+とか、1-が備え付けで存在すると思っていましたが、なんとQiでは関数名を全部大文字で書くと、下層のCLの関数が直接呼べるんだそうで、1+はCLから呼んでいたのでした。また、DEFUNや、DEFMACROで下層のCLの関数も定義可能とのこと。

(my-rotate [a b c d e f g h] 3)
\=>  [d e f g h a b c]
\

(my-rotate [a b c d e f g h] -2)
\=> [g h a b c d e f]
\

(define my-rotate
  [ ] _ -> [ ]
  Lst N -> (xappend (split Lst (+ N (length Lst)))) where (> 0 N)
  Lst N -> (xappend (split Lst N)))

(define xappend
  [H T] -> (append T  H))

GOOのdef

| 00:09 | GOOのdef - わだばLisperになる を含むブックマーク はてなブックマーク - GOOのdef - わだばLisperになる

GOOではdefを使って、

(df foo (n)
  (def x (* n 2))
  (lst x))

のように、囲いのないletのような感じで使うことができるのが面白い、と思っていたが、良く考えると、schemeでも、

(define (foo n)
  (define x (* n 2))
  (list x))

と書けば良いだけだった。

Arcでは、当初"="で

(def foo (n)
  (= x (* n 2))
  (list x))

同じことができるようにするつもりだったと7年前の試案では書いてあるが、現状のArcでは、ローカルで宣言された変数以外に代入した場合、トップレベルの値を書き換えることもある。

;; scheme
(define (foo n)
  (let ()
    (define x (* n 2)))
  (list x))

(foo 8) ;=> error

;; GOO
(df foo (n)
  (let ()
    (def x (* n 2)))
  (list x))

(foo 8) ;=> error

;; Arc
(def foo (n)
  ((fn () 
    (= x (* n 2))))
  list.x)
(foo 8) ;=> (16)

x ;=> 16