Created
November 13, 2013 19:05
-
-
Save draegtun/7454495 to your computer and use it in GitHub Desktop.
Spreadsheet in Rebol2 by Carl Sassenrath
- http://www.rebol.org/view-script.r?script=rebocalc.r
- Replicated here for nicer syntax highlighting
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
REBOL [ | |
Title: "Rebocalc" | |
Date: 19-Jun-2001 | |
Version: 1.0.0 | |
File: %rebocalc.r | |
Author: "Carl Sassenrath" | |
Purpose: {The world's smallest spreadsheet program, but very powerful.} | |
Email: %carl--rebol--com | |
library: [ | |
level: 'beginner | |
platform: [all plugin] | |
plugin: [size: 900x550] | |
type: 'tool | |
domain: [math GUI] | |
tested-under: none | |
support: none | |
license: none | |
see-also: none | |
] | |
] | |
csize: 100x20 | |
max-x: 8 | |
max-y: 16 | |
pane: [] | |
xy: csize / 2 + 1 * 1x0 | |
yx: csize + 1 * 0x1 | |
layout [ | |
cell: field csize edge none [enter face compute face/para/scroll: 0x0] | |
label: text csize white black bold center | |
] | |
;--Headings: | |
char: #"A" | |
repeat x max-x [ | |
append pane make label [offset: xy text: char] | |
set in last pane 'offset xy | |
xy: csize + 1 * 1x0 + xy | |
char: char + 1 | |
] | |
repeat y max-y [ | |
append pane make label [offset: yx text: y size: csize * 1x2 / 2] | |
yx: csize + 1 * 0x1 + yx | |
] | |
xy: csize * 1x2 / 2 + 1 | |
;--Cells: | |
cells: tail pane | |
repeat y max-y [ | |
char: #"A" | |
repeat x max-x [ | |
v: to-word join char y | |
set v none | |
char: char + 1 | |
append pane make cell [offset: xy text: none var: v formula: none] | |
xy: csize + 1 * 1x0 + xy | |
] | |
xy: csize * 1x2 / 2 + 1 + (xy * 0x1) | |
] | |
enter: func [face /local data] [ | |
if empty? face/text [exit] | |
set face/var face/text | |
data: either face/text/1 = #"=" [next face/text][face/text] | |
if error? try [data: load data] [exit] | |
if find [integer! decimal! money! time! date! tuple! pair!] type?/word :data [set face/var data exit] | |
if face/text/1 = #"=" [face/formula: :data] ; string case falls thru | |
] | |
compute: has [blk] [ | |
unfocus | |
foreach cell cells [ | |
if cell/formula [ ;probe cell/var | |
if error? cell/text: try [do cell/formula] [cell/text: "ERROR!"] | |
set cell/var cell/text | |
show cell | |
] | |
] | |
] | |
lo: layout [ | |
bx: box second span? pane | |
pad 55x0 | |
text as-is trim/auto { | |
Cells can be numbers, times, money, tuples, pairs, etc. | |
If a cell is not a scalar value, then it is treated as a string. | |
Start formulas with the = character. Any REBOL expression is valid. | |
Remember to put spaces between each item in a formula. Use ( ) where needed. | |
Refer to cells as A1 D8 E10. Example: =A1 + B1 * length? B8 | |
Example: in A1 type REBOL, in B1 type =length? a1, in C1 type =reverse copy a1 | |
Then: in D1 =checksum A1. Now, change A1 to "Amazing!" | |
In A2 type 1 + 2 (no =), in B2 type =A2. Now change A2 to 3 * 4. | |
Try: =(now/time) or =request-date or =checksum read rejoin [http://www. A1 ".com"] | |
Computation moves from top to bottom. It is non-iterative. | |
} | |
] | |
bx/pane: pane | |
view lo |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment