Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit daab755

Browse files
committed
+signed ADD
1 parent 21c7594 commit daab755

File tree

2 files changed

+27
-2
lines changed

2 files changed

+27
-2
lines changed

‎lambdas.py‎

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
NOT = lambda a: a(FALSE)(TRUE)
1313

1414
# additional boolean operations
15-
XOR = lambda a: lambda b: a(b(FALSE)(TRUE))(b(TRUE)(FALSE))
15+
XOR = lambda a: lambda b: a(b(FALSE)(TRUE))(b(TRUE)(FALSE))
16+
XNOR = lambda a: lambda b: NOT(XOR(a)(b))
1617

1718
# arithmetic
1819
INC = lambda n: lambda a: lambda b: a(n(a)(b))
@@ -21,6 +22,7 @@
2122
DEC = lambda n: lambda f: lambda x: n(lambda g: lambda h: h(g(f)))(lambda _: x)(IDENTITY)
2223
SUB = lambda a: lambda b: b(DEC)(a)
2324
POW = lambda a: lambda b: b(a)
25+
DIFF = lambda a: lambda b: ADD(SUB(a)(b))(SUB(b)(a))
2426

2527
# numbers
2628
ZERO = FALSE
@@ -60,6 +62,15 @@
6062
ISPOS = lambda p: CAR(p)
6163
ISNEG = lambda p: NOT(CAR(p))
6264
UNSIGN = lambda p: CDR(p)
65+
SADD = lambda a: lambda b: (
66+
XNOR(CAR(a))(CAR(b))
67+
(CONS(CAR(a))(ADD(CDR(a))(CDR(b)))) # same sign
68+
(
69+
CONS # opposite sign
70+
(XOR(CAR(a))(LTE(CDR(a))(CDR(b)))) # calculate sign
71+
(DIFF(CDR(a))(CDR(b))) # calculate value
72+
)
73+
)
6374

6475
# recursive
6576
FAC = Y(

‎test_lambdas.py‎

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from lambdas import ADD, INC, MUL, POW, DEC, SUB, DIV
88
from lambdas import ISZERO, GTE, LTE, GT, LT, EQ
99
from lambdas import CONS, CAR, CDR
10-
from lambdas import SIGN, UNSIGN, NEG, ISPOS, ISNEG
10+
from lambdas import SIGN, UNSIGN, NEG, ISPOS, ISNEG, SADD
1111
from lambdas import FAC, FIB
1212
from lambdas import make_number
1313

@@ -216,5 +216,19 @@ def test_sign_checks():
216216
assert ISNEG(n) is TRUE
217217

218218

219+
@pytest.mark.parametrize('lsign, left, rsign, right, expsign, expvalue', [
220+
(TRUE, ONE, TRUE, ONE, TRUE, 2), # 1 + 1 = 2
221+
(TRUE, ONE, FALSE, TWO, FALSE, 1), # 1 - 2 = -1
222+
(FALSE, TWO, TRUE, ONE, FALSE, 1), # -2 + 1 = -1
223+
(FALSE, TWO, FALSE, ONE, FALSE, 3), # -2 - 1 = -3
224+
])
225+
def test_sadd(lsign, left, rsign, right, expsign, expvalue):
226+
lv = CONS(lsign)(left)
227+
rv = CONS(rsign)(right)
228+
res = SADD(lv)(rv)
229+
assert CAR(res) is expsign
230+
assert make_number(CDR(res)) == expvalue
231+
232+
219233
if __name__ == '__main__':
220234
pytest.main()

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /