2012년 7월 9일 월요일

list_entry 매크로

#define list_entry(ptr, type, member) \
  ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))

리눅스 커널에 사용된 링크드리스트에서 제공하는 매크로. list_node 포인터로부터 원래 구조체의 포인터를 얻기 위해 사용한다.

2011년 11월 3일 목요일

Arithmetic on Functions


(sin 2.5)
#| .5984721441039565 |#


(square 2.5)
#| 6.25 |#


((+ sin square) 2.5)
#| 6.848472144103956 |#


((+ (square sin) (square cos)) 2.5)
#| 1. |#




Jerald Sussman 이 2011년 Strange Loop에서 발표한 자료에 위와 같은 예제가 살짝 소개된다. 이렇게 하려면 +를 재정의해줘야 겠지만, 이렇게 할 수 있다는 것이.. 흠..


그러나 J에서는 이미 아무 문제 없이 가능한 이야기이다.


   cos=:2&o.
   sin=:1&o.
   square=:*:
   sin 2.5
0.598472
   square 2.5
6.25
   (sin + square) 2.5
6.84847
   ( square@sin + square@cos ) 2.5
1





참고 1. https://thestrangeloop.com/sessions/we-really-dont-know-how-to-compute

2011년 10월 12일 수요일

define extern

#define extern
#include "externs.h"

externs.h에 선언된 extern 변수의 정의위치를 찾으려는데 도저히 찾을 수 없는가? 위처럼 되어 있지는 않은지 찾아보라. 누군가는 이렇게라도 중복을 제거하고 싶었을지 모른다. (혹시 따라하는 사람 없겠지?)

2011년 9월 19일 월요일

primes less than 100

(-. c e. ,/ c */ c) # c =. }. >: i. 100

100보다 작은 소수를 출력한다. 아... 어렵네. c는 임시변수.

2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

2011년 9월 16일 금요일

average = sum divided by count

average =. +/ % # average 1 2 3 4 5 3 김창준 씨를 통해서 알게된 J라는 언어는 참 특이한 언어다. 기존에 알고 있던 프로그래밍의 틀을 깬다고 해야 하나? 가끔씩 매뉴얼을 들여다보고 도전해보지만 늘 어렵다. ㅠ.ㅠ

2011년 9월 8일 목요일

no comments

re.sub(r"(?s)/\*.*?\*/", "", source)
re.sub(r"//.*", "", source)

주석을 제거한 코드가 필요하여 작성한 코드이다. 정확하지는 않지만 그럭저럭 쓸만하다. 이 두 줄을 작성하는데도 많은 시행착오를 겪어야 했다. 완성하고 나면 뿌듯하지만 ...

2011년 9월 7일 수요일

bsearch

void * bsearch ( const void * key, const void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) );

잘 쓰이지는 않지만 이미 구현되어 있다! C의 한계 덕분에 인자는 다섯 개나 되고, 그 중 두 개는 void *, 하나는 void* 두개를 받는 함수 포인터라는 정말 못생긴 모양을 갖게 되었지만... 직접 구현하거나 구글에서 출처를 알 수 없는 코드를 복사하여 붙여넣기보다는 그냥 구현되어 있는 것을 이용하는 것은 어떨까?

--코드리뷰하다가